一 完全分布式集群(單點)
Hadoop官方地址:http://hadoop.apache.org/
1 准備3台客戶機
1.1防火牆,靜態IP,主機名
關閉防火牆,設置靜態IP,主機名此處略,參考 Linux之CentOS7.5安裝及克隆
1.2 修改host文件
我們希望三個主機之間都能夠使用主機名稱的方式相互訪問而不是IP,我們需要在hosts中配置其他主機的host。因此我們在主機的/etc/hosts下均進行如下配置:
[root@node21 ~]# vi /etc/hosts 配置主機host 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.100.21 node21 192.168.100.22 node22 192.168.100.23 node23 將配置發送到其他主機(同時在其他主機上配置) [root@node21 ~]# scp -r /etc/hosts root@node22:/etc/ [root@node21 ~]# scp -r /etc/hosts root@node23:/etc/ 測試 [root@node21 ~]# ping node21 [root@node21 ~]# ping node22 [root@node21 ~]# ping node23
1.3 添加用戶賬號
在所有的主機下均建立一個賬號admin用來運行hadoop ,並將其添加至sudoers中 [root@node21 ~]# useradd admin 添加用戶通過手動輸入修改密碼 [root@node21 ~]# passwd admin 更改用戶 admin 的密碼 123456 passwd: 所有的身份驗證令牌已經成功更新。 設置admin用戶具有root權限 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: [root@node21 ~]# visudo ## Allow root to run any commands anywhere root ALL=(ALL) ALL admin ALL=(ALL) ALL 修改完畢 :wq! 保存退出,現在可以用admin帳號登錄,然后用命令 su - ,切換用戶即可獲得root權限進行操作。
1.4 /opt目錄下創建文件夾
1)在root用戶下創建module、software文件夾 [root@node21 opt]# mkdir module [root@node21 opt]# mkdir software 2)修改module、software文件夾的所有者 [root@node21 opt]# chown admin:admin module [root@node21 opt]# chown admin:admin software 3)查看module、software文件夾的所有者 [root@node21 opt]# ll total 0 drwxr-xr-x. 5 admin admin 64 May 27 00:24 module drwxr-xr-x. 2 admin admin 267 May 26 11:56 software
2 安裝配置jdk1.8
[deng@node21 ~]# rpm -qa|grep java #查詢是否安裝java軟件: [deng@node21 ~]# rpm -e –nodeps 軟件包 #如果安裝的版本低於1.7,卸載該jdk 在線安裝 wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz 這里使用本地下載然后 xftp上傳到 /opt/software/ 下 [root@node21 software]# tar zxvf jdk-8u171-linux-x64.tar.gz -C /opt/module/ [root@node21 module]# mv jdk1.8.0_171 jdk1.8 設置JAVA_HOME vi /etc/profile export JAVA_HOME=/opt/module/jdk1.8 export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/sbin source /etc/profile 向其他節點復制jdk [root@node21 ~]# scp -r /opt/module/jdk1.8 root@node22:`pwd` [root@node21 ~]# scp -r /opt/module/jdk1.8 root@node23:`pwd` 配置各個主機下jdk的環境變量,由於我的電腦上linux都是新安裝的,環境變量相同,因此直接復制到了其他主機上。如果不同的主機的環境變量不同,請手動設置 [root@node21 ~]# scp /etc/profile root@node22:/etc/ [root@node21 ~]# scp /etc/profile root@node23:/etc/ 在每個主機上都重新編譯一下/etc/profile [root@node21]# source /etc/profile 測試 java -version
3 安裝hadoop集群
3.1 集群部署規划
| 節點名稱 | NN1 | NN2 | DN | RM | NM |
| node21 | NameNode | DataNode | NodeManager | ||
| node22 | SecondaryNameNode | DataNode | ResourceManager | NodeManager | |
| node23 | DataNode | NodeManager |
3.2 設置SSH免密鑰
關於ssh免密碼的設置,要求每兩台主機之間設置免密碼,自己的主機與自己的主機之間也要求設置免密碼。 這項操作可以在admin用戶下執行,執行完畢公鑰在/home/admin/.ssh/id_rsa.pub
[admin@node21 ~]# ssh-keygen -t rsa
[admin@node21 ~]# ssh-copy-id node21 [admin@node21 ~]# ssh-copy-id node22 [admin@node21 ~]# ssh-copy-id node23
node1與node2為namenode節點要相互免秘鑰 HDFS的HA
[admin@node22 ~]# ssh-keygen -t rsa
[admin@node22 ~]# ssh-copy-id node22 [admin@node22 ~]# ssh-copy-id node21 [admin@node22 ~]# ssh-copy-id node23
node2與node3為yarn節點要相互免秘鑰 YARN的HA
[admin@node23 ~]# ssh-keygen -t rsa
[admin@node23 ~]# ssh-copy-id node23 [admin@node23 ~]# ssh-copy-id node21 [admin@node23 ~]# ssh-copy-id node22
3.3 解壓安裝hadoop
[admin@node21 software]# tar zxvf hadoop-2.7.6.tar.gz -C /opt/module/
4 配置hadoop集群
注意:配置文件在hadoop2.7.6/etc/hadoop/下
4.1 修改core-site.xml
[admin@node21 hadoop]$ vi core-site.xml <configuration> <!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://node21:9000</value> </property> <!-- 指定hadoop運行時產生文件的存儲目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.6/data/full/tmp</value> </property> </configuration>
4.2 修改hadoop-env.sh
[admin@node21 hadoop]$ vi hadoop-env.sh 修改 export JAVA_HOME=/opt/module/jdk1.8
4.3 修改hdfs-site.xml
[admin@node21 hadoop]$ vi hdfs-site.xml <configuration> <!-- 設置dfs副本數,不設置默認是3個 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 設置secondname的端口 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>node22:50090</value> </property> </configuration>
4.4 修改slaves
[admin@node21 hadoop]$ vi slaves
node21
node22
node23
4.5 修改mapred-env.sh
[admin@node21 hadoop]$ vi mapred-env.sh 修改 export JAVA_HOME=/opt/module/jdk1.8
4.6 修改mapred-site.xml
[admin@node21 hadoop]# mv mapred-site.xml.template mapred-site.xml [admin@node21 hadoop]$ vi mapred-site.xml <configuration> <!-- 指定mr運行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
4.7 修改yarn-env.sh
[admin@node21 hadoop]$ vi yarn-env.sh 修改 export JAVA_HOME=/opt/module/jdk1.8
4.8 修改yarn-site.xml
[admin@node21 hadoop]$ vi yarn-site.xml
<configuration>
<!-- reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node22</value>
</property>
</configuration>
4.9 分發hadoop到節點
[admin@node21 module]# scp -r hadoop-2.7.6/ admin@node22:`pwd` [admin@node21 module]# scp -r hadoop-2.7.6/ admin@node23:`pwd`
4.10 配置環境變量
[admin@node21 ~]$ sudo vi /etc/profile 末尾追加 export HADOOP_HOME=/opt/module/hadoop-2.7.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 編譯生效 source /etc/profile
5 啟動驗證集群
5.1 啟動集群
如果集群是第一次啟動,需要格式化namenode
[admin@node21 hadoop-2.7.6]$ hdfs namenode -format

啟動Hdfs:
[admin@node21 ~]# start-dfs.sh Starting namenodes on [node21] node21: starting namenode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-root-namenode-node21.out node21: starting datanode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-root-datanode-node21.out node22: starting datanode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-root-datanode-node22.out node23: starting datanode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-root-datanode-node23.out Starting secondary namenodes [node22] node22: starting secondarynamenode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-root-secondarynamenode-node22.out
啟動Yarn: 注意:Namenode和ResourceManger如果不是同一台機器,不能在NameNode上啟動 yarn,應該在ResouceManager所在的機器上啟動yarn。
[admin@node22 ~]# start-yarn.sh starting yarn daemons starting resourcemanager, logging to /opt/module/hadoop-2.7.6/logs/yarn-root-resourcemanager-node22.out node21: starting nodemanager, logging to /opt/module/hadoop-2.7.6/logs/yarn-root-nodemanager-node21.out node23: starting nodemanager, logging to /opt/module/hadoop-2.7.6/logs/yarn-root-nodemanager-node23.out node22: starting nodemanager, logging to /opt/module/hadoop-2.7.6/logs/yarn-root-nodemanager-node22.out
jps查看進程
[admin@node21 ~]# jps 1440 NameNode 1537 DataNode 1811 NodeManager 1912 Jps [admin@node22 ~]# jps 1730 Jps 1339 ResourceManager 1148 DataNode 1198 SecondaryNameNode 1439 NodeManager [admin@node23 ~]# jps 1362 Jps 1149 DataNode 1262 NodeManager
web頁面訪問

5.2 Hadoop啟動停止方式
1)各個服務組件逐一啟動 分別啟動hdfs組件: hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode 啟動yarn: yarn-daemon.sh start|stop resourcemanager|nodemanager 2)各個模塊分開啟動(配置ssh是前提)常用 start|stop-dfs.sh start|stop-yarn.sh 3)全部啟動(不建議使用) start|stop-all.sh
5.3 集群時間同步
參考Ntp時間服務器與定時任務Crontab https://www.cnblogs.com/frankdeng/p/9005691.html
二 完全分布式集群(HA)
1 環境准備
1.1 修改IP
1.2 修改主機名及主機名和IP地址的映射
1.3 關閉防火牆
1.4 ssh免密登錄
1.5 安裝JDK,配置環境變量
2 集群規划
| 節點名稱 | NN | JJN | DN | ZKFC | ZK | RM | NM |
| node21 | NameNode | JournalNode | DataNode | ZKFC | Zookeeper | NodeManager | |
| node22 | NameNode | JournalNode | DataNode | ZKFC | ZooKeeper | ResourceManager | NodeManager |
| node23 | JournalNode | DataNode | ZooKeeper | ResourceManager | NodeManager |
3 安裝Zookeeper集群
安裝詳解參考 : CentOS7.5搭建Zookeeper集群與命令行操作
4 安裝配置Hadoop集群
4.1 解壓安裝Hadoop
解壓 hadoop-2.7.6到/opt/module/目錄下
[admin@node21 software]# tar zxvf hadoop-2.7.6.tar.gz -C /opt/module/
4.2 配置Hadoop集群
配置文件都在/opt/module/hadoop-2.7.6/etc/hadoop/下
4.2.1 修改hadoop-env.sh, mapred-env.sh ,yarn-env.sh 的JAVA環境變量
export JAVA_HOME=/opt/module/jdk1.8
4.2.2 修改 core-site.xml
[admin@node21 hadoop]$ vi core-site.xml <configuration> <!-- 把兩個NameNode的地址組裝成一個集群mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop運行時產生文件的存儲目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.6/data/ha/tmp</value> </property> <!-- 指定ZKFC故障自動切換轉移 --> <property> <name>ha.zookeeper.quorum</name> <value>node21:2181,node22:2181,node23:2181</value> </property> </configuration>
4.2.3 修改hdfs-site.xml
[admin@node21 hadoop]$ vi hdfs-site.xml <configuration> <!-- 設置dfs副本數,默認3個 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 完全分布式集群名稱 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode節點都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node21:8020</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node22:8020</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>node21:50070</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>node22:50070</value> </property> <!-- 指定NameNode元數據在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node21:8485;node22:8485;node23:8485/mycluster</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/admin/.ssh/id_rsa</value> </property> <!-- 聲明journalnode服務器存儲目錄--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/module/hadoop-2.7.6/data/ha/jn</value> </property> <!-- 關閉權限檢查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置自動故障轉移--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <configuration>
4.2.4 修改mapred-site.xml
[admin@node1 hadoop]# mv mapred-site.xml.template mapred-site.xml [admin@node1 hadoop]# vi mapred-site.xml <configuration> <!-- 指定mr框架為yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 指定mr歷史服務器主機,端口 --> <property> <name>mapreduce.jobhistory.address</name> <value>node21:10020</value> </property> <!-- 指定mr歷史服務器WebUI主機,端口 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node21:19888</value> </property> <!-- 歷史服務器的WEB UI上最多顯示20000個歷史的作業記錄信息 --> <property> <name>mapreduce.jobhistory.joblist.cache.size</name> <value>20000</value> </property> <!--配置作業運行日志 --> <property> <name>mapreduce.jobhistory.done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value> </property> <property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/tmp/hadoop-yarn/staging</value> </property> </configuration>
4.2.5 修改 slaves
[admin@node21 hadoop]$ vi slaves
node21
node22
node23
4.2.6 修改yarn-site.xml
[admin@node21 hadoop]$ vi yarn-site.xml <configuration> <!-- reducer獲取數據的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--啟用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--聲明兩台resourcemanager的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>rmCluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node22</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node23</value> </property> <!--指定zookeeper集群的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>node21:2181,node22:2181,node23:2181</value> </property> <!--啟用自動恢復--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的狀態信息存儲在zookeeper集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
4.2.6 拷貝hadoop到其他節點
[admin@node21 module]# scp -r hadoop-2.7.6/ admin@node22:/opt/module/ [admin@node21 module]# scp -r hadoop-2.7.6/ admin@node23:/opt/module/
4.2.7 配置Hadoop環境變量
[admin@node21 ~]$ sudo vi /etc/profile 末尾追加 export HADOOP_HOME=/opt/module/hadoop-2.7.6 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 編譯生效 source /etc/profile
5 啟動集群
1)在各個JournalNode節點上,輸入以下命令啟動journalnode服務:(前提zookeeper集群已啟動)
[admin@node21 ~]$ hadoop-daemon.sh start journalnode [admin@node22 ~]$ hadoop-daemon.sh start journalnode [admin@node23 ~]$ hadoop-daemon.sh start journalnode
啟動Journalnde是為了創建/data/ha/jn,此時jn里面是空的
2)在[nn1]上,對namenode進行格式化,並啟動:
[admin@node21 ~]$ hdfs namenode -format

格式化namenode,此時jn里面會產生集群ID等信息

另外,/data/ha/tmp也會產生如下信息

啟動nn1上namenode
[admin@node21 current]$ hadoop-daemon.sh start namenode starting namenode, logging to /opt/module/hadoop-2.7.6/logs/hadoop-admin-namenode-node21.out
3)在[nn2]上,同步nn1的元數據信息:
[admin@node22 ~]$ hdfs namenode -bootstrapStandby

4)啟動[nn2]:
[admin@node22 ~]$ hadoop-daemon.sh start namenode
5)在[nn1]上,啟動所有datanode
[admin@node21 ~]$ hadoop-daemons.sh start datanode
6)查看web頁面此時顯示


7)手動切換狀態,在各個NameNode節點上啟動DFSZK Failover Controller,先在哪台機器啟動,哪個機器的NameNode就是Active NameNode
[admin@node21 ~]$ hadoop-daemin.sh start zkfc
[admin@node22 ~]$ hadoop-daemin.sh start zkfc
或者強制手動其中一個節點變為Active
[admin@node21 data]$ hdfs haadmin -transitionToActive nn1 --forcemanual
Web頁面查看


8)自動切換狀態,需要初始化HA在Zookeeper中狀態,先停掉hdfs服務,然后隨便找一台zookeeper的安裝節點
[admin@node21 current]$ hdfs zkfc -formatZK

查看,此時會產生一個hadoop-ha的目錄
[root@node22 ~]# zkCli.sh

啟動hdfs服務,查看namenode狀態
[admin@node21 ~]$ start-hdfs.sh
9)驗證
(1)將Active NameNode進程kill
kill -9 namenode的進程id
(2)將Active NameNode機器斷開網絡
service network stop
如果測試不成功,則可能是配置錯誤。檢查zkfc守護進程以及NameNode守護進程的日志,以便進一步診斷問題。
10)啟動yarn
(1)在node22中執行:
[admin@node22 ~]$ start-yarn.sh
(2)在node23中執行:
[admin@node23 ~]$ yarn-daemon.sh start resourcemanager
(3)查看服務狀態
[admin@node22 ~]$ yarn rmadmin -getServiceState rm1 active [admin@node22 ~]$ yarn rmadmin -getServiceState rm2 standby

4) 驗證高可用(略)
6 測試集群
1)查看進程
[admin@node21 ~]$ start-dfs.sh [admin@node22 ~]$ start-yarn.sh [admin@node23 ~]$ yarn-daemon.sh start resourcemanager
[admin@node21 ~]$ jps 11298 NodeManager 10868 DataNode 11065 JournalNode 11210 DFSZKFailoverController 1276 QuorumPeerMain 11470 NameNode 11436 Jps [admin@node22 ~]$ jps 7168 DataNode 7476 ResourceManager 7941 Jps 7271 JournalNode 1080 QuorumPeerMain 7352 DFSZKFailoverController 7594 NodeManager 7099 NameNode [admin@node23 ~]$ jps 3554 ResourceManager 3204 DataNode 3301 JournalNode 3606 Jps 3384 NodeManager 1097 QuorumPeerMain
2)任務提交
2.1 上傳文件到集群
[admin@node21 ~]$ hadoop fs -mkdir -p /user/admin/input [admin@node21 ~]$ mkdir -p /opt/wcinput/ [admin@node21 ~]$ vi /opt/wcinput/wc.txt [admin@node21 ~]$ hadoop fs -put /opt/wcinput/wc.txt /user/admin/input
wc.txt 文本內容為
hadoop spark storm
hbase hive sqoop
hadoop flink flume
spark hadoop
2.2 上傳文件后查看文件存放在什么位置
文件存儲路徑 [admin@node21 subdir0]$ pwd /opt/module/hadoop-2.7.6/data/ha/tmp/dfs/data/current/BP-1244373306-192.168.100.21-1527653416622/current/finalized/subdir0/subdir0 查看文件內容 [admin@node21 subdir0]$ cat blk_1073741825 hadoop spark storm hbase hive sqoop hadoop flink flume spark hadoop
2.3 下載文件
[admin@node21 opt]$ hadoop fs -get /user/admin/input/wc.txt
2.4 執行wordcount程序
[admin@node21 ~]$ hadoop jar /opt/module/hadoop-2.7.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /user/admin/input /user/admin/output
執行過程
18/05/30 02:51:39 INFO input.FileInputFormat: Total input paths to process : 1 18/05/30 02:51:40 INFO mapreduce.JobSubmitter: number of splits:1 18/05/30 02:51:40 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1527660052824_0001 18/05/30 02:51:42 INFO impl.YarnClientImpl: Submitted application application_1527660052824_0001 18/05/30 02:51:43 INFO mapreduce.Job: The url to track the job: http://node22:8088/proxy/application_1527660052824_0001/ 18/05/30 02:51:43 INFO mapreduce.Job: Running job: job_1527660052824_0001 18/05/30 02:52:33 INFO mapreduce.Job: Job job_1527660052824_0001 running in uber mode : false 18/05/30 02:52:33 INFO mapreduce.Job: map 0% reduce 0% 18/05/30 02:53:04 INFO mapreduce.Job: map 100% reduce 0% 18/05/30 02:53:17 INFO mapreduce.Job: map 100% reduce 100% 18/05/30 02:53:19 INFO mapreduce.Job: Job job_1527660052824_0001 completed successfully 18/05/30 02:53:19 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=102 FILE: Number of bytes written=250513 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=188 HDFS: Number of bytes written=64 HDFS: Number of read operations=6 HDFS: Number of large read operations=0 HDFS: Number of write operations=2 Job Counters Launched map tasks=1 Launched reduce tasks=1 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=25438 Total time spent by all reduces in occupied slots (ms)=10815 Total time spent by all map tasks (ms)=25438 Total time spent by all reduce tasks (ms)=10815 Total vcore-milliseconds taken by all map tasks=25438 Total vcore-milliseconds taken by all reduce tasks=10815 Total megabyte-milliseconds taken by all map tasks=26048512 Total megabyte-milliseconds taken by all reduce tasks=11074560 Map-Reduce Framework Map input records=4 Map output records=11 Map output bytes=112 Map output materialized bytes=102 Input split bytes=105 Combine input records=11 Combine output records=8 Reduce input groups=8 Reduce shuffle bytes=102 Reduce input records=8 Reduce output records=8 Spilled Records=16 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=558 CPU time spent (ms)=8320 Physical memory (bytes) snapshot=308072448 Virtual memory (bytes) snapshot=4159348736 Total committed heap usage (bytes)=165810176 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=83 File Output Format Counters Bytes Written=64
下載查看
[admin@node21 wcoutput]$ hadoop fs -get /user/admin/output/part-r-00000 [admin@node21 wcoutput]$ ll total 4 -rw-r--r-- 1 admin admin 64 May 30 02:58 part-r-00000 [admin@node21 wcoutput]$ cat part-r-00000 flink 1 flume 1 hadoop 3 hbase 1 hive 1 spark 2 sqoop 1 storm 1
三 配置集群常見錯誤
1 自動故障轉移錯誤
1.1 兩台namenode之間不能通信,kill掉一台Active的namenode節點,另外一台standby不能切換Active
查看namenode日志 或者zkfc日志,nn1 連接 nn2 8020失敗

原因分析:若服務器是最小化安裝CentOS時,有可能系統沒有fuster程序,那么跳過這個安裝步驟直接進行后面的操作時,將有可能出現以下問題:
node21作為主節點時,kill掉node21上的NameNode和ResourceManager進程時,可以實現故障轉移,node22將從stanby狀態自動變成active狀態;但是當node22作為主節點時,若kill掉node22上的進程,node21上的進程狀態卻還是stanby,並不能實現故障自動轉移。原因是我們在 hdfs-site.xml中配置了當集群需要故障自動轉移時采用SSH方式進行,而因為缺少fuster程序,將在zkfc的日志文件中發現如下錯誤
PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 9000 via ssh: bash: fuser: 未找到命令 Unable to fence service by any configured method java.lang.RuntimeException: Unable to fence NameNode at node22/192.168.100.22:8020
提示未找到fuster程序,導致無法進行fence,所以可以通過如下命令來安裝,Psmisc軟件包中包含了fuster程序:
//分別在node21、node22、node23上執行 sudo yum install psmisc
重啟Hadoop服務驗證成功。
2HDFS啟動警告信息
Hadoop2.7.6在安裝成功后,start-dfs.sh啟動后出現警告提示:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
在Hadoop2.7以后的版本中,$HADOOP_HOME/lib/native 包下的文件都改為了64位,不存在版本差異化的問題,這里解決方案是在文件hadoop-env.sh中增加如下一行信息
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native"
再次啟動就沒有警告提示了。
四 Hadoop集群群啟腳本
1啟動服務
zookeeper hadoop
2腳本
1 編寫啟動集群腳本 vi start-cluster.sh
#!/bin/bash
echo "****************** 開始啟動集群所有節點服務 ****************"
echo "****************** 正在啟動zookeeper *********************"
for i in admin@node21 admin@node22 admin@node23
do
ssh $i '/opt/module/zookeeper-3.4.12/bin/zkServer.sh start'
done
echo "******************** 正在啟動HDFS *******************"
ssh admin@node21 '/opt/module/hadoop-2.7.6/sbin/start-dfs.sh'
echo "********************* 正在啟動YARN ******************"
ssh admin@node22 '/opt/module/hadoop-2.7.6/sbin/start-yarn.sh'
echo "*************** 正在node21上啟動JobHistoryServer *********"
ssh admin@node21 '/opt/module/hadoop-2.7.6/sbin/mr-jobhistory-daemon.sh start historyserver'
echo "****************** 集群啟動成功 *******************"*
2 編寫關閉集群腳本 vi stop-cluster.sh
#!/bin/bash
echo "************* 開在關閉集群所有節點服務 *************"
echo "************* 正在node21上關閉JobHistoryServer *************"
ssh admin@node21 '/opt/module/hadoop-2.7.6/sbin/mr-jobhistory-daemon.sh stop historyserver'
echo "************* 正在關閉YARN *************"
ssh admin@node22 '/opt/module/hadoop-2.7.6/sbin/stop-yarn.sh'
echo "************* 正在關閉HDFS *************"
ssh admin@node21 '/opt/module/hadoop-2.7.6/sbin/stop-dfs.sh'
echo "************* 正在關閉zookeeper *************"
for i in admin@node21 admin@node22 admin@node23
do
ssh $i '/opt/module/zookeeper-3.4.12/bin/zkServer.sh stop'
done
3 編寫查看集群jps進程腳本utils.sh
#!/bin/bash echo "************* 開始啟動JPS **********" echo "************* node21的jps **********" ssh admin@node21 'jps' echo "************* node22的jps **********" ssh admin@node22 'jps' echo "************* node23的jps **********" ssh admin@node23 'jps'
3賦權限給腳本
chmod +x 腳本名稱
4其他問題
Linux執行.sh文件,提示No such file or directory的問題的解決方法:

原因:在windows中寫好shell腳本測試正常,但是上傳到 Linux 上以腳本方式運行命令時提示No such file or directory錯誤,那么一般是文件格式是dos格式的緣故,改成unix 格式即可。一般有如下幾種修改辦法。
1)在Windows下轉換:
利用一些編輯器如UltraEdit或EditPlus等工具先將腳本編碼轉換,再放到Linux中執行。轉換方式如下(UltraEdit):File-->Conversions-->DOS->UNIX即可。
2)方法
用vi打開該sh文件,輸入:
:set ff
回車,顯示fileformat=dos,重新設置下文件格式:
:set ff=unix
保存退出:
:wq
再執行,就可以了
