BT

Hadoop中的集群配置和使用技巧

作者 岑文初 发布于 2008年8月8日 | 被首富的“一个亿”刷屏?不如定个小目标,先把握住QCon上海的优惠吧!

── 分布式计算开源框架Hadoop入门实践(二)

其实参看Hadoop官方文档已经能够很容易配置分布式框架运行环境了,不过这里既然写了就再多写一点,同时有一些细节需要注意的也说明一下,其实也就是这些细节会让人摸索半天。Hadoop可以单机跑,也可以配置集群跑,单机跑就不需要多说了,只需要按照Demo的运行说明直接执行命令即可。这里主要重点说一下集群配置运行的过程。

环境

7台普通的机器,操作系统都是Linux。内存和CPU就不说了,反正Hadoop一大特点就是机器在多不在精。JDK必须是1.5以上的,这个切记。7台机器的机器名务必不同,后续会谈到机器名对于MapReduce有很大的影响。

部署考虑

正如上面我描述的,对于Hadoop的集群来说,可以分成两大类角色:Master和Slave,前者主要配置NameNode和JobTracker的角色,负责总管分布式数据和分解任务的执行,后者配置DataNode和TaskTracker的角色,负责分布式数据存储以及任务的执行。本来我打算看看一台机器是否可以配置成Master,同时也作为Slave使用,不过发现在NameNode初始化的过程中以及TaskTracker执行过程中机器名配置好像有冲突(NameNode和TaskTracker对于Hosts的配置有些冲突,究竟是把机器名对应IP放在配置前面还是把Localhost对应IP放在前面有点问题,不过可能也是我自己的问题吧,这个大家可以根据实施情况给我反馈)。最后反正决定一台Master,六台Slave,后续复杂的应用开发和测试结果的比对会增加机器配置。

实施步骤

  1. 在所有的机器上都建立相同的目录,也可以就建立相同的用户,以该用户的home路径来做hadoop的安装路径。例如我在所有的机器上都建立了/home/wenchu
  2. 下载Hadoop,先解压到Master上。这里我是下载的0.17.1的版本。此时Hadoop的安装路径就是/home/wenchu/hadoop-0.17.1
  3. 解压后进入conf目录,主要需要修改以下文件:hadoop-env.shhadoop-site.xmlmastersslaves

    Hadoop的基础配置文件是hadoop-default.xml,看Hadoop的代码可以知道,默认建立一个Job的时候会建立Job的Config,Config首先读入hadoop-default.xml的配置,然后再读入hadoop-site.xml的配置(这个文件初始的时候配置为空),hadoop-site.xml中主要配置你需要覆盖的hadoop-default.xml的系统级配置,以及你需要在你的MapReduce过程中使用的自定义配置(具体的一些使用例如final等参考文档)。

    以下是一个简单的hadoop-site.xml的配置:

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!-- Put site-specific property overrides in this file. -->
    <configuration>
    <property>
       <name>fs.default.name</name>//你的namenode的配置,机器名加端口
       <value>hdfs://10.2.224.46:54310/</value>
    </property>
    <property>
       <name>mapred.job.tracker</name>//你的JobTracker的配置,机器名加端口
       <value>hdfs://10.2.224.46:54311/</value>
    </property>
    <property>
       <name>dfs.replication</name>//数据需要备份的数量,默认是三
       <value>1</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>//Hadoop的默认临时路径,这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
        <value>/home/wenchu/hadoop/tmp/</value>
    </property>
    <property>
       <name>mapred.child.java.opts</name>//java虚拟机的一些参数可以参照配置
       <value>-Xmx512m</value>
    </property>
    <property>
      <name>dfs.block.size</name>//block的大小,单位字节,后面会提到用处,必须是512的倍数,因为采用crc作文件完整性校验,默认配置512是checksum的最小单元。
      <value>5120000</value>
      <description>The default block size for new files.</description>
    </property>
    </configuration>

    hadoop-env.sh文件只需要修改一个参数:

    # The java implementation to use.  Required.
    export JAVA_HOME=/usr/ali/jdk1.5.0_10

    配置你的Java路径,记住一定要1.5版本以上,免得莫名其妙出现问题。

    Masters中配置Masters的IP或者机器名,如果是机器名那么需要在/etc/hosts中有所设置。Slaves中配置的是Slaves的IP或者机器名,同样如果是机器名需要在/etc/hosts中有所设置。范例如下,我这里配置的都是IP:

    Masters:
    10.2.224.46

    Slaves:
    10.2.226.40
    10.2.226.39
    10.2.226.38
    10.2.226.37
    10.2.226.41
    10.2.224.36
  4. 建立Master到每一台Slave的SSH受信证书。由于Master将会通过SSH启动所有Slave的Hadoop,所以需要建立单向或者双向证书保证命令执行时不需要再输入密码。在Master和所有的Slave机器上执行:ssh-keygen -t rsa。执行此命令的时候,看到提示只需要回车。然后就会在/root/.ssh/下面产生id_rsa.pub的证书文件,通过scp将Master机器上的这个文件拷贝到Slave上(记得修改名称),例如:scp root@masterIP:/root/.ssh/id_rsa.pub /root/.ssh/46_rsa.pub,然后执行cat /root/.ssh/46_rsa.pub >>/root/.ssh/authorized_keys,建立authorized_keys文件即可,可以打开这个文件看看,也就是rsa的公钥作为key,user@IP作为value。此时可以试验一下,从master ssh到slave已经不需要密码了。由slave反向建立也是同样。为什么要反向呢?其实如果一直都是Master启动和关闭的话那么没有必要建立反向,只是如果想在Slave也可以关闭Hadoop就需要建立反向。
  5. 将Master上的Hadoop通过scp拷贝到每一个Slave相同的目录下,根据每一个Slave的Java_HOME的不同修改其hadoop-env.sh
  6. 修改Master上/etc/profile:
    新增以下内容:(具体的内容根据你的安装路径修改,这步只是为了方便使用)
    export HADOOP_HOME=/home/wenchu/hadoop-0.17.1
    export PATH=$PATH:$HADOOP_HOME/bin
    修改完毕后,执行source /etc/profile来使其生效。
  7. 在Master上执行Hadoop namenode –format,这是第一需要做的初始化,可以看作格式化吧,以后除了在上面我提到过删除了Master上的hadoop.tmp.dir目录,否则是不需要再次执行的。
  8. 然后执行Master上的start-all.sh,这个命令可以直接执行,因为在6中已经添加到了path路径,这个命令是启动hdfs和mapreduce两部分,当然你也可以分开单独启动hdfs和mapreduce,分别是bin目录下的start-dfs.shstart-mapred.sh
  9. 检查Master的logs目录,看看Namenode日志以及JobTracker日志是否正常启动。
  10. 检查Slave的logs目录看看Datanode日志以及TaskTracker日志是否正常。
  11. 如果需要关闭,那么就直接执行stop-all.sh即可。

以上步骤就可以启动Hadoop的分布式环境,然后在Master的机器进入Master的安装目录,执行hadoop jar hadoop-0.17.1-examples.jar wordcount输入路径和输出路径,就可以看到字数统计的效果了。此处的输入路径和输出路径都指的是HDFS中的路径,因此你可以首先通过拷贝本地文件系统中的目录到HDFS中的方式来建立HDFS中的输入路径:

hadoop dfs -copyFromLocal /home/wenchu/test-in test-in。其中/home/wenchu/test-in是本地路径,test-in是将会建立在HDFS中的路径,执行完毕以后可以通过hadoop dfs –ls看到test-in目录已经存在,同时可以通过hadoop dfs –ls test-in查看里面的内容。输出路径要求是在HDFS中不存在的,当执行完那个demo以后,就可以通过hadoop dfs –ls 输出路径看到其中的内容,具体文件的内容可以通过hadoop dfs –cat文件名称来查看。

经验总结和注意事项(这部分是我在使用过程中花了一些时间走的弯路):

  1. Master和Slave上的几个conf配置文件不需要全部同步,如果确定都是通过Master去启动和关闭,那么Slave机器上的配置不需要去维护。但如果希望在任意一台机器都可以启动和关闭Hadoop,那么就需要全部保持一致了。
  2. Master和Slave机器上的/etc/hosts中必须把集群中机器都配置上去,就算在各个配置文件中使用的是IP。这个吃过不少苦头,原来以为如果配成IP就不需要去配置Host,结果发现在执行Reduce的时候总是卡住,在拷贝的时候就无法继续下去,不断重试。另外如果集群中如果有两台机器的机器名如果重复也会出现问题。
  3. 如果在新增了节点或者删除节点的时候出现了问题,首先就去删除Slave的hadoop.tmp.dir,然后重新启动试试看,如果还是不行那就干脆把Master的hadoop.tmp.dir删除(意味着dfs上的数据也会丢失),如果删除了Master的hadoop.tmp.dir,那么就需要重新namenode –format
  4. Map任务个数以及Reduce任务个数配置。前面分布式文件系统设计提到一个文件被放入到分布式文件系统中,会被分割成多个block放置到每一个的DataNode上,默认dfs.block.size应该是64M,也就是说如果你放置到HDFS上的数据小于64,那么将只有一个Block,此时会被放置到某一个DataNode中,这个可以通过使用命令:hadoop dfsadmin –report就可以看到各个节点存储的情况。也可以直接去某一个DataNode查看目录:hadoop.tmp.dir/dfs/data/current就可以看到那些block了。Block的数量将会直接影响到Map的个数。当然可以通过配置来设定Map和Reduce的任务个数。Map的个数通常默认和HDFS需要处理的blocks相同。也可以通过配置Map的数量或者配置minimum split size来设定,实际的个数为:max(min(block_size,data/#maps),min_split_size)。Reduce可以通过这个公式计算:0.95*num_nodes*mapred.tasktracker.tasks.maximum

总的来说出了问题或者启动的时候最好去看看日志,这样心里有底。

Hadoop中的命令(Command)总结

这部分内容其实可以通过命令的Help以及介绍了解,我主要侧重于介绍一下我用的比较多的几个命令。Hadoop dfs 这个命令后面加参数就是对于HDFS的操作,和Linux操作系统的命令很类似,例如:

  • Hadoop dfs –ls就是查看/usr/root目录下的内容,默认如果不填路径这就是当前用户路径;
  • Hadoop dfs –rmr xxx就是删除目录,还有很多命令看看就很容易上手;
  • Hadoop dfsadmin –report这个命令可以全局的查看DataNode的情况;
  • Hadoop job后面增加参数是对于当前运行的Job的操作,例如list,kill等;
  • Hadoop balancer就是前面提到的均衡磁盘负载的命令。

其他就不详细介绍了。

相关阅读:

  1. 分布式计算开源框架Hadoop介绍――分布式计算开源框架Hadoop入门实践(一)
  2. Hadoop基本流程与应用开发――分布式计算开源框架Hadoop入门实践(三)

作者介绍:岑文初,就职于阿里软件公司研发中心平台一部,任架构师。当前主要工作涉及阿里软件开发平台服务框架(ASF)设计与实现,服务集成平台(SIP)设计与实现。没有什么擅长或者精通,工作到现在唯一提升的就是学习能力和速度。个人Blog为:http://blog.csdn.net/cenwenchu79

参与InfoQ中文站内容建设,请邮件至editors@cn.infoq.com。也欢迎大家到InfoQ中文站用户讨论组参与我们的线上讨论。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

我还没成功运行过 by linbin chen

不错, 介绍的好. 我之前也配置过, 但计算时卡住了, 几次都是这样, 不知什么原因.

一起学习,你将hadoop用到实际应用中去了吗? by zhang qiaohui

早些时候,我们在3台机器上成功部署运行过(hadoop/hbase),好像也曾记录过配置过程,地址在此:solomons.javaeye.com
有机会一起探讨下,目前我正在hadoop的基础上研究pig这个东东,来分析网站日志
期待楼主在实际应用中的经验

hadoop namenode -format 这个格式化是格式化的所有硬盘么? by jackey shi

hadoop namenode -format 这个格式化是格式化的所有硬盘么?

Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么? by jackey shi

08/08/13 10:53:21 INFO dfs.Storage: Storage directory /tmp/hadoop-tmp/dfs/name has been successfully formatted.

看样子只是格式化存储目录,真不太清楚这个所谓的format有什么功用????

Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么? by jackey shi

root@cmstest251-189 hadoop-0.17.1]# bin/start-all.sh
starting namenode, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-namenode-cmstest251-189.hexun.com.out
10.0.251.190: starting datanode, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-datanode-cmstest251-190.hexun.com.out
10.0.251.120: starting datanode, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-datanode-cms251-120.hexun.com.out
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 166: /usr/java/jdk/bin/java: 没有那个文件或目录
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 251: /usr/java/jdk/bin/java: 没有那个文件或目录
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 251: exec: /usr/java/jdk/bin/java: cannot execute: 没有那个文件或目录
10.0.251.189: starting secondarynamenode, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-secondarynamenode-cmstest251-189.hexun.com.out
starting jobtracker, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-jobtracker-cmstest251-189.hexun.com.out
10.0.251.190: starting tasktracker, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-tasktracker-cmstest251-190.hexun.com.out
10.0.251.120: starting tasktracker, logging to /usr/local/hadoop-0.17.1/bin/../logs/hadoop-root-tasktracker-cms251-120.hexun.com.out
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 166: /usr/java/jdk/bin/java: 没有那个文件或目录
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 251: /usr/java/jdk/bin/java: 没有那个文件或目录
10.0.251.120: /usr/local/hadoop-0.17.1/bin/../bin/hadoop: line 251: exec: /usr/java/jdk/bin/java: cannot execute: 没有那个文件或目录
[root@cmstest251-189 hadoop-0.17.1]# pslt -i:9000


没有那个文件或目录,这个什么错

Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么? by cen wenchu

初始化namenode,为HDFS作第一次运行的准备。

hadoop的使用 by 隋 酸菜

设置好必要的配置,能正常启动 hadoop的一些脚本 比如strat-all.sh等
那又如何跟C++程序结合起来使用?
有C++接口没?

遇到和你同样的问题, by 周 辉

您好:
我在部署hadoop时遇到了同样的问题,请问你提出的问题解决了吗?如果解决了请告诉我是怎么解决的,谢谢了。非常感谢。

遇到和 jackey 1同样的问题, by 周 辉

刚才问题没说清楚,我是遇到和 jackey 1同样的问题,有谁知道怎么解决吗?

Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么? by han tixiang

你jdk没有安装好

Re: hadoop namenode -format 这个格式化是格式化的所有硬盘么? by Stone Junny

不是格式化所有硬盘,在配置的时候,已经指定的HDFS的namenode的文件系统配置:
<property>
<name>fs.default.name</name>//你的namenode的配置,机器名加端口
<value>hdfs://10.2.224.46:54310/</value>
</property>
HDFS就像一个普通的文件系统一样,你在使用之前先要格式化一下计算HDFS能够使用的存储空间,所以要执行这个format操作。

namenode和 datanode 必须 用不同的主机名 by li guoqing

您好,我现在的问题是 , namenode和 datanode 必须 用不同的主机名。该怎么配置 ?????

一台pc同时作为master与slave是没问题的,不知道版主为啥不行那?? by Terry Liu

我就是一台PC作为master(nameNode),同时作为slave(dataNode),然后start-all.sh,没有发现什么问题,查看datanode也确实这个master在里面。

一台pc同时作为master与slave是没问题的,不知道版主为啥不行那?? by Terry Liu

我就是一台PC作为master(nameNode),同时作为slave(dataNode),然后start-all.sh,没有发现什么问题,查看datanode也确实这个master在里面。

一台pc同时作为master与slave是没问题的,不知道版主为啥不行那?? by Terry Liu

我就是一台PC作为master(nameNode),同时作为slave(dataNode),然后start-all.sh,没有发现什么问题,查看datanode也确实这个master在里面。

一台pc同时作为master与slave是没问题的,不知道版主为啥不行那?? by Terry Liu

我就是一台PC作为master(nameNode),同时作为slave(dataNode),然后start-all.sh,没有发现什么问题,查看datanode也确实这个master在里面。

一台pc同时作为master与slave是没问题的,不知道版主为啥不行那?? by Terry Liu

我就是一台PC作为master(nameNode),同时作为slave(dataNode),然后start-all.sh,没有发现什么问题,查看datanode也确实这个master在里面。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

17 讨论
提供反馈
错误报告
商务合作
内容合作
Marketing
InfoQ.com及所有内容,版权所有 © 2006-2016 C4Media Inc. InfoQ.com 服务器由 Contegix提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司 京ICP备09022563号-7 隐私政策
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.