Sunday, January 30, 2011

linux下单机模式的hadoop部署

From: http://hi.baidu.com/zengjianyuan/blog/item/c86fa10fa3e386e6ab645780.html


2010-01-25 17:51
就是想了解一下这个东西怎么跑的,为以后工作做准备。

需要软件:
ssh:fedore 9 自带。
jdk:http://java.sun.com/javase/downloads /index.jsp,下最近版本jdk-6u18-linux-i586
hadoop:http://apache.etoak.com/hadoop/core/hadoop- 0.20.1/,最新版本0.20.1,据说这个版本jdk必须1.6以上。

三种运行模式:
单机(非分布式)模式,伪分布式运行模式(用不同进程模仿分布式运行中的各类结点),分布式运行模式。

其中前两种运行模式体现不了Hadoop分布式计算的优势,并没有什么实际意义,但对程序的测试及调试很有帮助。现在只有一台机器, 主要想了解基于Hadoop的分布式并行程序是如何运行的。

单机模式安装步骤:
1.解压安装包至:/usr/local/hadoop
如果安装jdk已经设置了路径,安装完毕。否则:
2.cd /usr/local/hadoop/conf,修改hadoop-env.sh,最后一行添加:export JAVA_HOME=/usr/local/jdk1.6.0_18(jdk路径).

看看这玩意怎么跑的:
1.
[root@localhost hadoop]# mkdir input
[root@localhost hadoop]# cp conf/*.xml input
[root@localhost hadoop]# bin/hadoop jar hadoop-0.20.1-examples.jar grep input output 'dfs[a-z.]+'
10/01/26 00:22:54 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
10/01/26 00:22:54 INFO mapred.FileInputFormat: Total input paths to process : 5
...
[root@localhost hadoop]# cat output/*
1    dfsadmin
[root@localhost hadoop]# ls output/
part-00000
程序是hadoop自带的,把conf下的xml文件拷贝到input下作为输入,找到并显示所有与最后一个正则表达式匹配的行,输出到output.
jar 是 bin/hadoop 脚本定义的参数,会调用 Hadoop 自己的一个工具类 RunJar,这个工具类能够执行一个 Jar 文件。
2.
[root@localhost hadoop]# mkdir test-in
[root@localhost hadoop]# echo "hello world bye world" > test-in/file1.txt
[root@localhost hadoop]# echo "hello hadoop googbye hadoop" > test-in/file2.txt
[root@localhost hadoop]# bin/hadoop jar hadoop-0.20.1-examples.jar wordcount  test-in test-out
10/01/26 00:43:46 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
10/01/26 00:43:46 INFO input.FileInputFormat: Total input paths to process : 2
...
[root@localhost hadoop]# cat test-out/*
bye    1
googbye    1
hadoop    2
hello    2
world    2
[root@localhost hadoop]# ls test-out/
part-r-00000
这个程序也是hadoop自带的,统计各个单词出现次数。

刚开始上网搜的结果都是修改fs.default.name,mapred.job.tracker等等,都是分布式运行模式的配置,没想到单机模式这么 简单,浪费了不少时间。

参考:
http://blog.csdn.net/inkfish/archive/2010/01/07/5149858.aspx
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html


伪分布模式也是在一台单机上运行,但用不同的 Java 进程模仿分布式运行中的各类结点 ( NameNode, DataNode, JobTracker, TaskTracker, Secondary NameNode ),分布式运行中的这几个结点的区别:
从分布式存储的角度来说,集群中的结点由一个 NameNode 和若干个 DataNode 组成, 另有一个 Secondary NameNode 作为 NameNode 的备份。
从分布式应用的角度来说,集群中的结点由一个 JobTracker 和若干个 TaskTracker 组成,JobTracker 负责任务的调度,TaskTracker 负责并行执行任务。
TaskTracker 必须运行在 DataNode 上,这样便于数据的本地计算。JobTracker 和 NameNode 则无须在同一台机器上。

伪分布模式安装步骤:
1.解压到某目录下并设置JAVA_HOME。

2.修改配置文件:
a)修改conf/core-site.xml:
<configuration>  
<property>  
<name>fs.default.name</name>  
<value>hdfs://localhost:9000</value>  
</property>  
</configuration>
b)修改conf/mapred-site.xml:
<configuration>  
<property>  
<name>mapred.job.tracker</name>  
<value>localhost:9001</value>  
</property>  
</configuration>
c)修改conf/hdfs-site.xml:
<configuration>  
<property>  
<name>dfs.replication</name>  
<value>1</value>  
</property>  
</configuration> 
#参数 fs.default.name 指定 NameNode 的 IP 地址和端口号。缺省值是 file:///, 表示使用本地文件系统, 用于单机非分布式模式。此处我们指定使用运行于本机 localhost 上的 NameNode。
#参数 mapred.job.tracker 指定 JobTracker 的 IP 地址和端口号。缺省值是 local, 表示在本地同一 Java 进程内执行 JobTracker 和 TaskTracker, 用于单机非分布式模式。此处我们指定使用运行于本机 localhost 上的 JobTracker ( 用一个单独的 Java 进程做 JobTracker )。
#参数 dfs.replication 指定 HDFS 中每个 Block 被复制的次数,起数据冗余备份的作用。 在典型的生产系统中,这个数常常设置为3。

3.配置ssh,使得本机ssh登录本机无密码。
[root@localhost hadoop]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
74:79:98:eb:fa:e0:53:aa:e3:1b:e4:a4:16:7a:6b:31 root@localhost.localdomain
[root@localhost hadoop]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

4.格式化hadoop系统并启动。
[root@localhost hadoop]# bin/hadoop namenode -format    #第一次启动hadoop先要格式化整个hadoop系统       
[root@localhost hadoop]# bin/start-all.sh         #bin下有相关启动,停止命令。
starting namenode, logging to /usr/local/hadoop/bin/../logs/hadoop-sword-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-root-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-root-secondarynamenode-localhost.localdomain.out
starting jobtracker, logging to /usr/local/hadoop/bin/../logs/hadoop-sword-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-root-tasktracker-localhost.localdomain.out

故障诊断:
(1) 执行 $ bin/start-all.sh 启动 Hadoop 进程后,会启动5个 java 进程(如上), 同时会在 /tmp 目录下创建五个 pid 文件记录这些进程 ID 号。通过这五个文件,可以得知 namenode, datanode, secondary namenode, jobtracker, tasktracker 分别对应于哪一个 Java 进程。当你觉得 Hadoop 工作不正常时,可以首先查看这5个 java 进程是否在正常运行。
(2) 使用 web 接口。访问 http://localhost:50030 可以查看 JobTracker 的运行状态。访问 http://localhost:50060 可以查看 TaskTracker 的运行状态。访问 http://localhost:50070 可以查看 NameNode 以及整个分布式文件系统的状态,浏览分布式文件系统中的文件以及 log 等。
(3) 查看 ${HADOOP_HOME}/logs 目录下的 log 文件,namenode, datanode, secondary namenode, jobtracker, tasktracker 各有一个对应的 log 文件,每一次运行的计算任务也有对应用 log 文件。分析这些 log 文件有助于找到故障原因。

看看它怎么跑的 :
[root@localhost hadoop]# bin/hadoop dfs -put ./test-in input
#将本地文件系统上的 ./test-in 目录拷到 HDFS 的根目录上,目录名改为 input
#执行 bin/hadoop dfs –help 可以学习各种 HDFS 命令的使用。
[root@localhost hadoop]# bin/hadoop jar hadoop-0.20.1-examples.jar wordcount input output
#下面查看执行结果:
#将文件从 HDFS 拷到本地文件系统中再查看:
[root@localhost hadoop]# bin/hadoop dfs -get output ./output #最后一个参数是本地文件
[root@localhost hadoop]# cat output/*
cat: output/_logs: 是一个目录
bye    1
googbye    1
hadoop    2
hello    2
world    2
#也可以直接查看
[root@localhost hadoop]# bin/hadoop dfs -cat output/*
cat: Source must be a file.
bye    1
googbye    1
hadoop    2
hello    2
world    2

参考:
http://blog.csdn.net/inkfish/archive/2010/01/07/5150029.aspx
http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/index.html

No comments:

Post a Comment