伴随着各大互联网公司开源自己的大数据框架,大数据处理领域的框架已经比较完善。到现在所谓大数据的框架已经用过habase(后来换成了elasticsearch)、zookeeper、kafka、storm,根据项目计划,接下来还要使用spark。虽然在众多框架中仅仅几个,但是也是已经涉及多个方面:数据存储、分布式协调、消息、实时计算等。没有找到任何一个框架能够完美解决所有问题,也就应了那句话,开发领域根本就没有银色子弹。所以即使是比较年长的hadoop(2004年到现在已经12年了,年纪也比较大了),也有能够体现其价值的地方。
最近用了storm,部署topology的时候总是感觉资源使用不平衡,于是想到了yarn能够对hadoop实现资源的协调,那是不是可以扩展一下,对storm也提供资源协调呢。google一下,果然yahho!已经开源了一个storm-yarn组件,于是学习一下,同时也把hadoop的部署复习了一遍。(关于hadoop的单机部署、伪分布式部署可以查看Hadoop环境部署)
这里说的基础操作是指对hadoop环境最基本的修改,比如提供java环境、指定JAVA_HOME
、格式化namenode数据、免密码登录等,这些在Hadoop环境部署中都有提到。不得不说的是,Hadoop部署虽然简单,但是如果配置不正确,可能出现这种那种奇奇怪怪的错误。(这样一想,hadoop真的比较娇气。)
接下来就该对hadoop的文件进行修改,这是重头戏,修改好之后系统就能够顺利启动了。
注意:这里修改了几个默认端口,如果没有特殊需要,可以不做修改。
建议修改hostname,设置成比较容易记忆的,比如:hadoop01.xxx.com或者resourcemanager.xxx.com等,我这里偷懒,直接使用之前设置的。
这里使用了公司的4台服务器:
- s107:yarn的ResourceManager
- s108:hdfs的NameNode;yarn的NodeManager;历史服务器JobHistoryServer
- s109:hdfs的SecondaryNameNode;yarn的NodeManager
- s110:hdfs的DataNode;yarn的NodeManager
- s111:hdfs的DataNode;yarn的NodeManager
因为Secondary NameNode做日志合并的时候需要占用大量CPU和内存,所以这里将Secondary NameNode与NameNode分布在两台机器上。
另外,这里的NameNode和ResourceManager都没有做HA,在生产环境部署也是不完整的,后期会在这里补充。
这个没有什么特别注意的,配置一下NameNode的host和端口、文件队列中io缓冲区大小、临时文件的路径就行:
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://s108:9000value>
<description>NameNode的URIdescription>
property>
<property>
<name>io.file.buffer.sizename>
<value>131072value>
<description>文件队列中io缓冲区大小description>
property>
<property>
<name>hadoop.tmp.dirname>
<value>file:/data/hadoop/datavalue>
property>
configuration>
这个文件是NameNode的相关配置:
<configuration>
<property>
<name>dfs.namenode.http-addressname>
<value>s108:50070value>
property>
<property>
<name>dfs.namenode.rpc-addressname>
<value>s108:9000value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>s109:50090value>
property>
<property>
<name>dfs.namenode.name.dirname>
<value>file:///data/hadoop/data/dfs/namevalue>
<description>NameNode在本地文件系统中存储命名空间和持久化日志的位置description>
property>
<property>
<name>dfs.blocksizename>
<value>268435456value>
<description>HDFS文件块大小:256MBdescription>
property>
<property>
<name>dfs.namenode.handler.countname>
<value>100value>
<description>NameNode服务中处理DataNode的RPC调用的线程数description>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file:///data/hadoop/data/dfs/datavalue>
<description>DataNode存储数据的位置,如果是用逗号隔开的多个路径,每个路径都存一份description>
property>
<property>
<name>dfs.replicationname>
<value>3value>
<description>复制因子,数据复制数description>
property>
<property>
<name>dfs.webhdfs.enabledname>
<value>truevalue>
property>
configuration>
这个文件是配置MapReduce任务的配置:
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
<description>设置执行job的是Yarn框架description>
property>
<property>
<name>mapreduce.map.memory.mbname>
<value>1024value>
<description>map的最大可使用资源description>
property>
<property>
<name>mapreduce.map.java.optsname>
<value>-Xmx1024Mvalue>
<description>map的堆内存description>
property>
<property>
<name>mapreduce.reduce.memory.mbname>
<value>3072value>
<description>reduce的最大可使用资源description>
property>
<property>
<name>mapreduce.reduce.java.optsname>
<value>-Xmx2560Mvalue>
<description>reduce堆内存description>
property>
<property>
<name>mapreduce.task.io.sort.mbname>
<value>512value>
<description>数据排序时的内存大小description>
property>
<property>
<name>mapreduce.task.io.sort.factorname>
<value>100value>
<description>数据排序时合并多个数据流description>
property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopiesname>
<value>50value>
<description>当map数量多于reduce数量时,增加reduce并行副本数量。description>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>s108:10020value>
<description>JobHistoryServer的URIdescription>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>s108:19888value>
<description>JobHistoryServer web服务的URIdescription>
property>
<property>
<name>yarn.app.mapreduce.am.staging-dirname>
<value>/data/hadoop/yarn/stagingvalue>
<description>job数据存储位置description>
property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dirname>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediatevalue>
<description>job的历史数据的临时位置description>
property>
<property>
<name>mapreduce.jobhistory.done-dirname>
<value>${yarn.app.mapreduce.am.staging-dir}/history/donevalue>
<description>job的历史数据的归档位置description>
property>
configuration>
这个是配置ResourceManager和NodeManager的:
<configuration>
<property>
<name>yarn.acl.enablename>
<value>falsevalue>
<description>使用使用ACL,默认是falsedescription>
property>
<property>
<name>yarn.admin.aclname>
<value>*value>
<description>集群中的管理员,用逗号隔开,默认是*,表示谁都可以description>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>falsevalue>
<description>是否开启日志聚类运算description>
property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.classname>
<value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
<property>
<name>yarn.resourcemanager.addressname>
<value>s107:8032value>
<description>客户端提交任务的ResourceManager的URI/description>
property>
<property>
<name>yarn.resourcemanager.scheduler.addressname>
<value>s107:8030value>
<description>向调度器协调资源的URIdescription>
property>
<property>
<name>yarn.resourcemanager.resource-tracker.addressname>
<value>s107:8031value>
<description>为NodeManager提供的URIdescription>
property>
<property>
<name>yarn.resourcemanager.admin.addressname>
<value>s107:8033value>
<description>给管理命令的URIdescription>
property>
<property>
<name>yarn.resourcemanager.webapp.addressname>
<value>s107:8088value>
<description>ResourceManager的web服务URIdescription>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
<description>排序服务description>
property>
configuration>
该文件需要自己创建,用于将NameNode与Secondary NameNode分别部署:
s109
该文件用于指定DataNode的节点,默认是localhost,可以自己填写hostname或ip,每行一个:
s110
s111
至此,可以算是配置结束,还有一些调优的参数,可以根据实际情况进行调整。
先在每个服务器上执行hdfs namenode -format
,然后在s107上执行start-yarn.sh
启动YARN,在s108上执行start-dfs.sh
启动HDFS,在s108上通过mr-jobhistory-daemon.sh start historyserver
启动历史服务器。使用jps
查看进程,可以得到文章开头所列出的进程列表。然后就使用举世闻名的wordcount进行测试。
mkdir input
echo "this is test" >> input/file
echo "this is a test" >> input/file
hadoop dfs -copyFromLocal input /input
hadoop jar ../default/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.3.jar wordcount /input /output
注意:
1. hadoop.tmp.dir、dfs.namenode.name.dir、dfs.datanode.data.dir三个参数指定的文件夹需要提前创建
2. 可以在${PATH}中添加hadoop的sbin目录,将hadoop的脚本或程序添加到PATH中
3. 需要保证hdfs的根目录中没有output文件夹,否则可以改个名字:output2…
4. 因为使用使用Yarn管理任务,可以在浏览器访问http://s107:8088/查看执行状态
个人主页: http://www.howardliu.cn
个人博文: hadoop集群部署(yarn)
CSDN主页: http://blog.csdn.net/liuxinghao
CSDN博文: hadoop集群部署(yarn)