Cloudera CDH4.7 Hadoop 分布式安装指南及注意事项

cloudera 作为一家专业的大数据解决方案公司,基于 apache hadoop 推出了自己的 hadoop 版本,致力于打造自己的大数据生态圈。cloudera 版本的 hadoop 无论是从稳定性和易用性上来说都要比 apache 开源的出色不少,因此越来越多的公司选择了 cloudera 开源的 hadoop 或者采购 cloudera 的商业大数据解决方案。 

今天咱们就来看看如何手动安装 cloudera hadoop,体验新一代的hadoop大数据平台。(PS:当然了你也可以选择使用它们家提供的管理软件来安装、部署,这不在本文的讨论范畴。)

本文选择的是 cdh 4.7,该版本的下载请看这里:

http://archive.cloudera.com/cdh4/cdh/4/

cdh 5 下载请见:

http://archive.cloudera.com/cdh5/cdh/5/

1、硬件资源规划

192.168.1.111      host01    NameNode、ResourceManager
192.168.1.112      host02    SecondaryNameNode、DataNode、NodeManager
192.168.1.113      host03    DataNode、NodeManager

2、部署过程

2.1 修改每台机器的名称

cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=host01

PS:

  • 如果你的 hosts 已经做了映射,可以不必修改。

  • 上面的方案是永久生效的,但需要重启后生效。如果想临时生效,可以执行 hostname urname

2.2 在各个节点上修改/etc/hosts增加以下内容

192.168.1.111      host01
192.168.1.112      host02
192.168.1.113      host03

2.3 配置ssh无密码登陆, 确保host01可以无密码登陆到其他机器上

步骤及注意事项请参见:http://my.oschina.net/leejun2005/blog/285795

PS: host01 也需要对自己做免密码登录,如果有防火墙也请关闭:service iptables stop

2.4 请确保已经安装了 jdk,如果没有,请安装 jdk1.6 或者 1.7 (可以 yum install java-1.6.0-openjdk-devel

2.5 配置 Hadoop

2.5.1 在NameNode上配置以下文件:core-site.xml

fs.defaultFS指定NameNode文件系统,开启回收站功能,fs.trash.interval 单位为分钟,0 表示关闭回收站。

vi hadoop-2.0.0-cdh4.7.0/etc/hadoop/core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
	<!--fs.default.name for MRV1 ,fs.defaultFS for MRV2(yarn) -->
	<property>
		<name>fs.defaultFS</name>
		<!--这个地方的值要和hdfs-site.xml文件中的dfs.federation.nameservices一致-->
		<value>hdfs://host01</value>
	</property>
	<property>
		<name>fs.trash.interval</name>
		<value>0</value>
	</property>
	<property>
		<name>fs.trash.checkpoint.interval</name>
		<value>10080</value>
	</property>
	<!-- web ui 页面,想通过application id 查看作业详情或者 hdfs 路径,报错没有权限: -->
	<!-- 你需要修改 value 值为正确的hadoop属主用户 -->
	<property>
		<name>hadoop.http.staticuser.user</name>
		<value>root</value>
	</property>

</configuration>

2.5.2 hdfs-site.xml 

该文件主要设置数据副本保存份数,以及namenode、datanode数据保存路径以及http-address。

dfs.namenode.name.dir指定NameNode存储meta和editlog的目录,
dfs.datanode.data.dir指定DataNode存储blocks的目录,
dfs.namenode.secondary.http-address指定Secondary NameNode地址。
开启WebHDFS。

vi hadoop-2.0.0-cdh4.7.0/etc/hadoop/hdfs-site.xml 

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>

	<property>
		<name>hadoop.tmp.dir</name>
		<value>/home/storm/soft/hadoopData/hadoop-${user.name}</value>
	</property>

	<property>
		<name>dfs.namenode.http-address</name>
		<value>host01:50070</value>
	</property>

	<property>
		<name>dfs.namenode.secondary.http-address</name>
		<value>host02:50090</value>
	</property>

	<property>
		<name>dfs.webhdfs.enabled</name>
		<value>true</value>
	</property>
</configuration>

2.5.3 映射NameNode、DataNode节点主机

vi hadoop-2.0.0-cdh4.7.0/etc/hadoop-mapreduce1-secure/masters

host01
host02

vi hadoop-2.0.0-cdh4.7.0/etc/hadoop/slaves 

host02
host03

2.6 配置MapReduce

2.6.1 mapred-site.xml 

配置使用yarn计算框架,以及jobhistory的地址。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>mapreduce.shuffle.port</name>
		<value>8017</value>
	</property>

	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>

	<property>
		<name>mapreduce.jobhistory.address</name>
		<value>host01:10020</value>
	</property>

	<property>
		<name>mapreduce.jobhistory.webapp.address</name>
		<value>host01:19888</value>
	</property>
</configuration>

2.6.2 yarn-site.xml 

主要配置resourcemanager地址以及yarn.application.classpath

(这个路径很重要,要不然集成hive时候会提示找不到class)

注意:如果你用的是 CDH 5,那么 yarn.nodemanager.aux-services 的属性值应该改为 mapreduce_shuffle

否则 nodemanager 会抛异常:

2013-10-29 11:32:21,523 FATAL org.apache.hadoop.yarn.server.nodemanager.NodeManager: Error starting NodeManager
java.lang.IllegalArgumentException: The ServiceName: mapreduce.shuffle set in yarn.nodemanager.aux-services is invalid.The valid service name should only
&nbsp;contain a-zA-Z0-9_ and can not start with numbers

<?xml version="1.0"?>
<configuration>

	<property>
		<name>yarn.resourcemanager.resource-tracker.address</name>
		<value>host01:8031</value>
	</property>
	<property>
		<name>yarn.resourcemanager.address</name>
		<value>host01:8032</value>
	</property>
	<property>
		<name>yarn.resourcemanager.scheduler.address</name>
		<value>host01:8030</value>
	</property>
	<property>
		<name>yarn.resourcemanager.admin.address</name>
		<value>host01:8033</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address</name>
		<value>host01:8088</value>
	</property>
	<property>
		<description>Classpath for typical applications.</description>
		<name>yarn.application.classpath</name>
		<value>$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,
    $HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
    $HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,
    $YARN_HOME/share/hadoop/yarn/*,$YARN_HOME/share/hadoop/yarn/lib/*,
    $YARN_HOME/share/hadoop/mapreduce/*,$YARN_HOME/share/hadoop/mapreduce/lib/*</value>
	</property>
	<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.nodemanager.local-dirs</name>
		<value>/home/storm/soft/hadoopData/local</value>
	</property>
	<property>
		<name>yarn.nodemanager.log-dirs</name>
		<value>/home/storm/soft/hadoopData/logs</value>
	</property>
	<property>
		<description>Where to aggregate logs</description>
		<name>yarn.nodemanager.remote-app-log-dir</name>
		<value>/home/storm/soft/hadoopData/logs</value>
	</property>

	<property>
		<name>yarn.app.mapreduce.am.staging-dir</name>
		<value>/home/storm/soft/hadoopData/users</value>
	</property>

</configuration>

2.6.3 设置 hadoop 和 yarn 的 JAVA_HOME 环境变量

vi hadoop-env.sh 和  yarn-env.sh 添加:

export JAVA_HOME=/opt/soft/jdk1.7.0_55

否则启动 start-dfs.sh 会报:Error: JAVA_HOME is not set and could not be found.

2.6.4 配置 linux 系统环境变量并同步

修改.bashrc环境变量,并将其同步到其他几台机器,并且最后需要 source .bashrc 或重登录。

在 .bashrc 的末尾插入以下变量,其中的具体路径根据你自己的环境去修改,请不要生搬硬套:

#-----------------------------hadoop ENV---------------------------------
export LANG=zh_CN.utf8

export JAVA_HOME=/opt/soft/jdk1.7.0_55
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib

export HADOOP_HOME=/home/storm/soft/hadoop-2.0.0-cdh4.7.0

export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export YARN_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_HOME}/etc/hadoop

export PATH=$CLASSPATH:$HADOOP_HOME:.:$PATH:$HOME/bin:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$HIVE_HOME/bin

alias hd="cd ~/soft/hadoop-2.0.0-cdh4.7.0"
#-----------------------------hadoop ENV---------------------------------

2.7 将 host01 上的 hadoop-2.0.0-cdh4.7.0 拷贝到其他机器上的相同路径下

至此,整个安装过程完毕。

3、启动与测试

3.1 启动脚本

  • 第一次启动hadoop需要先格式化NameNode,该操作只做一次。当修改了配置文件中路径等核心属性时,需要重新格式化

cd hadoop-2.0.0-cdh4.7.0/sbin

hadoop namenode -format

  • 在 host01 上启动hdfs:

start-dfs.sh

  • 在 host01 上启动mapreduce:

start-yarn.sh

  • 在 host01 上启动historyserver:

mr-jobhistory-daemon.sh start historyserver

PS:或者直接一起来:start-all.sh

不过脚本会提示你该脚本已被废弃,建议你按上述步骤一步步的来。

3.2 查看集群信息

  • 查看MapReduce

http://host01:8088/cluster

  • 查看节点

http://host01:8042/node

  • 检查集群进程

storm@host01 192.168.1.111 11:10:58 ~/soft/hadoop-2.0.0-cdh4.7.0/etc/hadoop >
    jps
2678 NameNode
2983 ResourceManager
8419 Jps
3446 JobHistoryServer
storm@host01 192.168.1.111 11:15:37 ~/soft/hadoop-2.0.0-cdh4.7.0/etc/hadoop >


storm@host02 192.168.1.112 11:15:53 ~/soft/hadoop-2.0.0-cdh4.7.0/sbin >
     jps
9443 Jps
5218 DataNode
5537 NodeManager
5377 SecondaryNameNode
storm@host02 192.168.1.112 11:21:28 ~/soft/hadoop-2.0.0-cdh4.7.0/sbin >

3.3 用代码测试集群可用性

你可用自带的 example 测试或者看这里:

http://my.oschina.net/leejun2005/blog/83058

4、可能遇到的问题

(1)问题:DataNode 节点只有 DataNode 进程起来了,却不见 NodeManager 进程

查看节点上的相应日志报错:

2014-07-01 11:43:19,674 ERROR org.apache.hadoop.yarn.service.CompositeService: Error starting services org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl
org.jboss.netty.channel.ChannelException: Failed to bind to: 0.0.0.0/0.0.0.0:8080

很明显属于端口占用问题,关键是 8080 端口可能已经被 storm、hbase、tomcat、jetty 等应用占用了(netstat -tlnp|grep 8080),如何做到不修改前面的应用端口而修改 NodeManager 的侦听端口呢?如果你仔细看过 2.6.2 小节就知道 mapreduce.shuffle.port 是正解。

这里我要留一个问题:为什么是这个属性?这个属性和上面的报错有什么关系呢?如果你了解 mapreduce 的原理与架构相信这个问题不难回答。

(2)datanode无法启动的问题,报错如下:

2013-06-08 17:57:27,519 FATAL org.apache.hadoop.hdfs.server.datanode.DataNode: Initialization failed for block pool Block pool BP-770817654-172.17.50.119-1370685416301 (storage id DS-803461661-172.17.50.119-50010-1370681848198) service to localhost/127.0.0.1:9000
java.io.IOException: Incompatible clusterIDs in /usr/hadoop/tmp/dfs/data: namenode clusterID = CID-cd47cf1e-0f81-41b0-97df-7407db9f1fa5; datanode clusterID = CID-0462092f-2740-40a4-bf96-246be2efc49f
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:390)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:190)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:218)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.initStorage(DataNode.java:851)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.initBlockPool(DataNode.java:822)
        at org.apache.hadoop.hdfs.server.datanode.BPOfferService.verifyAndSetNamespaceInfo(BPOfferService.java:279)
        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.connectToNNAndHandshake(BPServiceActor.java:218)
        at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:661)
        at java.lang.Thread.run(Thread.java:619)

通过在网上查找资料得知:每次namenode format会重新创建一个namenodeId, 而tmp/dfs/data下包含了上次format下的id, namenode format清空了namenode下的数据, 但是没有晴空datanode下的数据,导致启动时失败,所要做的就是每次fotmat前,清空tmp一下 的所有目录.

结果:删除/usr/hadoop/tmp下的所有内容即可。

http://www.cnblogs.com/agilework/archive/2013/06/08/3127286.html

5、refer

Port 8080 In YARN  http://qnalist.com/questions/107490/port-8080-in-yarn

Cloudera Documentation  http://www.cloudera.com/content/support/en/documentation.html

手动安装Hadoop Cloudera CDH4.2版本  http://hao3721.iteye.com/blog/1914088

手动安装cloudera cdh4.2 hadoop + hbase + hive(一)  http://blog.csdn.net/qiaochao911/article/details/8915976

Hadoop YARN安装部署初探  http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-install/

Hadoop MapReduce Next Generation - Cluster Setup  

http://archive-primary.cloudera.com/cdh4/cdh/4/hadoop/hadoop-project-dist/hadoop-common/ClusterSetup.html

Ports Used by Components of CDH 5

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_ig_ports_cdh5.html

你可能感兴趣的:(Cloudera CDH4.7 Hadoop 分布式安装指南及注意事项)