HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

  • 2008-08-07
  • 本文字数:3895 字

    阅读完需:约 13 分钟

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

2008-08-07 13:3956003

评论

发布
暂无评论
发现更多内容

微服务架构下的核心话题 (一):微服务架构下各类项目的顺势崛起

xcbeyond

架构 微服务

面经手册 · 第2篇《数据结构,HashCode为什么使用31作为乘数?》

小傅哥

Java 数据结构 面试 小傅哥

训练一个数据不够多的数据集是什么体验?

华为云开发者联盟

数据 数据集 华为云 标签 modelarts

一周信创舆情观察(7.27~8.2)

统小信uos

架构师训练营第九章作业

叮叮董董

《RabbitMQ》如何保证消息的可靠性

Java旅途

第9周总结+作业

林毋梦

并发-草稿

superman

JVM系列之:从汇编角度分析Volatile

程序那些事

Java JVM JIT 汇编

秒杀系统的挑战和应对方案

2流程序员

Elasticsearch从入门到放弃:瞎说Mapping

Jackey

elasticsearch

【第九周作业】

Aldaron

SpreadJS 纯前端表格控件应用案例:SPDQD 质量数据云

葡萄城技术团队

SpreadJS 案例

技术贴丨教你使用华为云鲲鹏服务器部署Discuz!论坛

华为云开发者联盟

鲲鹏920 服务器 华为云 Discuz! 华为云鲲鹏

架构师训练营 - 第九周 - 作业

韩挺

当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮

鄙人薛某

Java 面试 集合 java基础

计算机网络基础(十四)---传输层-UDP协议详解

书旅

计算机网络 网络 协议栈 通信协议

NOSQL or NEWSQL

大唐小生

sql nosql

JVM学习总结

jason

树莓派上安装docker记录

田振宇

Docker-compose实战

北漂码农有话说

尚未到来的远程工作

张凯峰

敏捷 敏捷开发 软件开发 远程办公 thoughtworks

架构师训练营第九章总结

叮叮董董

Atlassian 重磅推出12个新功能为您打造全新 DevOps 体验!

Atlassian

项目管理 DevOps Atlassian Jira

Ubuntu启动盘无法格式化

kraken0

秒杀系统的架构设计

莫莫大人

HomeWork

天之彼方

关于微信电子发票生态,这三种服务商最有机会

诸葛小猿

电子发票 发票

我还在生产玩 JDK7,JDK 15 却要来了!|新特性尝鲜

楼下小黑哥

Java jdk

LeetCode题解:189. 旋转数组,3次翻转,JavaScript,详细注释

Lee Chen

大前端 LeetCode

秒杀系统设计初稿

jason

Hadoop中的集群配置和使用技巧_DevOps & 平台工程_岑文初_InfoQ精选文章