揭祕大數據(三)Hadoop完全分佈式模式

大數據 Hadoop HDFS 腳本語言 尚硅谷 2017-06-23

尚硅谷老師揭祕大數據第三節來了!

相關資料可訪問尚硅谷下載:http://www.atguigu.com/opensource.shtml

揭祕大數據(一)從Hadoop框架討論大數據生態

揭祕大數據(二)手把手教你Hadoop運行環境搭建

揭祕大數據(三)Hadoop完全分佈式模式

Hadoop完全分佈式模式

分析:

1)準備3臺客戶機(關閉防火牆、靜態ip、主機名稱)

2)安裝jdk

3)配置環境變量

4)安裝hadoop

5)配置環境變量

6)安裝ssh

7)配置集群

8)啟動測試集群

1. 虛擬機準備

詳見大數據(二):3-4章。

2. 主機名設置

詳見大數據(二): 5章。

3. scp

scp:安全遠程文件複製程序,基於ssh。

缺點:符號連接編程轉變成文件。

1)採用scp實現遠程文件複製

(1)將test文件拷貝到192.168.10.103這個服務器上。

[root@hadoop102 tmp]# scp –r test root@hadoop103:/opt/tmp/

(2)將192.168.10.102服務器上的文件拷貝到當前用戶下。

[root@hadoop102 opt]# scp root@hadoop103:/etc/profile /opt/tmp/

(3)實現兩臺遠程機器之間的文件傳輸(hadoop103主機文件拷貝到hadoop104主機上)

[atguigu@hadoop102 test]$ scp atguigu@hadoop103:/opt/test/haha atguigu@hadoop104:/opt/test/

4. rsync

rsync遠程同步工具,主要用於備份和鏡像。具有速度快、避免複製相同內容的特點。優點:支持符號鏈接、設備等等。

(1)查看rsync使用說明

man rsync | more

(2)文件傳輸拷貝

rsync –rvl /opt/tmp/* root@hadoop103:/op t/tmp

-r 遞歸

-v 顯示覆制過程

-l 拷貝符號連接

5. SSH無密碼登錄

1)配置ssh

(1)兩臺電腦之間切換

ssh 192.168.10.102

(2)ssh連接時出現Host key verification failed的解決方法

[root@hadoop2 opt]# ssh 192.168.10.103

The authenticity of host '192.168.10.103 (192.168.10.103)' can't be established.

RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.

Are you sure you want to continue connecting (yes/no)?

Host key verification failed.

(3)解決方案如下:

vi /etc/ssh/ssh_config

找到# StrictHostKeyChecking ask

揭祕大數據(三)Hadoop完全分佈式模式

進入vi界面後修改

StrictHostKeyChecking no #登錄時是否詢問

UserKnownHostsFile /dev/null #表示隱藏known_hosts文件

揭祕大數據(三)Hadoop完全分佈式模式

2)無密鑰配置

(1)進入到我的home目錄

cd ~/.ssh

(2)輸入:

ssh-keygen -t rsa

然後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)

(3)將公鑰拷貝到要免密登陸的目標機器上

ssh-copy-id 192.168.10.102

揭祕大數據(三)Hadoop完全分佈式模式

6. 編寫集群分發腳本xsync

分析:循環複製文件到所有節點的相同目錄下。

原始拷貝:

rsync –rvl /opt/module root@hadoop103:/opt/

期望執行命令:

xsync hadoop

具體實現:

1)在/usr/local/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 $pdir/$fname $user@hadoop$host:$pdir

echo --------------- hadoop$host ----------------

rsync -rvl $pdir/$fname $user@hadoop$host:$pdir

done

2)修改腳本 xsync 具有執行權限

[root@hadoop102 bin]# chmod a+x xsync

3)調用腳本形式: xsync 文件名稱

7. 編寫分發腳本xcall

需求:在所有主機上執行相同的命令

1)在/usr/local/bin目錄下創建xcall文件,文件內容如下:

#!/bin/bash

pcount=$#

if((pcount==0));then

echo no args;

exit;

fi

echo -------------localhost----------

$@

for((host=101; host<=108; host++)); do

echo ----------hadoop$host---------

ssh hadoop$host $@

done

2)修改腳本 xcall 具有執行權限

[root@hadoop102 bin]# chmod a+x xcall

3)調用腳本形式: xcall 操作命令

[root@hadoop102 ~]# xcall rm -rf /opt/tmp/profile

8. 基於偽分佈式部署集群

1)集群部署規劃

Hadoop102 hadoop103 hadoop104

HDFS

NameNode SecondaryNameNode

DataNode DataNode DataNode

YARN

ResourceManager

NodeManager NodeManager NodeManager

MapReduce

JobHistoryServer

2)配置文件

core-site.xml

<!-- 指定HDFS中NameNode的地址 -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://hadoop102:8020</value>

</property>

<!-- 指定hadoop運行時產生文件的存儲目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/module/hadoop-2.7.2/data/tmp</value>

</property>

Hdfs

hadoop-env.sh

export JAVA_HOME=/opt/module/jdk1.7.0_79

hdfs-site.xml

<configuration>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>hadoop104:50090</value>

</property>

</configuration>

slaves

hadoop102

hadoop103

hadoop104

yarn

yarn-env.sh

export JAVA_HOME=/opt/module/jdk1.7.0_79

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->

<!-- reducer獲取數據的方式 -->

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<!-- 指定YARN的ResourceManager的地址 -->

<property>

<name>yarn.resourcemanager.hostname</name>

<value>hadoop103</value>

</property>

</configuration>

mapreduce

mapred-env.sh

export JAVA_HOME=/opt/module/jdk1.7.0_79

mapred-site.xml

<configuration>

<!-- 指定mr運行在yarn上 -->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

3)在集群上分發以上所有文件

cd /opt/module/hadoop-2.7.2/etc/hadoop

xsync /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml

xsync /opt/module/hadoop-2.7.2/etc/hadoop/slaves

4)查看文件分發情況

xcall cat /opt/module/hadoop-2.7.2/etc/hadoop/slaves

9. 集群啟動及測試

1)啟動集群:sbin/start-dfs.sh

[root@hadoop2 hadoop-2.5.0]# jps

4166 NameNode

4482 Jps

4263 DataNode

[root@hadoop3 桌面]# jps

3218 DataNode

3288 Jps

[root@hadoop4 桌面]# jps

3221 DataNode

3283 SecondaryNameNode

3364 Jps

2)啟動yarn

sbin/start-yarn.sh

注意:Namenode和ResourceManger如果不是同一臺機器,不能在NameNode上啟動 yarn,應該在ResouceManager所在的機器上啟動yarn。

3)上傳文件到集群

上傳小文件

bin/hdfs dfs –mkdir –p /user/atguigu/tmp/conf

bin/hdfs dfs –put etc/Hadoop/*-site.xml /user/atguigu/tmp/conf

上傳大文件

[atguigu@hadoop107 hadoop-2.7.2]$ bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input

4)上傳文件後查看文件存放在什麼位置

文件存儲路徑

[atguigu@hadoop108 subdir0]$ pwd

/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0

查看文件內容

[atguigu@hadoop108 subdir0]$ cat blk_1073741825

hadoop

atguigu

atguigu

5)拼接

-rw-rw-r--. 1 atguigu atguigu 134217728 5月 23 16:01 blk_1073741836

-rw-rw-r--. 1 atguigu atguigu 1048583 5月 23 16:01 blk_1073741836_1012.meta

-rw-rw-r--. 1 atguigu atguigu 63439959 5月 23 16:01 blk_1073741837

-rw-rw-r--. 1 atguigu atguigu 495635 5月 23 16:01 blk_1073741837_1013.meta

[atguigu@hadoop107 subdir0]$ cat blk_1073741836>>tmp.file

[atguigu@hadoop107 subdir0]$ cat blk_1073741837>>tmp.file

[atguigu@hadoop107 subdir0]$ tar -zxvf tmp.file

6)下載

[atguigu@hadoop107 hadoop-2.7.2]$ bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz

7)集群測試

(1)基本測試

服務啟動,是否可用,簡單的應用

Hdfs

讀寫操作

bin/hdfs dfs –mkdir –p /user/atguigu/tmp/conf

bin/hdfs dfs –put etc/Hadoop/*-site.xml /user/atguigu/tmp/conf

bin/hdfs dfs –text /user/atguigu/tmp/conf/core-site.xml

Yarn

bin/Hadoop jar share/Hadoop/mapreduce/had…

Mapreduce

bin/yarn jar share/Hadoop/mapreduce/Hadoop*example*.jar wordcount /user/atguigu/……..

(2)性能測試

Hdfs

寫海量數據

讀海量數據

(3)監控集群

Cloudera Manager

部署安裝集群

監控集群

配置同步集群

預警。。。

10. Hadoop啟動方式

(1)各個服務組件逐一啟動

hdfs:

hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode

yarn:

yarn-daemon.sh start|stop resourcemanager|nodemanager

mapreduce

mr-historyserver-daemon.sh start|stop historyserver

(2)各個模塊分開啟動(配置ssh是前提)

hdfs:

start-dfs.sh

stop-dfs.sh

yarn:

start-yarn.sh

stop-yarn.sh

(3)全部啟動(不建議使用)

start-all.sh

stop-all.sh

11. Hadoop配置文件說明

1)Hadoop配置文件分兩類:

(1)默認配置文件:存放在相應的jar包中

core-default.xml

hdfs-default.xml

yarn-default.xml

mapred-default.xml

(2)自定義配置文件:存放在$HADOOP_HOME/etc/hadoop

core-site.xml

<!-- 指定HDFS中NameNode的地址 -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://hadoop102:8020</value>

</property>

<!-- 指定hadoop運行時產生文件的存儲目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/module/hadoop-2.7.2/data/tmp</value>

</property>

hdfs-site.xml

<!-- 指定HDFS副本的數量 -->

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

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>hadoop102</value>

</property>

mapred-site.xml

<!-- 指定mr運行在yarn上 -->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

2)整理Hadoop的所有類庫和配置文件:

(1)解壓縮hadoop.tar.gz到目錄下

(2)整理jar包

拷貝share文件夾下的所有jar到_libs下

_sources

_tests

_conf

(3)抽取所有配置文件

[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

[core-default.xml]

hadoop-mapreduce-client-core-2.7.2.jar/ core-default.xml

12. 修改本地文件存儲目錄

1)查看namenode版本

[atguigu@hadoop102 current]$ pwd

/tmp/hadoop-atguigu/dfs/name/current

[atguigu@hadoop102 current]$ cat VERSION

#Mon Apr 24 10:11:03 CST 2017

namespaceID=1596486549

clusterID=CID-2e06ee71-3f23-421b-b418-32de8273b533

cTime=0

storageType=NAME_NODE

blockpoolID=BP-1067366881-192.168.10.102-1492999863953

layoutVersion=-63

namespaceID:命名空間id

clusterID:集群id

cTime:

storageType:存儲類型

blockpoolID:

layoutVersion:

2)查看datanode版本

[atguigu@hadoop102 current]$ pwd

/tmp/hadoop-atguigu/dfs/data/current

[atguigu@hadoop102 current]$ cat VERSION

#Mon Apr 24 10:11:23 CST 2017

storageID=DS-227037ed-1c55-46c9-aed8-b19964976a76

clusterID=CID-2e06ee71-3f23-421b-b418-32de8273b533

cTime=0

datanodeUuid=45fe93b4-38a0-47f5-8235-93ffffe3df6f

storageType=DATA_NODE

layoutVersion=-56

揭祕大數據(三)Hadoop完全分佈式模式

揭祕大數據(三)Hadoop完全分佈式模式

3)查看文件存儲位置

[atguigu@hadoop102 subdir0]$ pwd

/tmp/hadoop-atguigu/dfs/data/current/BP-1067366881-192.168.10.102-1492999863953/current/finalized/subdir0/subdir0

[atguigu@hadoop102 subdir0]$ ls

blk_1073741825 blk_1073741825_1001.meta

[atguigu@hadoop102 subdir0]$ cat blk_1073741825

hadoop

hadoop

atguigu

atguigu

4)修改本地的臨時存儲目錄

(1)修改hadoop.tmp.dir

[core-site.xml]

<!-- 指定hadoop運行時產生文件的存儲目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/opt/module/hadoop-2.7.2/data/tmp</value>

</property>

(2)分發core-site.xml

xsync core-site.xml

(3)停止進程

stop-all.sh

(4)格式化

hadoop namenode -format

(5)啟動所有進程

start-all.sh

(6)重啟系統

Reboot

13. 配置集群常見問題

1)防火牆沒關閉、或者沒有啟動yarn

INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032

2)主機名稱配置錯誤

3)ip地址配置錯誤

4)ssh沒有配置好

5)root用戶和atguigu兩個用戶啟動集群不統一

6)配置文件修改不細心

7)未編譯源碼

Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032

8)datanode不被namenode識別問題

Namenode在format初始化的時候會形成兩個標識,blockPoolId和clusterId。新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識。

一旦namenode重新format後,namenode的身份標識已變,而datanode如果依然持有原來的id,就不會被namenode識別。

解決辦法,刪除datanode節點中的數據後,再次重新格式化namenode。

相關推薦

推薦中...