准备工作
安装JDK
JDK版本一般要求是JDK1.7。JDK1.6较新的版本也可以使用。这里使用的是JDK1.8。
官方有一个JDK与Hadoop版本对照表,可以参考一下:http://wiki.apache.org/hadoop/HadoopJavaVersions。
JDK安装完成后需要配置PATH环境变量和JAVA_HOME环境变量。
安装ssh和rsync软件
执行如下的命令安装:
1 2 |
$ sudo apt-get install ssh $ sudo apt-get install rsync |
下载Hadoop
Hadoop的下载地址:http://www.apache.org/dyn/closer.cgi/hadoop/common/。选择需要的版本下载即可。
配置Hadoop的hadoop_env.sh文件
hadoop-env.sh文件用于配置hadoop集群特有的变量信息。在这里至少需要配置JAVA_HOME变量。解压下载的hadoop-xxx.tar.gz文件,移动到部署位置,打开etc/hadoop/hadoop-env.sh文件,添加如下的参数:
1 2 |
# The java implementation to use. export JAVA_HOME=/usr/cust/jdk1.8.0_102 |
这里需要说明一下,如果是单机模式,这一行可以不用配置,但是伪分布式模式下,这一行一定需要配置。虽然可能已经正确的配置了JAVA_HOME环境变量,但是启动时还是可能会报出上述错误,从etc/hadoop/hadoop-env.sh文件关于第一行配置:export JAVA_HOME=${JAVA_HOME}的注释上来看,对于一个分布式集群,这里JAVA_HOME最好显式地指明而不要使用默认的${JAVA_HOME}。对于etc/hadoop/yarn-env.sh也是如此!
到此准备工作算是已经完成。
此外还建议将hadoop的bin和sbin目录添加到系统环境变量PATH中,这样使用起来也方便些。
环境搭建
Hadoop环境搭建有三种模式:
- 单机模式
- 伪分布模式
- 分布模式
因为只是自己使用而且条件也有限,所以只在这里说下前两种方式。
单机模式
默认情况下,hadoop被设置为在非分布式模式下,以单一java进程运行。也就是说完成了准备工作后我们就做好了Hadoop单机模式的搭建。单机模式的Hadoop在程序调试时是很有用的。
在下面的例子中将使用hadoop自带的示例程序做一个演示。我们使用解压后的hadoop的conf目录作为输入内容,通过hadoop中自带的示例程序筛选出符合所提供的正则表达式的内容,并进行展示。进入hadoop安装目录,执行如下脚本:
1 2 3 4 |
$ mkdir input $ cp etc/hadoop/*.xml input $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep input output 'dfs[a-z.]+' $ cat output/* |
上面的代码使用hadoop安装文件中提供的示例应用,完成了在一批文本文件中查找特征文字的工作。
伪分布模式
以伪分布模式部署hadoop后,每个hadoop后台进程都会在独立的java进程上运行。
配置伪分布式hadoop需要按以下步骤来完成。
1.参数设置
配置hadoop伪分布式运行环境至少需要配置两个文件:core-site.xml和hdfs-site.xml。这两个文件位于hadoop的安装目录/etc/hadoop目录下。
core-site.xml是hadoop的核心配置文件。在core-site中至少需要配置HDFS的地址及端口号。如下是core-site.xml的配置信息:
1 2 3 4 5 6 |
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> |
hdfs-site.xml主要用于配置HDFS的相关属性参数。如下是hdfs-site.xml的配置信息:
1 2 3 4 5 6 |
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> |
hdfs-site.xml主要用于配置HDFS的相关属性参数。在这里配置了dfs.replication属性。Dfs.replication用于指定HDFS中每个Block块被复制的次数。起到数据备份的作用。在生产环境中这个属性的值一般被设置为3。这里是伪分布式环境,只有一个节点,因此将之设置为1。
此外,有的人还会考虑将hadoop的tmp目录以及hdfs的namenode和datanode对应的文件目录重置。
调整tmp目录的位置需要修改core-site.xml:
1 2 3 4 5 |
<property> <name>hadoop.tmp.dir</name> <value>file:/home/me/dev/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> |
修改hdfs的namenode和datanode对应的文件目录需要修改hdfs-site.xml:
1 2 3 4 5 6 7 8 |
<property> <name>dfs.namenode.name.dir</name> <value>file:/home/me/dev/hadoop/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/me/dev/hadoop/hdfs/data</value> </property> |
再就是日志目录的调整了。如果有修改日志目录的需要的话可以直接修改hadoop-env.sh 文件,在最前方插入如下内容:
1 2 |
export HADOOP_LOG_DIR=/home/me/dev/hadoop/log export HADOOP_SECURE_DN_LOG_DIR=$HADOOP_LOG_DIR |
以上配置中关于目录的参数取自我自己的开发环境,使用时要根据自己情况重新调整。
2.SSH配置
Hadoop使用ssh协议来管理远程守护进程。首先检查一下是否能使用ssh免密码登录到localhost。指令如下:
1 |
ssh localhost |
如果ssh不能免密码登录到localhost。还需要执行如下指令:
1 2 3 |
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys |
配置完成后如果是首次ssh访问本机,还需要输入yes完成确认。
运行hadoop作业
这一节的内容演示了如何在本地执行MapReduce的Job。下一节会说明如何在yarn上运行MapReduce的Job。执行MapReduce作业可以按如下的步骤。
1. 格式化名称节点
执行如下命令:
1 |
bin/hdfs namenode -format |
namenode主要用来存储HDFS上的文件的元数据信息。而format操作的作用就是为记录元数据做初始化准备。在单机开发环境下,系统可能会多次关闭和重启,然而上面这条命令只能执行一次。如果重复执行了,hdfs上已有的文件就会变成“黑记录”,影响hdfs的正常运行。
2.启动namenode和datanode的守护进程
执行如下命令:
1 |
sbin/start-dfs.sh |
Hadoop守护进程的输出日志位于$HADOOP_LOG_DIR(在hadoop-env.sh中配置)下,默认是$HADOOP_HOME/logs下。
3.访问名称节点
可以使用浏览器通过web接口访问namenode,默认的访问地址是:
1 |
http://localhost:50070 |
界面如下图:
可以看到通过这个地址能够看到一些关于hdfs的信息。前面也提到过namenode中记录的就是hdfs的元数据信息。
4. 设置执行MapReduce job的hdfs目录
执行mapreduce作业如果用到了hdfs,需要先准备一些必要的目录,比如user目录:
1 2 |
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/<username> |
这里的username指的是hdfs所在的系统的用户名。
5.拷贝输入文件到hdfs
执行如下命令:
1 2 |
bin/hdfs dfs -mkdir /input bin/hdfs dfs -put etc/hadoop/*.xml /input |
命令在hdfs创建了一个新的input目录,而后将hadoop安装目录/etc/hadoop下的所有xml文件复制到hdfs上的input目录下。
6. 运行hadoop提供的示例
代码如下:
1 |
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.0.jar grep /input /output 'dfs[a-z.]+' |
这里执行的就是单机模式中的那个程序。
7. 查看输出结果
查看输出结果有两种方式,一是将hdfs文件系统中的文件copy到本地文件系统进行查看,如下面的代码:
1 |
bin/hdfs dfs -get /output ./ |
查看结果:
1 |
cat ./output/* |
结果:
1 2 3 4 |
1 dfsadmin 1 dfs.replication 1 dfs.namenode.name.dir 1 dfs.datanode.data.dir |
或者直接在hdfs上查看:
1 |
bin/hdfs dfs -cat /output/* |
8.退出
在执行完成后,关闭后台进程:
1 |
sbin/stop-dfs.sh |
在伪分布式节点上运行yarn
Hadoop2较之hadoop1的一个变化就是引入了YARN。接下来说一下如何在伪分布模式下配置YARN,并在YARN上运行MapReduce的job。在伪分布模式下配置YARN很简单,只需要修改几个配置文件,然后启动资源管理进程和节点管理进程即可。
1.配置
配置etc/hadoop/mapred-site.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.admin.user.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value> </property> </configuration> |
这里的配置说明了要使用yarn框架执行mapreduce的任务。
配置etc/hadoop/yarn-site.xml:
1 2 3 4 5 6 |
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> |
这里通过yarn的yarn.nodemanager.aux-services项自定义了shuffle服务。
2.启动
启动ResourceManager和NodeManager进程:
1 |
sbin/start-yarn.sh |
3.通过浏览器访问ResourceManager
访问地址是:
1 |
http://localhost:8088/cluster |
4.运行一个mapreduce作业
可以再执行一遍上面的2-7步。
5.关闭yarn
所有工作做完后,关闭yarn:
1 |
sbin/stop-yarn.sh |
参考文档
namenode format做了什么:http://blog.csdn.net/xhh198781/article/details/6904615
hadoop native本地库问题总结:http://blog.csdn.net/ligt0610/article/details/47757013
英文原文:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster.html
##########
发表评论