Hadoop(4)
完全分佈式搭建以及集羣中免密登錄的配置
文章目錄
Hadoop完全分佈式搭建
分佈式的節點分配
首先我們需要了解一下一個Hadoop集羣需要哪些節點:
在僞分佈式我們一共啓動了NameNode,DataNode,ResourceManager和NodeManager
- NameNode需要單獨在一個節點
- 其中DataNode和NodeManager需要在同一個節點上,但是一般來說,Hadoop的默認副本數量是3個,也就是說我們需要3個DataNode節點
- ResourceManager需要在同一個節點
- 除了上面介紹的這幾個結點,我們還需要一SecondaryNameNode節點
綜上,如果想要搭建一個Hadoop集羣,理論上我們需要六臺雲主機或者是虛擬機,但是由於資源有限,我們使用3臺虛擬機搭建,我們將NameNode,SecondaryNameNode和ResourceManager各搭建在一個節點上,此外每個節點再分配一個DataNode,結構如下:
分佈式配置
- 核心配置
修改每一個節點中的core-site.xml文件,將其中的namenode指定爲第一臺主機
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://host01:9000</value>
</property>
<!-- 指定Hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.7/data/tmp</value>
</property>
</configuration>
- HDFS配置
在每個節點上配置hadoop-env.sh,指定java路徑
export JAVA_HOME=/opt/jdk1.8.0_11
在每個節點上配置hdfs-site.xml
<configuration>
<!-- 指定HDFS副本的數量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--指定Hadoop SecondaryNameNode節點-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>host02:50090</value>
</property>
</configuration>
- yarn配置
在每個節點上配置yarn-env.sh,配置java路徑
export JAVA_HOME=/opt/jdk1.8.0_11
在每個節點上配置yarn-site.xml,配置,指定Reducer獲取數據的方式和ResourceManager的節點
<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>host03</value>
</property>
</configuration>
- MapReduce配置
在每個節點上配置mapred-env.sh,配置java路徑
export JAVA_HOME=/opt/jdk1.8.0_11
複製一份mapred-site.xml.template,命名爲mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
編輯mapred-site.xml,指定MapReduce運行在Yarn上
<configuration>
<!--指定mr運行在yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
啓動集羣
- 格式化hdfs
注意
一定要在NameNode上格式化hdfs!!
hdfs namenode -format
如果出現了Storage directory /opt/module/hadoop-2.7.7/data/tmp/dfs/name has been successfully formatted.
這句話,說明格式化成功!如果報錯,根據報錯信息看以下那個配置文件配置錯了,修改一下重新格式化即可
- 啓動集羣
在第一個節點(192.168.8.101)上啓動NameNode和DataNode
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
在第二個節點(192.168.8.102)上啓動SecondaryNameNode和DataNode
hadoop-daemon.sh start secondarynamenode
hadoop-daemon.sh start datanode
在第三個節點(192.168.8.103)上啓動DataNode
<Hadoop安裝目錄>/hadoop-daemon.sh start datanode
- 啓動之後使用
jps
命令檢查每個節點相應的進程是否啓動成功 - 然後在瀏覽器訪問NameNode節點的50070端口
然後點擊Datanodes
然後查看是否有3個DataNode節點
到此位置,集羣啓動成功!
免密登錄配置
剛剛我們使用3臺虛擬主機模擬了Hadoop分佈式集羣的啓動,這就已經夠麻煩了,如果有上千臺主機,不可能一個個節點的去啓動,所有我們需要一個一次性啓動所有主機的方法.
但是如果要實現只啓動一個節點,就啓動整個集羣的話,我們需要集羣中所有的主機之間都可以互相遠程訪問,但是遠程訪問其他的主機,每次都需要輸入登錄密碼,那麼有沒有一種可能實現免密登錄呢?當然可以,下面就介紹這種方法(SSH免密登錄)
SSH協議介紹
配置免密登錄就需要了解以下SSH協議,說白了就是一個遠程連接的加密協議,可以遠程連接其他主機執行shell命令
其主要的形式就是,產生一對祕鑰(假設是A和B),在主機1上,發送的消息使用祕鑰A加密,發送到主機2上,然後主機2使用祕鑰B解密,就能還原主機1上發送的內容.注意經過祕鑰A加密的消息,只能通過逾期配對的祕鑰B解密,其他的祕鑰都不可以解密,包括祕鑰A本身也不能解密它自己加密的內容,這種加密和解密使用不同祕鑰的形式叫做非對稱加密,而SSH協議就是使用的非對稱加密
非對稱加密的好處就是,被登錄的主機2只要保留祕鑰B,那麼 通過其他主機發送的消息,通過祕鑰A加密之後,除了主機2,其他人即便是是截取到了加密的信息,也不會破譯
我們把加密的祕鑰A叫做公鑰,解密的祕鑰B叫做私鑰
非對稱加密的算法不只有一個,在Linux中我們一般採用rsa算法實現非對稱加密
免密登錄的配置
- 在需要登錄的主機上生成公鑰
ssh-keygen -t rsa
然後一路回車,直到出現以下內容,其中會告訴你公鑰和私鑰的路徑
2. 查看存放祕鑰的目錄,會發現裏面已經有了公鑰和私鑰
3. 將公鑰發送給其他的主機
ssh-copy-id <其他主機名(我這裏是host02)>
然後根據提示,輸入yes
,然後輸入host02的密碼,就會提示發送成功
這個時候在host02中,查看~/.ssh
目錄
ll ~/.ssh
會發現有一個authorized_keys
的文件,這裏面存的就是剛剛發送的公鑰
- 測試登錄host02
ssh host02
如果登錄成功,說明配置成功
注意
1. ssh配置好之後,只能單方面登錄(host01->host02),如果想要host02登錄host01,就需要在host02中生成公鑰,然後發送到host01上
2. 如果host01想要通過ssh登錄自己,也需要將祕鑰給自己發送一遍
集羣中免密登錄的簡單配置
剛剛我們完成了一臺主機登錄一臺主機的免密登錄,但是我們目前只有三臺主機的話,想要每臺主機都能登錄集羣中的主機(包括自己),就需要兩兩配置,所有主機之間都需要傳輸自己的公鑰,這樣會極大的浪費時間
但是有沒有一種方法,可以很快的實現集羣中的兩兩登錄呢?答案當然是有的,主要思想就是,首先在其中一臺主機上實現通過登錄自己,然後再把這臺主機上的.ssh/
目錄拷貝到其他主機的相同目錄
這樣每臺主機的公鑰和私鑰都是一樣的,也就是說,所有的主機之間都可使用相同的公鑰和私鑰,也就實現的所有主機之間相互登錄
具體的過程這裏就不跟大家演示了,大家可以使用scp
或者xsync
命令實現集羣中.ssh/
文件的傳輸
一鍵啓動Hadoop集羣的配置
1, 完成集羣的免密登錄之後,我們只需要再修改以下Hadoop的從節點配置文件即可
vim <Hadoop安裝目錄>/etc/hadoop/slaves
一開始裏面只有localhost,代表本機,我們把localhost刪掉,然後添加上集羣中其他的從節點(這裏就是所有的三臺主機)
host01
host02
host03
- 然後通過
scp
或者xsync
命令將slaves文件同步到集羣中的其他主機上 - 然後在NameNode節點上啓動HDFS
start-dfs.sh
啓動之後在各個節點上使用jps
命令查看相應的HFDS進程是否啓動(NameNode,DataNode)
- 然後在ResourceManager節點上啓動yarn
start-yarn.sh
然後在各個節點上使用jps
命令查看相應的yarn進程是否啓動(ResourceManager,NodeManager)
- 最後訪問NameNode的50070端口,看DataNode中是否是3個節點
然後訪問ResourceManager的8088端口,看Yarn資源管理是否有內容
如果以上都沒有問題,說明集羣啓動成功