集群規(guī)劃
| 主機 | IP | 安裝軟件 | 運行進程 |
|---|---|---|---|
| nimbus | 192.168.116.129 | hadoop,zookeeper,jdk | NameNode、DFSZKFailoverController(zkfc)、ResourceManager、JournalNode、QuorumPeerMain、JobHistoryServer |
| supervisor1 | 192.168.116.130 | hadoop,zookeeper,jdk | NameNode、DataNode、DFSZKFailoverController(zkfc)、JournalNode、QuorumPeerMain |
| supervisor2 | 192.168.116.131 | hadoop,zookeeper,jdk | DataNode、NodeManager、JournalNode、QuorumPeerMain |
前期準備
-
靜態(tài)IP設置
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 //指出設備名稱
BOOTPROT=static //啟動類型 dhcp|static
IPADDR=192.168.0.2 //IP地址
NETMASK=255.255.255.0 //子網(wǎng)掩碼
NETWORK=192.168.0.0 //網(wǎng)絡地址
GATEWAY=192.168.0.1 //網(wǎng)關地址
ONBOOT=yes //是否啟動應用
#TYPE=Ethernet //網(wǎng)絡類型
#BROADCAST=192.168.1.203 //廣播地址
#HWADDR=00:06:5B:FE:DF:7C //硬件Mac地址
-
賬號分配
需要使用具備 sudo 免密碼認證的非 root 用戶,文本中以 hddev 用戶執(zhí)行操作。
登錄到集群內 每臺主機,執(zhí)行以下操作
- 使用 root 用戶登錄 Centos 命令行;
- 開放 sudoers 文件寫權限,執(zhí)行 chmod u+w /etc/sudoers;
- 執(zhí)行 vi /etc/sudoers,找到 root ALL=(ALL) ALL
在其下邊添加一行數(shù)據(jù):hddev ALL=(ALL) NOPASSWD: ALL,hddev 為 sudo 免密碼用戶 - 執(zhí)行 Esc wq 保存推出 vi ;
- 恢復 sudoers 文件權限,執(zhí)行 chmod u-w /etc/sudoers
- 切換到新增 hddev,執(zhí)行 su – hddev ;
- 在 hddev 用戶下校驗 sudo 免密碼登錄配置是否正確: 執(zhí)行 sudo ls ,如果沒有提示需要輸入密碼,則說明配置正確。
-
SSH免密碼登錄
主備NameNode,ResourceManager進程所在主機要進行對集群其它主機的免密碼登錄配置。
具體步驟示例:
1. 通過 hddev 賬號登錄以后,在集群內所有主機上生成公鑰和私鑰
mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
2. 將 NMBDP 的主機 host1 上的公鑰拷貝到其他目標主機
scp ~/.ssh/id_dsa.pub hddev@xxx:/home/hddev/host1_id_dsa.pub
xxx:為目標主機名,接著會提示輸入對端主機密碼登陸,因為還沒實現(xiàn)免密碼登陸,這一次需要手工輸入密碼。
3. 在目標主機上將 host1 的公鑰加入到本機認證文件中
cat ~/host1_id_dsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
4. 接下來就可以在 host1 中通過 ssh 無密碼登錄其他主機。
RSA
ssh-keygen -t rsa
ssh-copy-id-i target_hostname
-
主機名設置
- 編輯/etc/hosts 文件
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.116.129 nimbus
192.168.116.130 supervisor1
192.168.116.131 supervisor2
- 設置主機名
命令行執(zhí)行 sudo hostname host1 編輯文件 sudo vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=host1
```
(重要)檢查主機名設置是否正確: $hostname -f 查看是否為預期輸出
- **關閉防火墻、 SELinux 和 PackageKit **
sudo chkconfig iptables off
sudo /etc/init.d/iptables stop
sudo setenforce 0
sudo vi /etc/selinux/config,將其中的 SELINUX 值設置為 disabled
如果安裝了 PackageKit , 需要編輯 /etc/yum/pluginconf.d/refresh-packagekit.conf,做如下修改 enabled=0
- **安裝 JDK **
- 下載 Oracle JDK 1.7.0_55 64-bit 安裝文件 jdk-7u55-linux-x64.gz ;
- 創(chuàng)建/usr/java 目錄,執(zhí)行:sudo mkdir /usr/java
- 并將 jdk-7u55-linux-x64.gz 文件拷貝到/usr/java 目錄;并執(zhí)行 cd /usr/java 進入該目錄;
- 將 jdk-7u55-linux-x64.gz 文件解壓到/usr/java 目錄,執(zhí)行:sudo tar -xvf jdk-7u55-linux-x64.gz ;
- 安裝成功后會生成 jdk1.7.0_55,確認該目錄權限為 drwxr-xr-x (755)
- 更改該目錄所屬用戶組:sudo chown -R root:root jdk1.7.0_55
- 執(zhí)行 sudo vi /etc/profile 編輯文件,增加如下內容:
export JAVA_HOME=/usr/java/jdk1.7.0_55
export PATH=.:$JAVA_HOME/bin:$PATH
- 執(zhí)行 source /etc/profile 使文件修改生效。
搭建zookeeper集群
待補充
bin/zkServer.sh start #啟動
bin/zkServer.sh status #查看狀態(tài)
搭建Hadoop HA集群
- 環(huán)境變量配置
$ vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_55
export PATH=.:$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/home/kimibob/app/hadoop-2.7.2
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export ZOO_HOME=/home/kimibob/app/zookeeper-3.4.6/
export PATH=$ZOO_HOME/bin:$PATH
$ source /etc/profile
- 配置hadoop-env.sh 修改一處即可
export JAVA_HOME=/usr/java/jdk1.7.0_55/ - core-site.xml 【注:以下配置項中的中文注釋不可出現(xiàn)在實際文件中,這里僅供說明用】
<configuration>
<!-- 指定hdfs的nameservice為ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop臨時目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/kimibob/app/app_data/hadoop_tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>nimbus:2181,supervisor1:2181,supervisor2:2181</value>
</property>
</configuration>
- hdfs-site.xml【注:以下配置項中的中文注釋不可出現(xiàn)在實際文件中,這里僅供說明用】
<configuration>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定hdfs的nameservice為mycluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- mycluster下面有兩個NameNode,分別是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>nimbus:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>nimbus:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>supervisor1:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>supervisor1:50070</value>
</property>
<!-- 指定NameNode的元數(shù)據(jù)在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://nimbus:8485;supervisor1:8485;supervisor2:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盤存放數(shù)據(jù)的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/kimibob/app/app_data/journal</value>
</property>
<!-- 開啟NameNode失敗自動切換 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失敗自動切換實現(xiàn)方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔離機制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔離機制時需要ssh免登陸 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/kimibob/.ssh/id_rsa</value>
</property>
</configuration>
- mapred-site.xml【注:以下配置項中的中文注釋不可出現(xiàn)在實際文件中,這里僅供說明用】
<configuration>
<!-- 指定mr框架為yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定jobhistory-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>nimbus:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>nimbus:19888</value>
</property>
</configuration>
- yarn-site.xml【注:以下配置項中的中文注釋不可出現(xiàn)在實際文件中,這里僅供說明用】
<configuration>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nimbus</value>
</property>
<!-- 指定nodemanager啟動時加載server的方式為shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 配置datanode的配置文件slaves 【hadoop-daemons.sh腳本執(zhí)行的主機列表會從這個文件獲取】
[kimibob@nimbus hadoop]$ vi slaves
supervisor1
supervisor2
- 將hadoop目錄拷貝到集群其他主機
- 啟動各項服務【嚴格按照順序】
1. nimbus、supervisor1、supervisor2三臺啟動zookeeper服務
jps 對應進程:QuorumPeerMain
2. nimbus、supervisor1、supervisor2三臺分別執(zhí)行:hadoop-daemon.sh start journalnode【注意只有第一次需要這么啟動,之后start-dfs.sh有包含journalnode的啟動】
jps 對應進程:JournalNode
3. 格式化主NameNode【這個過程僅僅在第一次使用之前執(zhí)行一次】:hdfs namenode –format
4. 主NameNode上執(zhí)行:hdfs zkfc -formatZK
5. 初始化備NameNode:hdfs namenode -bootstrapStandby【其實就是把主NameNode的元數(shù)據(jù)目錄file://${hadoop.tmp.dir}/dfs/name拷貝一份到備NameNode主機同樣位置】
6. 啟動hdfs:start-dfs.sh 【包括主備NameNode,三個journalnode,兩個ZK Failover Controllers 的啟動】
7. 啟動YARN: start-yarn.sh
8. 啟動MR-history-server:mr-jobhistory-daemon.sh start historyserver
各個主機進程:
[kimibob@nimbus ]$ jps -m
14915 NameNode
14744 JournalNode
14679 QuorumPeerMain /home/kimibob/app/zookeeper-3.4.6/bin/../conf/zoo.cfg
15265 DFSZKFailoverController
15482 ResourceManager
15809 JobHistoryServer
[kimibob@supervisor1 ]$ jps -m
13945 NameNode
13855 JournalNode
14032 DataNode
13782 QuorumPeerMain /home/kimibob/app/zookeeper-3.4.6/bin/../conf/zoo.cfg
14201 DFSZKFailoverController
14351 NodeManager
[kimibob@supervisor2 ]$ jps -m
11865 JournalNode
11955 DataNode
11799 QuorumPeerMain /home/kimibob/app/zookeeper-3.4.6/bin/../conf/zoo.cfg
12136 NodeManager
- 服務地址
hdfs:(active) http://nimbus:50070/ (standby)http://supervisor1:50070/
yarn:http://nimbus:8088/