保姆級教程,帶你認識大數據,從0到1搭建 Hadoop 集群

大數據簡介,概念部分

概念部分,建議之前沒有任何大數據相關知識的朋友閱讀

大數據概論

什麼是大數據

大數據(Big Data)是指無法在一定時間範圍內用常規軟件工具進行捕捉、管理和處理的數據集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信息資產

粗略解讀以下

  • 常規軟件工具:例如 JavaEE、Mysql(500-1000w數據)即使構建 Mysql 集群,集群中節點的數量也不是無限增加的。
  • 海量、高增長率:數據本身基數大,每天新加入的數據也多
  • 多樣化:除了文本數據外,還有圖片、視頻等數據

主要解決海量數據的存儲海量數據的分析計算問題

大數據的特點

  1. 大量:根據 IDC 「數字宇宙」 報告 預計到2020年,全球數據使用量將達到35.2ZB
  2. 高速:在海量的數據面前,處理數據的效率就是企業的生命
  3. 多樣
    • 結構化數據:數據庫、文本為主
    • 非結構化數據:網絡日誌、音頻、視頻、圖片、地理位置信息
  4. 低價值密度:價值密度的高低與數據總量的大小成反比,快速對有價值數據「提純」

大數據應用場景

  1. 物流倉儲:大數據分析系統助力商家精細化運營、提升銷量、節約成本
  2. 零售:分析用戶消費習慣,為用戶購買商品提供方便,從而提升商品銷量
    • 國外案例:紙尿褲+啤酒,分析過往的商超訂單發現紙尿褲+啤酒同時出現的概率很高,因此將這兩樣物品放在一起,刺激更多的人消費
  3. 旅遊:深度結合大數據能力與旅遊行業需求,共建旅遊產業智慧管理、智慧服務和智慧營銷的未來
  4. 商品廣告推薦:給用戶推薦可能喜歡的商品(千人千面)
  5. 保險、金融、房地產:數據挖掘、風險預測

大數據發展前景

十八大:實施國家大數據發展戰略

十九大:推動互聯網、大數據、人工智能和實體經濟深度融合

Hadoop

簡介

Hadoop 是 Apache 基金會開發的分佈式系統基礎架構,主要解決海量數據的存儲和分析計算問題。與大數據所研究的方向一樣。廣義上來說,Hadoop通常指的是 Hadoop 的生態圈。我理解就和 Javaer 常說的 Spring Cloud 一樣,並不特指一個技術,而是一些攜手解決一個複雜問題的集合

創始人 Doug Cutting ,借鑒谷歌三篇論文

GFS —> HDFS 解決了數據存儲的問題

Map-Reduce —> MR 解決了數據分析計算的問題

BigTable —> HBase NoSQL數據庫

三大發行版本

Apache

最原始,最基礎版本,適合入門學習

Cloudera

CDH版本、2008年成立,2009年Doug Cutting 加盟。 主要在大型互聯網企業中使用,免費使用,付費維護

Hortonworks

2011年成立,文檔較好,市場份額小

優勢

  • 高可靠性:底層維護多個數據副本(default 3)
  • 高擴展性:在集群間分配任務數據,可方便的擴展數以千計的節點
  • 高效性:在MapReduce的思想下,Hadoop是並行工作的
  • 高容錯性:能夠自動將失敗的任務重新分配

組成

image-20201201223419081

2.x 時代的 Hadoop 將數據的計算分析和資源調度進行解耦,獨立出來 Yarn 專門負責 CPU、內存、硬盤、網絡等資源的調度

HDFS 架構概述

  • NameNode(nn) 存儲文件的元數據,如文件名,目錄結構,文件屬性(生成時間,副本數,文件權限)以及每個文件的塊列表和塊所在的 DataNode 等
  • DataNode(dn) 在本地文件系統存儲文件塊數據,以及塊數據的校驗和
  • Secondary NameNode(2nn) 監控HDFS狀態的輔助後台程序,每隔一段時間獲取HDFS元數據的快照

YARN 架構概述

image-20201201225516944

MapReduce 架構概述

MapReduce 將計算過程分為兩個階段:Map 和 Reduce

  1. Map 階段並行處理數據
  2. Reduce 階段對 Map 結果進行匯總

大數據技術生態體系

image-20201201231750466

安裝

建議在新的虛擬機完成,方便後續克隆、搭建集群

安裝 hadoop 之前建議設置 linux IP 為靜態 IP、必須安裝 Java 以及配置環境變量、建議關閉防火牆(自己測試的時候)

虛擬機網絡配置

我自己的網絡配置 vim /etc/sysconfig/network-scripts/ifcfg-ens33, 網絡採用 NAT 方式。一般 NAT模式對應的虛擬網卡是 vmnet8,

主機中 vmnet8 對應的虛擬網卡 ipv4 地址需要設置靜態 IP, 並且該 IP 與虛擬機網絡編輯器中 vmnet8 的 子網IP 、 以及下面配置中 IPADDR,GATEWAY,DNS1 前三段要一致。且第四段不能一樣。如圖所示

  1. 主機虛擬網卡配置

image-20201216222815408

  1. 虛擬機網絡編輯器

image-20201216223155226

  1. 虛擬機網絡配置文件
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5f66ee29-f43f-4761-abec-bd0656e25e09"
DEVICE="ens33"
ONBOOT="yes"
IPV6_PRIVACY="no"

IPADDR="192.168.100.104"
GATEWAY="192.168.100.2"
DNS1="192.168.100.2"

我安裝的版本是 2.10.1

下載上面的壓縮包在 linux 服務器,解壓後放在 /opt/module 目錄下

配置環境變量

export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

刷新 profile 文件

source /etc/profile

測試安裝結果

# hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME]
  CLASSNAME            run the class named CLASSNAME
 or
  where COMMAND is one of:
  fs                   run a generic filesystem user client
  version              print the version
  jar <jar>            run a jar file
                       note: please use "yarn jar" to launch
                             YARN applications, not this command.
  checknative [-a|-h]  check native hadoop and compression libraries availability
  distcp <srcurl> <desturl> copy file or directories recursively
  archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive
  classpath            prints the class path needed to get the
                       Hadoop jar and the required libraries
  credential           interact with credential providers
  daemonlog            get/set the log level for each daemon
  trace                view and modify Hadoop tracing settings

Most commands print help when invoked w/o parameters.

運行模式

  • 本地模式,單節點 Java 進程,一般用於調試

  • 偽分佈式模式,適合計算機性能不是非常強勁的朋友使用(16GB內存以下)

  • 分佈式

本地模式

如果你的 Hadoop 包是從官方下載的正式包,默認情況下。Hadoop 配置的都是本地運行模式

官方 Grep 案例

//hadoop.apache.org/docs/r2.10.1/hadoop-project-dist/hadoop-common/SingleCluster.html

$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar grep input output 'dfs[a-z.]+'
$ cat output/*

出現下面的內容,則本地模式運行成功

1       dfsadmin

正如我們看到的那樣

官方 WordCount 案例

  1. 創建輸入目錄(源目錄) wcinput , 新建文本文件 wc.txt

    # mkdir wcinput
    # cd wcinput/
    # touch wc.input
    # vim wc.input
    
    lvbanqihao ake libai libai
    hanxin wuya hanxin zhangsan
    direnjie guanyu guanyu zhangfei
    chengjisihan jing
    
  2. 執行 examples 中的 wordcount 功能

    # hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount wcinput/ wcoutput
    
  3. 查看結果

    # cat wcoutput/*
    
    ake     1
    chengjisihan    1
    direnjie        1
    guanyu  2
    hanxin  2
    jing    1
    libai   2
    lvbanqihao      1
    wuya    1
    zhangfei        1
    zhangsan        1
    

偽分佈式模式

修改 ${HADOOP_HOME}/etc/hadoop 下的配置文件。含義見注釋,

HDFS的配置和操作

配置
core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
    <value>hdfs://linux101:9000</value>
</property>

<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/module/hadoop/data/tmp</value>
</property>
hdfs-site.xml
<!-- 指定HDFS副本的數量 -->
<property>
	<name>dfs.replication</name>
	<value>1</value>
</property>
hadoop-env.sh

修改 JAVA_HOME 路徑為 JDK 路徑

  1. 通過 echo $JAVA_HOME 命令顯示已配置的 JAVA_HOME 路徑。複製
  2. vim 打開 hadoop-env.sh 修改
啟動集群
  • 格式化 NameNode

僅在第一次啟動需要(格式化NameNode,會產生新的集群id,導致NameNode和DataNode的集群id不一致,集群找不到已往數據。所以,格式NameNode時,一定要先刪除data數據和log日誌,然後再格式化NameNode)

bin/hdfs namenode -format
  • 啟動 NameNode
sbin/hadoop-daemon.sh start namenode
  • 啟動 DataNode
sbin/hadoop-daemon.sh start datanode
查看集群
  1. 首先通過 JDK 的 jps 命令查看 NameNode 和 DataNode 進程是否啟動
  2. 接着訪問該服務器的 50070 端口(確保防火牆已經關閉,並且主機和虛擬機可以互相訪問)
  3. 查看日誌文件 ${HADOOP_HOME}/logs
操作集群

在HDFS文件系統上創建一個input文件夾

bin/hdfs dfs -mkdir -p /user/keats/input

將測試文件內容上傳到文件系統上

bin/hdfs dfs -put wcinput/wc.input /user/keats/input/

查看上傳的文件是否正確

bin/hdfs dfs -ls  /user/keats/input/
bin/hdfs dfs -cat  /user/keats/ input/wc.input

運行 MapReduce 程序

bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/keats/input/ /user/keats/output

查看輸出結果

bin/hdfs dfs -cat /user/keats/output/*

將測試文件內容下載到本地

hdfs dfs -get /user/keats/output/part-r-00000 ./wcoutput/

刪除輸出結果

hdfs dfs -rm -r /user/keats/output

YARN的操作和配置

配置

配置 JAVA_HOME

${HADOOP_HOME}/etc/hadoop/

  • yarn-env.sh
  • mapred-env.sh

配置 yarn-site.xml

<!-- Reducer獲取數據的方式 -->
<property>
 		<name>yarn.nodemanager.aux-services</name>
 		<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>linux101</value>
</property>

配置: (對mapred-site.xml.template重新命名為) mapred-site.xml

mv mapred-site.xml.template mapred-site.xml

<!-- 指定MR運行在YARN上 -->
<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
</property>
啟動集群
  • 啟動前必須保證NameNode和DataNode已經啟動

  • 啟動ResourceManager

    sbin/yarn-daemon.sh start resourcemanager
    
  • 啟動NodeManager

    sbin/yarn-daemon.sh start nodemanager
    

配置歷史服務器

為了查看程序的歷史運行情況,需要配置一下歷史服務器。具體配置步驟如下

  1. 配置 mapred-site.xml
<!-- 歷史服務器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>linux101:10020</value>
</property>

<!-- 歷史服務器web端地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>linux101:19888</value>
</property>
  1. 啟動歷史服務器
sbin/mr-jobhistory-daemon.sh start historyserver
  1. jps 查看歷史服務器是否啟動

  2. 查看JobHistory //linux101:19888/jobhistory

配置日誌的聚集

日誌聚集概念:應用運行完成以後,將程序運行日誌信息上傳到HDFS系統上。

日誌聚集功能好處:可以方便的查看到程序運行詳情,方便開發調試。

注意:開啟日誌聚集功能,需要重新啟動NodeManager 、ResourceManager和HistoryManager

配置 yarn-site.xml
<!-- 日誌聚集功能使能 -->
<property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
</property>

<!-- 日誌保留時間設置7天 -->
<property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
</property>
重啟 NodeManager 、ResourceManager和HistoryManager

沒有 restart 命令,只能先關後開 或者自己寫個腳本

關閉

sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/mr-jobhistory-daemon.sh stop historyserver

關閉完成後,執行 jps 進行驗證

打開

sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/mr-jobhistory-daemon.sh start historyserver
測試

刪除HDFS上已經存在的輸出文件

bin/hdfs dfs -rm -R /user/keats/output

執行 wordcount

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/keats/input /user/keats/output

查看日誌 //linux101:19888/jobhistory

配置文件說明

Hadoop配置文件分兩類:默認配置文件和自定義配置文件,只有用戶想修改某一默認配置值時,才需要修改自定義配置文件,更改相應屬性值

默認配置文件
要獲取的默認文件 文件存放在Hadoop的jar包中的位置
[core-default.xml] hadoop-common-2.7.2.jar/ core-default.xml
[hdfs-default.xml] hadoop-hdfs-2.7.2.jar/ hdfs-default.xml
[yarn-default.xml] hadoop-yarn-common-2.7.2.jar/ yarn-default.xml
[mapred-default.xml] hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml
自定義配置文件

core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四個配置文件存放在$HADOOP_HOME/etc/hadoop這個路徑上,用戶可以根據項目需求重新進行修改配置

**完全分佈式

克隆虛擬機

一般都通過克隆虛擬機的方式來模擬多台物理機,去模擬完全分佈式。(錢多任性的土豪除外)

  • 首先確保被克隆虛擬機以及配置靜態IP、安裝 JDK、關閉防火牆、配置好了 hosts 文件

  • 需要克隆 3 台虛擬機

  • ip 對應着 102、103、104

  • 更改主機名, centos7 使用這個命令: hostnamectl set-hostname linux103

  • 另外 vmware15 + centos7 在修改 IP 並重啟後, mac 地址會自動變化,這個不用手動修改(視頻中 centos6 老師是手動改的)

全部搞定後,主機通過 moba 是可以通過虛擬機主機名連接任何一個虛擬機的(主機的 hosts 文件也需要配置)

安裝 JDK(scp 命令學習)

scp(secure copy)安全拷貝

這塊其實按照我剛才的克隆操作,jdk 已經安裝配置好。但是視頻中老師是克隆的空虛擬機。我想大概是主要為了教大家 scp (secure copy) 命令

scp -r [username@hostname1:]/x/xxx [username@hostname2:]/x/xxx

表示安全的從 hostname1 遞歸拷貝文件到 hostname2 服務器。

其中 [username@hostname1:] 表示可以省略,省略的時候表示當前服務器本地的文件夾/文件。username 表示遠程主機的用戶名,hostname 表示遠程主機的主機名

rsync 遠程同步工具

與 scp 不同的地方有兩處

一是該工具僅同步差異的文件。相同的文件不做操作

二是該工具只能操作本機和另外一台機器之間的同步,不能操作兩個其他服務器

注意:如果本機文件路徑對應的是一個文件,而外部機器對應的是一個不存在的文件夾。則該文件內容會被拷貝成文件夾名稱的文件

rsync -rvl /x/xxx [username@hostname2:]/x/xxx
選項 功能
-r 遞歸
-v 顯示複製過程
-l 拷貝符號連接

xsync集群分髮腳本

學會了 rsync 命令之後,就可以進行集群中兩個服務器之間的文件同步了,但是對於正式環境中動輒幾十成百上千台服務器來說,手敲命令同步文件肯定不現實。因此需要寫一個分發命令的腳本

該腳本會讀取輸入腳本後的第一個參數(要分發的文件所在目錄)

在當前用戶目錄下,如果是 root 則在 root 目錄下創建 bin 文件夾,然後創建 xsync 文件,內容如下

#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi

#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 獲取當前用戶名稱
user=`whoami`

#5 循環
for((host=103; host<105; host++)); do
        echo ------------------- linux$host --------------
        rsync -rvl $pdir/$fname $user@linux$host:$pdir
done

修改腳本具有可執行權限 chmod +x xsync

集群配置

集群部署規劃

  1. NameNode 和 SecondaryNameNode 佔用的內存是相當的。比較耗內存。因此需要分開
  2. ResourceManager 也比較耗內存
linux102 linux103 linux104
HDFS NameNode DataNode DataNode SecondaryNameNode DataNode
YARN NodeManager ResourceManager NodeManager NodeManager

配置集群

核心配置文件 core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
		<name>fs.defaultFS</name>
      <value>hdfs://linux102:9000</value>
</property>

<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/module/hadoop/data/tmp</value>
</property>

HDFS配置文件

配置hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8
配置hdfs-site.xml
<property>
		<name>dfs.replication</name>
		<value>3</value>
</property>

<!-- 指定Hadoop輔助名稱節點主機配置 -->
<property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>linux104:50090</value>
</property>

YARN配置文件

配置yarn-env.sh
vi yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8
配置yarn-site.xml
<!-- Reducer獲取數據的方式 -->
<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>linux103</value>
</property>

MapReduce配置文件

配置mapred-env.sh
vi mapred-env.sh

export JAVA_HOME=/opt/module/jdk1.8
配置mapred-site.xml

在該文件中增加如下配置

<!-- 指定MR運行在Yarn上 -->

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
在集群上分發配置好的Hadoop配置文件

xsync /opt/module/hadoop/

查看文件分發情況

cat /opt/module/hadoop/etc/hadoop/core-site.xml

集群單點啟動

如果集群是第一次啟動,需要格式化NameNode . 如果格式化遇到問題,需要重新排查問題後,重新格式化

因為我的虛擬機在複製之前,做過偽分佈式的測試。殘留了 data logs 目錄,需要刪除三個虛擬機上的 data/ logs/ 目錄,如果你是按照我的步驟走的,也需要統統刪除後,再執行格式化操作

hadoop namenode -format

之後啟動三個節點的 102 節點的 namenode 和 三個節點的 datanode, 打開 linux102:50070 查看是否啟動成功

配置ssh登錄

img

生成公鑰和私鑰,進入當前用戶根目錄下的 .ssh 目錄,我使用的 root 用戶

ssh-keygen -t rsa

將公鑰拷貝到要免密登錄的目標機器上

ssh-copy-id linux102
ssh-copy-id linux103
ssh-copy-id linux104

對於當前機器(例如 Linux102)通過 ssh 訪問自己時,也是需要密碼的。想要無秘訪問也需要將自己的公鑰追加到自己的認證文件後面

ssh文件夾下(~/.ssh)的文件功能解釋

known_hosts 記錄ssh訪問過計算機的公鑰(public key)
id_rsa 生成的私鑰
id_rsa.pub 生成的公鑰
authorized_keys 存放授權過得無密登錄服務器公鑰

群起集群

配置slaves

cd /opt/module/hadoop/etc/hadoop/
vim slaves

配置所有 datanode 服務器,不允許有空格

linux102
linux103
linux104

分發給 103 102

xsync slaves

啟動集群

sbin/start-dfs.sh

關閉集群

sbin/stop-dfs.sh

啟動YARN

老師視頻里提到必須使用 103 節點起,我實測 2.10.1 版本是可以在 102 服務器起的,不知是 sh 文件更新還是 root 賬戶的原因

sbin/start-yarn.sh

Web端測試 SecondaryNameNode

瀏覽器中輸入://linux104:50090/status.html

測試集群

上傳小文件

hdfs dfs -put wcinput/wc.input /

上傳大文件

hdfs dfs -put /opt/software/hadoop-2.10.1.tar.gz /

大文件佔了多個 block,如果下載的話多個塊又會被合併下載下來

image-20201217231439569

實際文件存儲在 ${HADOOP_HOME}/data/tmp 路徑下的子子子子子子目錄中,感興趣的讀者可以進去看看

/opt/module/hadoop/data/tmp/dfs/data/current/BP-1473062949-192.168.100.102-1608214270058/current/finalized/subdir0/subdir0

集群時間同步

時間服務器配置

  1. 檢查 ntp 是否安裝 rpm -qa|grep ntp 機器都是克隆的,查下 102 就可

    ntp-4.2.6p5-10.el6.centos.x86_64
    fontpackages-filesystem-1.41-1.1.el6.noarch
    ntpdate-4.2.6p5-10.el6.centos.x86_64
    
  2. 修改 ntp 配置文件

    1. 授權局域網網段上的所有機器可以從這台機器上查詢和同步時間 vim /etc/ntp.conf

    2. 當該節點丟失網絡連接,依然可以採用本地時間作為時間服務器為集群中的其他節點提供時間同步

      # 打開這段注釋,將 IP 第三段改成自己虛擬機局域網第三段
      restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap
      
      # 添加下面的內容:當該節點丟失網絡連接,依然可以採用本地時間作為時間服務器為集群中的其他節點提供時間同步
      server 127.127.1.0
      fudge 127.127.1.0 stratum 10
      
  3. 修改 /etc/sysconfig/ntpd 文件,讓硬件時間與系統時間一起同步

    vim /etc/sysconfig/ntpd
    
    增加內容
    SYNC_HWCLOCK=yes
    
  4. 重啟 ntpd 服務 service ntpd status 查看狀態 start 啟動

  5. 設置 ntpd 開機自啟 chkconfig ntpd on

其他服務器配置

1天1次

0 0 * * 1-7 /usr/sbin/ntpdate linux102

修改服務器時間

date -s "2017-9-11 11:11:11"

經過10分鐘等待,看時間是否同步(建議測試修改 cron 表達式,使同步間隔縮小)

date
Tags: