搭建Hadoop集群環境(3台機器)
1 准備環境
1.1 安裝系統,並配置網絡使3台機器互聯互通,且SSH可直連(無需密碼、保存私鑰)
1.1.1 安裝系統
安裝Centos 6.5系統
安裝過程略
1.1.2 配置網絡
設置三台機器的iP分別為
IP |
主機名稱 |
10.132.41.116 |
Hadoop.slave2 |
10.132.41.117 |
Hadoop.slave1 |
10.132.41.118 |
Hadoop.master |
修改計算機名稱
Vi /etc/sysconfig/network
以上修改需要重啟生效。可同時立即生效,增加執行以下命令:
Sudo hostname hadoop.slave1
1.1.3 SSH配置
a).首先在hadoop.master機器上用root(hadoop用戶)登錄,先生成ssh密鑰文件,執行
ssh-keygen -t rsa
過程中,回車3次,提示以下內容表示成功
查看公鑰文件是否生成:/home/hadoop/.ssh
b).執行命令將密鑰文件共享給其他機器
ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@10.132.41.117
第一次執行需要輸入hadoop的密碼。
輸出一下內容表示執行成功。
c).執行命令測試是否建立互信成功
使用ssh直接連接服務器,確認是否免密碼登錄。
ssh 10.132.41.117
登錄后輸入任意命令確認是否登錄成功。
w
1.2 安裝JDK,並配置環境變量
1.2.1 安裝JDK
先執行rpm查詢命令確認是否已安裝了JDK其他版本
rpm –qa | grep jdk
返回不為空,且版本不對可執行以下命令,將當前版本卸載掉
rpm –c 軟件包名稱
下載JDK文件並上傳到服務器(rpm),執行
rpm –ivh 軟件包名稱
1.2.2 配置環境變量
使用vi進入/etc/profile文件,在最后追加以下內容:
# set java environment export JAVA_HOME=/usr/java/jdk1.6.0_31 # export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
之后執行以下命令,重啟配置文件。
source /etc/profile
1.2.3 測試環境
執行命令確認安裝是否正常。
[root@hadoop hadoop]# java -version java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
2 安裝Hadoop
需要將所有的機器(master和slave)都需要安裝hadoop,操作都一樣,下面以master為示例。
2.1 下載
登錄hadoop官網,下載對應版本。本示例使用了最新版2.6.4版本。
http://hadoop.apache.org/releases.html
下載后的文件hadoop-2.6.4.tar.gz,使用SFTP工具上傳到hadoop.master機器上。
2.2 安裝
用root用戶登錄hadoop.master機器,將上傳上來的hadoop-2.6.4.tar.gz文件拷貝至/usr下。
執行“tar zxf hadoop-2.6.4.tar.gz hadoop”,將hadoop解壓到/usr/hadoop目錄下。
執行以下命令,將hadoop文件夾的歸屬用戶和組修改到hadoop用戶下。
chown –R hadoop:dadoop hadoop
配置后如下:
2.3 配置環境變量
使用vi進入/etc/profile文件,在最后追加以下內容:
# set hadoop environment export HADOOP_HOME=/usr/hadoop export PATH=$PATH:$ HADOOP _HOME/bin
之后執行以下命令,重啟配置文件。
source /etc/profile
執行以下命令,確認配置生效。
[root@hadoop hadoop]# hadoop version Hadoop 2.6.4 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 5082c73637530b0b7e115f9625ed7fac69f937e6 Compiled by jenkins on 2016-02-12T09:45Z Compiled with protoc 2.5.0 From source with checksum 8dee2286ecdbbbc930a6c87b65cbc010 This command was run using /usr/hadoop/share/hadoop/common/hadoop-common-2.6.4.jar
3 配置Hadoop
3.1 配置master
Hadoop涉及3個配置文件etc/hadoop/core-site.xml,etc/hadoop/hdfs-site.xml,etc/hadoop/mared-site.xml文件。
注:
以下配置中的hadoop.master均可以使用master的ip來替代。
所有的配置文件在2.x已經調整到$HADOOP_HOME/etc/hadoop下。
默認不存在“mapred-site.xml”文件,需要復制mapred-site.xml.template。
3.1.1 配置core-site.xml
<configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop.master:9000</value> <final>true</final> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop/tmp</value> </property> <property> <name>ds.default.name</name> <value>hdfs://hadoop.master:54310</value> <final>true</final> </property> </configuration>
3.1.2 配置hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/hadoop/dfs/name</value> <final>true</final> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/hadoop/dfs/data</value> <final>true</final> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>
3.1.3 配置mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop.master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop.master:19888</value> </property> </configuration>
3.1.4 配置yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop.master</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>hadoop.master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop.master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop.master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop.master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop.master:8088</value> </property> </configuration>
3.1.5 配置masters和slaves文件
分別將master的信息和所有slave機器的信息寫入到masters和slaves文件中。
注:slaves文件中的數量必須大於hdfs-site.xml文件中的“dfs.replication”配置,否則namenode無法啟動。
另外,masters是根據網上教程手動生成的,然后配置貌似沒起到作用。
3.2 配置slave
配置slave有2種方式:1.將hadoop的安裝包上傳到slave機器重新配置;2.將master上的配置復制到slave機器上。本示例采用了第2種方法,即全盤復制master上的配置。
3.2.1 安裝JDK和配置環境變量
操作同master,此處略。
3.2.2 配置hosts
操作同master,此處略。
3.2.3 復制master上的hadoop
首先用hadoop用戶(ssh已互信)執行以下命令,將hadoop復制到slave機器上。
scp /usr/hadoop hadoop@hadoop.slave1:/home/hadoop
用root用戶登錄hadoop.slave1,並執行以下命令,將hadoop移至/usr目錄下。
mv /home/hadoop/hadoop /usr/
修改hadoop的擁有着。
chown –R hadoop:hadoop hadoop
注:需要在環境配置時添加好hadoop用戶及用戶組。
3.3 關閉防火牆
[hadoop@hadoop ~]$ su root Password: [root@hadoop hadoop]# service iptables stop [root@hadoop hadoop]# chkconfig iptables off
4 啟動和驗證
4.1 初始化Namenode
在Master上用hadoop用戶,執行以下命令初始化Namenode。
hadoop namenode -format
注:第2次以后初始化,過程中會提示是否刪除已初始化內容,輸入Y即可。
4.2 啟動集群
4.3 驗證
4.3.1 Master驗證Namenode啟動
在Master上用hadoop用戶執行jps,顯示以下內容,即啟動成功。
如果缺少進程,可以到“$HADOOP_HOME/logs”下查看日志,確認啟動失敗的原因。
4.3.2 Slave驗證Datanode啟動
在Slave上分別用hadoop用戶執行jps,顯示以下內容,即啟動成功。
如果缺少進程,可以到“$HADOOP_HOME/logs”下查看日志,確認啟動失敗的原因。
注:2.X以后沒有Jobtracker和Tasktracker進程了。
5 問題FAQ
5.1 啟動時報“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable”
【問題現象】:啟動時出現警告“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable”
【問題分析】:通過錯誤提示得知,部分文件由32位平台編譯,本機是64位centos,因此報錯。
【解決措施】:通過網友提供的一個編譯文件,下載並替換$HADOOP_HOME/lib/native目錄下文件,即可解決此警告。
博客地址:http://www.secdoctor.com/html/yyjs/31101.html
文件的下載地址:http://dl.bintray.com/sequenceiq/sequenceiq-bin/hadoop-native-64-2.6.0.tar
5.2 Master報“”,Namenode啟動失敗
【問題現象】:通過執行jps,發現master上沒有namenode進程,查看log日志發現,有以下錯誤
FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.net.BindException: Problem binding to [hadoop.master:9000] java.net.BindException: Cannot assign requested address; For more details see: http://wiki.apache.org/hadoop/BindException
【問題分析】:由於申請的雲虛擬機,外部連接的IP為10開頭的大網IP,通過ifconfig查看本機IP發現並非多網卡,而是做了IP映射,即配置的IP在本地無法訪問到,導致JVM出現BindException。
【解決措施】:通過使用虛擬機本機IP(172開頭)在集群中的所有機器中相互ping,如果都能ping通,則可以直接使用本機IP做配置(本例即是)。修改/etc/hosts文件中的hostname映射IP並復制到集群中所有的機器,ssh互信重做,在master上重新格式化namenode后啟動即可。
5.3 Slave報“All specified directories are failed to load.”,Datanode啟動失敗
【問題現象】:通過執行jps,發現slave上沒有datanode進程,查看log日志發現,有以下錯誤信息:
WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /usr/hadoop/dfs/data: namenode clusterID = CID-1a1fabff-166c-4c0a-9bd3-b726f217cc87; datanode clusterID = CID-65c03263-c30a-4592-8019-f6b356061418
2016-03-28 17:07:09,416 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for Block pool <registering> (Datanode Uuid unassigned) service to hadoop.master/172.16.0.111:9000. Exiting.
java.io.IOException: All specified directories are failed to load.
【問題分析】:由於變動了IP和重新初始化namenode,master的clusterID已經變化,slave連接master失敗。需要更新clusterID為最新的值即可。
【解決措施】:修改data/current目錄下的VERSION文件中clusterID為namenode的ID,並重啟。
注:data目錄的配置在hdfs-site.xml文件中的“dfs.datanode.data.dir”配置項。
6 附件
6.1 本示例中的配置文件