先按照上一篇安装与配置好CentOS以及zookeeper
http://www.cnblogs.com/dopeter/p/4609276.html
本章介绍在CentOS搭建Hadoop集群环境
一、 安装Hadoop
1. 解压文件
tar -zxvf hadoop-2.7.0-x64.tar.gz -C /opt #解压Hadoop
2. 编辑全局变量
vi /etc/profile
增加以下全局变量
export HADOOP_HOME=/opt/hadoop-2.7.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export YARN_LOG_DIR=$HADOOP_LOG_DIR
source /etc/profile #即时生效
二、 配置Hadoop
cd /opt/hadoop-2.7.0/etc/hadoop
vi core-site.xml
<configuration>
<!--HDFS路径逻辑名称-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hcluster</value>
</property>
<!--Hadoop存放临时文件位置-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<!--使用的zookeeper集群地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value>
</property>
</configuration>
vi hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>hcluster</value>
</property>
<!--NameNode地址集群标识(hcluster),最多两个-->
<property>
<name>dfs.ha.namenodes.hcluster</name>
<value>HMaster0,HMaster1</value>
</property>
<!--HDFS文件系统数据存储位置,可以分别保存到不同硬盘,突破单硬盘性能瓶颈,多个位置以逗号隔开-->
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/hdfs/data</value>
</property>
<!--数据副本数量,根据HDFS台数设置,默认3份-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster0</name>
<value>HMaster0:9000</value>
</property>
<!--RPC端口-->
<property>
<name>dfs.namenode.rpc-address.hcluster.HMaster1</name>
<value>HMaster1:9000</value>
</property>
<!--NameNode HTTP访问地址-->
<property>
<name>dfs.namenode.http-address.hcluster.HMaster0</name>
<value>HMaster0:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hcluster.HMaster1</name>
<value>HMaster1:50070</value>
</property>
<!--NN存放元数据和日志位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/name</value>
</property>
<!--同时把NameNode元数据和日志存放在JournalNode上(/home/hadoop/journal/hcluster)-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://HSlave0:8485;HSlave1:8485;HSlave2:8485/hcluster</value>
</property>
<!--JournalNode上元数据和日志存放位置-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journal</value>
</property>
<!--开启NameNode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--NameNode失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.hcluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--隔离机制方法,确保任何时间只有一个NameNode处于活动状态-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence(hdfs)
shell(/bin/true)</value>
</property>
<!--使用sshfence隔离机制要SSH免密码认证-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<!--启用RM高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--RM集群标识符-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rm-cluster</value>
</property>
<property>
<!--指定两台RM主机名标识符-->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--RM故障自动切换-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.recover.enabled</name>
<value>true</value>
</property>
<!--RM故障自动恢复
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property> -->
<!--RM主机1-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>HMaster0</value>
</property>
<!--RM主机2-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>HMaster1</value>
</property>
<!--RM状态信息存储方式,一种基于内存(MemStore),另一种基于ZK(ZKStore)-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--使用ZK集群保存状态信息-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>HSlave0:2181,HSlave1:2181,HSlave2:2181</value>
</property>
<!--向RM调度资源地址-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>HMaster0:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>HMaster1:8030</value>
</property>
<!--NodeManager通过该地址交换信息-->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>HMaster0:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>HMaster1:8031</value>
</property>
<!--客户端通过该地址向RM提交对应用程序操作-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>HMaster0:8032</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>HMaster1:8032</value>
</property>
<!--管理员通过该地址向RM发送管理命令-->
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>HMaster0:8033</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>HMaster1:8033</value>
</property>
<!--RM HTTP访问地址,查看集群信息-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>HMaster0:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>HMaster1:8088</value>
</property>
</configuration>
vi mapred-site.xml
<configuration>
<!--指定MR框架为YARN-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置 MapReduce JobHistory Server地址 ,默认端口10020 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>0.0.0.0:10020</value>
</property>
<!-- 配置 MapReduce JobHistory Server HTTP地址, 默认端口19888 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>0.0.0.0:19888</value>
</property>
</configuration>
vi hadoop-env.sh
将
export
JAVA_HOME=${JAVA_HOME}修改为安装的JDK路径
export
JAVA_HOME=/usr/java/jdk1.8.0_45
vi slaves
HSlave0
HSlave1
HSlave2
三、拷贝至每个节点
scp -r /opt/hadoop-2.7.0 hmaster1:/opt
...
直到slave2
四、 启动Hadoop集群
1. 对NameNode(HMaster0)节点进行格式化
hadoop namenode -format
如果有错误发生可以在/opt/hadoop/logs下的hadoop-root-namenode-localhost.localdomain.log文件中查看日志
说明2种常见错误:
1. 在hadoop的hdfs-site.xml配置中,有这个属性dfs.namenode.shared.edits.dir,值为qjournal://HSlave0:8485;HSlave1:8485;HSlave2:8485/hcluster
错误会报连接HSlave0:8485被积极拒绝,在每个Slave节点机器上运行命令
hadoop-daemon.sh start journalnode
该命令运行后,在Slave节点机器上会开启监听8485端口的Socket,再次格式化NameNode,就不会报这个错了
2. 有时DataNode会无法启动,查看错误日志是NameNode机器(Master机器)和DataNode机器(Slave机器)namespaceID或者clusterID不一致,有2种解决方案
第一种解决方案是修改VERSION文件中不一致,VERSION文件在hdfs-site,xml配置中该属性dfs.namenode.name.dir定义的路径下的current文件夹中
第二种解决方案即是删除current文件夹以及DataNode机器的tmp文件夹,有可能文件夹在NameNode机器和DataNode机器下相对路径不一样,但根路径都一样,在第一种解决方案中有说明,再次格式化NameNode就OK了
2. 启动HMaster0(active)节点NameNode
hadoop-daemon.sh start namenode
3. HMaster1节点上同步(HMaster0)元数据
hdfs namenode -bootstrapStandby #实际上是将HMaster0机器上的current文件夹同步过来
4. 启动HMaster1(standby)节点NameNode
hadoop-daemon.sh start namenode
5. 在HMaster0格式化ZKFC
hdfs zkfc -formatZK
6. 在HMaster0节点启动HDFS集群
start-dfs.sh
7. 启动ResourceManager(HMaster0机器)
start-yarn.sh
8. 在standby节点启动ResourceManager(HMaster1机器)
yarn-daemon.sh start resourcemanager
验证集群是否成功
2015-7-7
运行wordcount示例时,遇到的错误问题
org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
cd /opt/hadoop-2.7.0/ect/hadoop
vim yarn-site.xml
增加2个配置
<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>
<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>
2015-7-23
1. 如果是在Windows上Eclipse连接Hadoop集群,Windows的用户名最好和Linux上运行Hadoop的用户名一样,不然Eclipse上会报很多莫名其妙的错误,应该是权限的问题
2. Liunx的主机名,如果用虚拟机,Copy虚拟机的文件至另外机器时,虚拟机的系统主机名可能会改变,使用hostnamectl status 查看,如果和Hadoop中配置的主机名不再一样,hostnamectl set-hostname xxx来改变主机名
2015-8-28
如果节点机器从其他虚拟机Clone而来,最好修改网卡的MAC地址,否则局域网内是通的,但有可能不能上外网。