前面介绍了linux下hadoop的安装和简单配置,主要是独立模式的配置,所谓独立模式是指不需要运行任何守护进程(daemon),所有程序都再单个JVM上执行,由于在独立模式下测试和调试MapReduce程序较为方便,因此该模式适合用在开发阶段。
这里主要记录了本人配置hadoop伪分布模式的过程。所谓伪分布模式是在单机上模拟Hadoop分布式,单机上的分布式并不是真正的分布式,而是使用java进程模拟分布式运行中的各类节点,包括:NameNode, DataNode, SecondaryNameNode, JobTracker, TaskTracker。其中,前三个概念是从分布式存储的角度来说的:集群节点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份;后两个概念是从分布式应用的角度来说的:集群中的节点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行任务执行。TaskTracker必须运行在DataNode上,这样便于数据的本地化计算,而JobTracker和NameNode则无需运行在同一台机器上。Hadoop本身是无法区分伪分布和分布式的,两种配置也很相似,唯一不同的是伪分布式是在单机上配置,DataNode和NameNode均是同一台机器。
java的安装和Hadoop的安装在前一节已经记录过了,这里略过不谈,下面主要记录伪分布模式的配置。
1.SSH无密码验证配置
在伪分布模式下运行时必须启动守护进程,而启动守护进程的前提是已经成功安装SSH。NameNode将使用SSH协议启动DataNode进程,伪分布模式下DataNode和NameNode均是本身,所以必须配置SSH localhost的无密码验证。
首先,确保SSH已经安装,且服务器正在运行。我机器上是默认安装了的,所以这里不谈。
然后,基于空口令创建一个新SSH密钥,以启用无密码登录:
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
用以下指令进行测试:
$ ssh localhost
这里测试我不知道需不需要重启机器再测试,网上的资料没说要重启,但我是重启了机器才能够通过ssh无密码登录的。
2.修改Hadoop配置文件
Hadoop的各个组件均可利用XML文件进行配置。core-site.xml文件用于配置Common组件的属性,hdfs-site.xml文件用于配置HDFS属性,mapred-site.xml文件则用于配置MapReduce属性。这些配置文件都在conf子目录下。
(1)在hadoop-env.sh中配置Java环境
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0
(2)配置core-site.xml, hdfs-site.xml及mapred-site.xml
core-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
<description>HDFS的URI,文件系统://namenode标识:端口号</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/root/hadoop/hadoop-0.20.2/hadooptmp</value>
<description>namenode上本地的hadoop临时文件夹</description>
</property>
</configuration>
hdfs-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/root/hadoop/hadoop-0.20.2/hdfs/name</value>
<description>namenode上存储hdfs名字空间元数据 </description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/root/hadoop/hadoop-0.20.2/hdfs/data</value>
<description>datanode上数据块的物理存储位置</description>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>副本个数,不配置默认是3,应小于datanode机器数量</description>
</property>
</configuration>
mapred-site.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
<description>jobtracker标识:端口号,不是URI</description>
</property>
<property>
<name>mapred.local.dir</name>
<value>/root/hadoop/hadoop-0.20.2/mapred/local</value>
<description>tasktracker上执行mapreduce程序时的本地目录</description>
</property>
<property>
<name>mapred.system.dir</name>
<value>/tmp/hadoop/mapred/system</value>
<description>这个是hdfs中的目录,存储执行mr程序时的共享文件</description>
</property>
</configuration>
(3)配置masters文件,加入namenode的主机名
文件内容如下:
localhost
(4)配置slaves文件,加入所有datanode的主机名
文件内容如下:
localhost
3.格式化HDFS文件系统
在使用hadoop前,必须格式化一个全新的HDFS安装,通过创建存储目录和NameNode持久化数据结构的初始版本,格式化过程创建了一个空的文件系统。由于NameNode管理文件系统的元数据,而DataNode可以动态的加入或离开集群,因此这个格式化过程并不涉及DataNode。同理,用户也无需关注文件系统的规模。集群中DataNode的数量决定着文件系统的规模。DataNode可以在文件系统格式化之后的很长一段时间内按需增加。
格式化HDFS文件系统非常方便。只需键入如下命令:
$ hadoop namenode -format
该命令输出如下:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost.localdomain/127.0.0.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 0.20.2
STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010
************************************************************/
11/12/17 13:44:58 INFO namenode.FSNamesystem: fsOwner=root,root,bin,daemon,sys,adm,disk,wheel
11/12/17 13:44:58 INFO namenode.FSNamesystem: supergroup=supergroup
11/12/17 13:44:58 INFO namenode.FSNamesystem: isPermissionEnabled=true
11/12/17 13:44:58 INFO common.Storage: Image file of size 94 saved in 0 seconds.
11/12/17 13:44:58 INFO common.Storage: Storage directory /root/hadoop/hadoop-0.20.2/hdfs/name has been successfully formatted.
11/12/17 13:44:58 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1
************************************************************/
4.Hadoop集群启动
为启动HDFS和MapReduce守护进程,输入一下命令:
$ start-dfs.sh
输出如下(可以看出分别启动了namenode, datanode, secondarynamenode,也给出了日志的存放位置):
starting namenode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-secondarynamenode-localhost.localdomain.out
$ start-mapred.sh
输出如下(可以看出分别启动了jobtracker, tasktracker):
starting jobtracker, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /root/hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-localhost.localdomain.out
也可以用下面一条命令代替上面两条命令:
$ start-all.sh
实际上这个脚本里面就是调用了上面的两条命令。
本地计算机将启动三个守护进程:一个namenode,一个辅助namenode和一个datanode。可以浏览logs目录中的日志文件来检查守护进程是否成功启动,或通过Web界面:在http://localhost:50030/查看jobtracker或在http://localhost:50070/查看namenode。此外,java的jps命令也能查看守护进程是否在运行:
$ jps
6129 SecondaryNameNode
6262 JobTracker
6559 Jps
6033 DataNode
6356 TaskTracker
5939 NameNode
终止守护进程也很容易,示例如下:
$ stop-dfs.sh
$ stop-mapred.sh
5.伪分布环境测试
在hadoop的根目录下有几个jar文件,其中hadoop-0.20.2-examples.jar就是我们需要的,它里面包含wordcount,功能是计算输入文本中单词的数量,咱们使用命令建立测试的文件:
(1)先在本地磁盘建立两个输入文件file01和file02:
$ echo "Hello World Bye World" > file01
$ echo "Hello Hadoop Goodbye Hadoop" > file02
(2)在hdfs中建立一个input目录:
$ hadoop fs -mkdir input
(3)将file01和file02拷贝到hdfs中:
$ hadoop fs -copyFromLocal /root/hadoop/file0* input
(4)执行wordcount:
$ hadoop jar hadoop-0.20.2-examples.jar wordcount input output
(5)完成之后,查看结果:
$ hadoop fs -cat output/part-r-00000
执行结果为:
Bye 1
GoodBye 1
Hadoop 2
Hello 2
World 2
也可以进入http://localhost:50030/jobtracker.jsp查看结果:
ok,搞定,很想拿一些大的数据集玩一玩真正全分布模式,不过现在在外面帮导师做项目,机器不够,最少要三台,等回学校了,实验室搞几台机器玩玩。