构建Hadoop伪分布式环境
2015-10-13 18:30
344 查看
构建Hadoop伪分布式环境
这篇文章介绍Hadoop伪分布式环境的搭建过程与原理,是个人的学习总结,以纪念在各个步骤中遇到的麻烦、踩过的坑!这篇笔记包含这样几个内容:
配置伪分布式环境
运行一个简单的作业
可能遇到的问题及解决办法
配置伪分布式环境
本文中的内容基于Hadoop2,即MapReduce作业运行在Yarn平台之上。打通SSH,实现无密码登陆
由于Hadoop控制脚本需要登陆到集群中的Slave节点执行操作(比如,启动守护进程),如果每一次登录都输入密码,显然不是个好办法。集群中的做法是设定一对秘钥,集群中的节点都能共享。在伪分布式环境下,采用更简单的做法,设定一个空的密码就行了。
需要执行下面的Shell命令:
$ cd ~/.ssh/ $ ssh-keygen -t rsa # 空口令 $ cat id_rsa.pub >> authorized_keys # 加入授权
Hadoop配置文件
我们会在 /hadoop/ect/hadoop 目录下看到一大堆xml配置文件,我们需要关注和修改的有下面这么几个 :
1. etc/hadoop/core-site.xml
这个是Hadoop的核心配置文件,默认是空的,是Hadoop集群的全局配置,我们在配置伪分布式环境的时候需要这样简单的设置 :
<configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:8020</value> </property> </configuration>
2. etc/hadoop/hdfs-site.xml
根据名字,我们知道它是用来配置分布式操作系统的,包含了副本的个数,namenode和datanode的位置,由于,伪分布式环境仍然只是一台机器,所以,我们需要把副本的个数限制为1,配置如下:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
3. etc/hadoop/mapred-site.xml
虽然在Yarn平台上,不再有JobTracker和TaskTracker了,但是,我们仍然需要配置mapred-site,当然,不再是指定原先的那两个守护进程的host了,而是设定MapReduce的运行平台,我们使用的是Yarn平台,那么,按照下面这样设置:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
4. etc/hadoop/yarn-site.xml
Yarn平台上设计了资源管理器和节点管理器,我们在这个配置文件中就需要去配置,另外,由于没有了TaskTracker,那么map的输出传递到reduce就需要一个辅助的service – mapreduce_shuffle, 配置如下:
<configuration> <!-- 指定ResourceManager节点的主机名 --> <property> <name>yarn.resourcemanager.hostname</name> <value>localhost</value> </property> <!-- reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
开启守护进程
我们需要这个几个守护进程 :
NameNode
DataNode
SecondaryNameNode
NodeManager
ResourceManager
NameNode需要我们自己手动的进行格式化操作,DataNode则不需要,在初始化阶段会自动创建,我们需要执行
/hadoop/bin/hdfs namenode -format
接下来,启动分布式文件系统HDFS:
/hadoop/sbin/start-dfs.sh
然后,开启Yarn管理平台:
/hadoop/sbin/start-yarn.sh
到这里,我们的伪分布式环境就搭建好了,下面,我们运行一个简单的作业,这里只是叙述执行方法,并不对作业本身进行描述。
运行一个简单的作业
最好使用一个自己比较熟悉的IDE,并安装合适的构建工具插件,我这里使用的IDE是Intellij,构建工具是Maven。之后,我们编写Map和Reduce程序,并写好作业驱动程序,然后,利用构建工具打包,比如,Maven的方式:mvn -U clean package
之后,执行hadoop命令运行作业:
hadoop jar {your_job}.jar {your_package}.ClassName {target}/input {target}/output
执行了这条语句之后,我们应该能看到类似下面的进度和计数器输出:
15/10/13 15:15:01 INFO mapreduce.Job: Running job: job_1444655578016_0003 15/10/13 15:15:07 INFO mapreduce.Job: Job job_1444655578016_0003 running in uber mode : false 15/10/13 15:15:07 INFO mapreduce.Job: map 0% reduce 0% 15/10/13 15:15:13 INFO mapreduce.Job: map 100% reduce 0% 15/10/13 15:15:18 INFO mapreduce.Job: map 100% reduce 50% 15/10/13 15:15:19 INFO mapreduce.Job: map 100% reduce 100% 15/10/13 15:15:19 INFO mapreduce.Job: Job job_1444655578016_0003 completed successfully 15/10/13 15:15:19 INFO mapreduce.Job: Counters: 49 File System Counters FILE: Number of bytes read=667 FILE: Number of bytes written=347181 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 HDFS: Number of bytes read=524 HDFS: Number of bytes written=1071 HDFS: Number of read operations=9 HDFS: Number of large read operations=0 HDFS: Number of write operations=4 Job Counters Launched map tasks=1 Launched reduce tasks=2 Data-local map tasks=1 Total time spent by all maps in occupied slots (ms)=3229 Total time spent by all reduces in occupied slots (ms)=5230 Total time spent by all map tasks (ms)=3229 Total time spent by all reduce tasks (ms)=5230 Total vcore-seconds taken by all map tasks=3229 Total vcore-seconds taken by all reduce tasks=5230 Total megabyte-seconds taken by all map tasks=3306496 Total megabyte-seconds taken by all reduce tasks=5355520 Map-Reduce Framework Map input records=41 Map output records=41 Map output bytes=573 Map output materialized bytes=667 Input split bytes=116 Combine input records=0 Combine output records=0 Reduce input groups=36 Reduce shuffle bytes=667 Reduce input records=41 Reduce output records=41 Spilled Records=82 Shuffled Maps =2 Failed Shuffles=0 Merged Map outputs=2 GC time elapsed (ms)=66 CPU time spent (ms)=1950 Physical memory (bytes) snapshot=598843392 Virtual memory (bytes) snapshot=2589491200 Total committed heap usage (bytes)=603979776 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=408 File Output Format Counters Bytes Written=1071
可能遇到的问题及解决办法
执行编译好的 class 文件报错这中执行作业的方式,在local环境下是可以的,但是在集群环境下(伪分布式),我们需要把作业打成 jar 包,之后才能运行 hadoop 命令,hadoop 会把你的 jar 包等资源上传到分布式文件系统之中(这些对客户端而言都是透明的),作业才能够“分布式”的执行。
连接不到yarn平台之类的错误
这种错误一般是配置mapred-site.xml的运行框架为yarn之后,没有start-yarn.sh,即没有在执行环境中开启Yarn资源管理平台,只需要运行下控制脚本就可以了。
输出目录已经存在
这个在运行任务的最开始阶段就会报错,因为,默认的MapReduce框架是不会覆盖之前的输出目录的,简单的做法是在作业中判断这个目录是否存在,如果存在直接删除,如下所示:
Path outputPath = new Path(output); outputPath.getFileSystem(conf).delete(outputPath, true);
附:
有些时候为了方便调试,我们会在本地运行MapReduce作业,那么,来回的修改配置文件肯定不是什么好事,我们这里采用《Hadoop权威指南》中的多配置文件方法:
我们在etc/hadoop/目录下新建配置文件 : hadoop-local.xml,填写如下的内容 :
<?xml version="1.0"?> <configuration> <property> <name>fs.default.name</name> <value>file:///</value> </property> <property> <name>mapreduce.framework.name</name> <!-- 包含三种配置 : local, classical, yarn --> <value>local</value> </property> </configuration>
之后,想在本地运行作业的时候就可以使用如下的shell命令:
hadoop ${class_name} -conf ${conf_name} ${input_file} ${out_file}
鉴于本人水平有限,可能会在写作过程中出现错误,感谢指正!
相关文章推荐
- Linux常用命令
- 用 GStreamer 简化 Linux 多媒体开发
- 如何编写systemctl自启动服务 .service文件
- [置顶] 利用openoffice+jodconverter-code-3.0-bate4 把ppt转图片
- linux系统之(一) 深入理解/proc文件系统
- linux源码分析之cpu初始化 kernel/head.s
- 17.1.4.3 Replication Slave Options and Variables 复制Slave 选项和变量
- Linux集群理论及技术
- 淘宝京东类电商评论标签化的思路
- SVN服务器环境搭建
- qemu源码架构
- hadoop集群环境多结点搭建
- Linux下Mysql 5.6.27 tar包安装实践
- tomcat与jetty跑同样代码出现NoSuchMethodError错误
- getopt、getopt_long、getopt_long_only
- Codeforces Round #325 (Div. 2) B. Laurenty and Shop(暴力)
- tomcat一般配置
- C# 知识点随手学习网站推荐
- 新装 nginx 容易报的错误Primary script unknown
- 【linux学习笔记】samba在RHEL7上配置