Hadoop-2.x版本与Hadoop-1.x除了整体架构上的变化之外,比如HDFS联盟,YARN等,目录结构、配置管理及执行脚本都有了很大的改变,具体哪些地方做了改变还需要通过持续地学习来掌握。在此之前,先学习如何以单机模式和伪分布模式运行Hadoop。
默认情况下,Hadoop作为单个Java进程以非分布式模式运行,该模式非常适于用作Debugg。下面展示了Hadoop-2.4.1自带的统计单词数量的例子,在Hadoop的部署目录中新建目录input,并将etc/hadoop中的配置文件复制到新目录中input中,使用bin/Hadoop 的jar命令运行统计单词数量的jar包,将结果输出到output目录中:
[[email protected]]$ mkdir input [[email protected]]$ cp etc/hadoop/*.xml input [[email protected]]$ ls input capacity-scheduler.xml core-site.xml hadoop-policy.xml hdfs-site.xml httpfs-site.xml yarn-site.xml [[email protected]]$ bin/hadoop jarshare/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input output
伪分布模式与单机模式的相同点是都运行在单个节点上,不同点是以伪分布模式运行时每个Hadoop守护进程运行在不同的Java进程中。在Hadoop-2.x版本中,配置文件位于etc/hadoop中,而不是Hadoop-1.x中的conf目录中。修改etc/hadoop/core-site.xml的内容为:
<configuration> <property> <name>fs.defaultFS</name>//Hadoop-1.x中的参数为fs.default.name <value>hdfs://localhost:9000</value> </property> </configuration>
修改etc/hadoop/hdfs-site.xml的内容为:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>
检查是否不用输入密码就能够ssh到localhost,如果不能,则在命令行执行下面的命令:
$ ssh-keygen -tdsa -P '' -f ~/.ssh/id_dsa $ cat~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
下面介绍如何在本地运行MapReduce作业。
1. 首先需要格式化NameNode,不同Hadoop-1.x中的格式化命令bin/hadoopnamenode –format,在Hadoop-2.x中使用$ bin/hdfs namenode -format命令格式化NameNode,目前还可以使用Hadoop-1.x中的格式化命令,但会输出下面的信息:
[hadoop@hadoop hadoop-2.4.1]$ bin/hadoop namenode -format DEPRECATED: Use of this script to execute hdfs command isdeprecated. Instead use the hdfs command for it. 14/07/17 10:08:03 INFO common.Storage: Storage directory/tmp/hadoop-hadoop/dfs/name has been successfully formatted.
2. 守护进程的启停脚本位于sbin目录中,而不是Hadoop-1.x中的bin目录中。格式化NameNode后,使用下面的脚本启动NameNode和DataNode进程:
[hadoop@hadoop hadoop-2.4.1]$ sbin/start-dfs.sh [hadoop@hadoop hadoop-2.4.1]$ jps 5501 NameNode 5897 Jps 5596 DataNode 5790 SecondaryNameNode
可以使用浏览器查看NameNode,默认的URL为http://localhost:50070/。Hadoop守护进程日志的输出到$HADOOP_LOG_DIR中,默认为$HADOOP_HOME/logs。
3. 在HDFS上创建目录,需要注意的是必须按照下面的顺序执行,不可以直接执行第二条命令,否则创建目录失败:
[hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -mkdir /user [hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -mkdir /user/Hadoop oop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -mkdir/user/hadoop/input
[hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -mkdir /user/Hadoop mkdir: `/user/hadoop': No such file or directory
4. 复制文件到分布式文件系统上:
[hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -putetc/hadoop/*.xml input [hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -ls -R/user/hadoop/input -rw-r--r-- 1 hadoopsupergroup 3589 2014-07-17 10:38/user/hadoop/input/capacity-scheduler.xml -rw-r--r-- 1 hadoopsupergroup 880 2014-07-17 10:38/user/hadoop/input/core-site.xml -rw-r--r-- 1 hadoopsupergroup 9257 2014-07-17 10:38/user/hadoop/input/hadoop-policy.xml -rw-r--r-- 1 hadoopsupergroup 865 2014-07-17 10:38/user/hadoop/input/hdfs-site.xml -rw-r--r-- 1 hadoopsupergroup 620 2014-07-17 10:38/user/hadoop/input/httpfs-site.xml -rw-r--r-- 1 hadoopsupergroup 690 2014-07-17 10:38/user/hadoop/input/yarn-site.xml
5. 运行Hadoop自带的统计单词数量的例子,将结果输出的output目录中:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jarwordcount input output [hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -ls -R/user/hadoop/output/ -rw-r--r-- 1 hadoopsupergroup 0 2014-07-17 10:44/user/hadoop/output/_SUCCESS -rw-r--r-- 1 hadoopsupergroup 5650 2014-07-17 10:44/user/hadoop/output/part-r-00000
输出的结果保存在part-r-00000中,可以使用下面的命令查看结果:
[hadoop@hadoop hadoop-2.4.1]$ bin/hdfs dfs -cat/user/hadoop/output/*
6. 使用下面的命令停止NameNode和DateNode守护进程:
[hadoop@hadoop hadoop-2.4.1]$ sbin/stop-dfs.sh [hadoop@hadoop hadoop-2.4.1]$ jps 8337 Jps
在伪分布式模式下,可以将作业运行在YARN上,而这只需要设置很少的几个参数,另外还需要运行ResourceManager和NodeManager守护进程。修改etc/hadoop/mapred-site.xml内容如下:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
修改etc/hadoop/yarn-site.xml内容如下:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
1. 启动ResourceManager和NodeManager守护进程:
[hadoop@hadoop hadoop-2.4.1]$ sbin/start-yarn.sh [hadoop@hadoop hadoop-2.4.1]$ jps 8892 NodeManager 8923 Jps 8798 ResourceManager
可以在浏览器中查看ResourceManager,默认的URL为http://localhost:8088/
2. 在NameNode和DataNode守护进程运行的情况下,执行下面的命令运行MapReduce作业:
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jarwordcount input output
若NameNode和DataNode守护进程没有运行,运行MapReduce作业会出现如下的错误:
java.net.ConnectException: Call From hadoop/127.0.0.1 tolocalhost:9000 failed on connection exception: java.net.ConnectException:Connection refused;
3. 使用下面的命令停止YARN守护进程:
sbin/stop-yarn.sh
Hadoop-2.x与Hadoop-1.x存在着很大的不同,通过上面的学习可以发现一些不同的地方,比如目录结构的变化,守护进程的变化,配置参数的变化,执行脚本的变化等。另外在YARN上运行MapReduce作业也对硬件有更多的需求,在实践过程中,内存1GB时会出现作业执行失败的现象,将内存调整到2GB时作业可以成功完成。