分布式并行程序,将其运行于计算机集群上,完成海量数据的计算。在本文中,详细介绍了如何部署 Hadoop 分布式
运行环境。
一、前言
前面己经详细介绍了如何安装 Hadoop,如何在单机及伪分布式环境 (在一台单机中用多进程模拟) 运行基于Hadoop 的并行程序。本文将介绍真实的 Hadoop 分布式运行环境, 如何在多台普通的计算机上部署分布式运行环境。
二、准备硬件设备、操作系统、网络环境
准备三台机器,机器名分别为 home0.hadoop、home1.hadoop、home2.hadoop,均安装 CentOS5 (其它 Linux 发行版亦可), 确保各台机器之间网络畅通,机器名与 IP 地址之间解析正确,从任一台机器都可以 ping 通其它机器的机器名。如有机器名的解析问题,可通过设置 /etc/hosts 文件解决,当然更好的解决方法是在你的网络中配置 DNS 服务器。此外,需要在三台机器上创建相同的用户帐号,如:yourusername。
我们将使用 home0.hadoop 作为分布式文件系统 HDFS 的 Name Node 及 MapReduce 运行过程中的 Job Tracker 结点,我们将 home0.hadoop 称之为主结点。其它两台机器 (home1.hadoop, home2.hadoop) 作为 HDFS 的 Data Node 以及 MapReduce 运行过程中的 Task Tracker 结点,这些结点可统称为从结点。如你需要部署更多的机器,也是很容易的,将新加入的机器作为 Data Node 以及 Task Tracker 结点即可,其配置过程在您看完本文后就会了。
三、SSH配置RSA认证
在 Hadoop 分布式环境中,Name Node (主节点) 需要通过 SSH 来启动和停止 Data Node (从结点)上的各类进程
。我们需要保证环境中的各台机器均可以通过 SSH 登录访问,并且 Name Node 用 SSH 登录 Data Node 时,不需要
输入密码,这样 Name Node 才能在后台自如地控制其它结点。可以将各台机器上的 SSH 配置为使用无密码公钥认证方式来实现,在此我就不再赘述了,上篇已经写过。
四、安装部署 Hadoop
1、我们首先在主控结点 home0.hadoop 上安装和配置好 Hadoop,安装过程上一篇已经说过,请查看。
2、配置 conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml
2.1、conf/core-site.xml:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://home0.hadoop:9000</value>
</property>
</configuration>
2.2、conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/yourusername/hadoopfs/name_0,/home/yourusername/hadoopfs/name_1</value>
<description>Determines where on the local filesystem the DFS name node
should store the name table. If this is a comma-delimited list of directories
then the name table is replicated in all of the directories,
for redundancy.
</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/yourusername/hadoopfs/data_0,/home/yourusername/hadoopfs/data_1</value>
<description>
Determines where on the local filesystem an DFS data node
should store its blocks. If this is a comma-delimited list of directories,
then data will be stored in all named directories, typically on different
devices. Directories that do not exist are ignored.
</description>
</property>
</configuration>
2.3、conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>home0.hadoop:9001</value>
</property>
</configuration>
3、解释:
参数 fs.default.name 指定 Name Node 的 IP 地址和端口号,此处我们将其设定为 home0.hadoop 及 9000 端口,参数 mapred.job.tracker 指定 JobTracker 的 IP 地址和端口号,此处我们将其设定为 home0.hadoop 及 9001
端口。 参数 dfs.name.dir 指定 Name Node 相关数据在本地文件系统上的存放位置, 此处我们将其设定为/home/yourusername/hadoopfs/name_0,/home/yourusername/hadoopfs/name_1 ,参数 dfs.data.dir 指定 Data Node 相关数据在本地文件系统上的存放位置,此处我们将其设定为 /home/yourusername/hadoopfs/data_0,/home/yourusername/hadoopfs/data_1 。注意, Hadoop 会自动创建这些目录,无需事先创建。如果你有多个磁盘设备,以逗号分开配置进去,会大大提高IO效率。
4、设定主从节点
修改 conf/masters 文件,将其中的 localhost 改为 home0.hadoop ,修改 conf/slaves 文件。 删掉其中的localhost, 将我们的另两台机器 home1.hadoop、home2.hadoop 加入, 注意每个机器一行。masters里面的是主机节点,slaves里面是从机节点。
5、同样的配置拷贝到其他两台机器上去
$ scp -r /home/yourusername/hadoop-0.20.2 home1.hadoop:/home/yourusername/hadoop-0.20.2
$ scp -r /home/yourusername/hadoop-0.20.2 home2.hadoop:/home/yourusername/hadoop-0.20.2
注意:可能您每台机器的JAVA安装位置不一样,记得修改conf/hadoop-env.sh,设置export JAVA_HOME=正确路径。
6、在 home0.hadoop 上格式化一个新的分布式文件系统
$ cd hadoop-0.20.2
$ bin/hadoop namenode -format
7、启动hadoop进程
$ bin/start-all.sh
$ bin/start-all.sh
starting namenode, logging to ...
home1.hadoop: starting datanode, logging to ...
home2.hadoop: starting datanode, logging to ...
home0.hadoop: starting secondarynamenode, logging to ...
starting jobtracker, logging to ...
home1.hadoop: starting tasktracker, logging to ...
home2.hadoop: starting tasktracker, logging to ...
启动完成之后,从日志中可以看到,也可以运行 ps -ef 命令可以看到 home0.hadoop 上启动了 3 个新的 java进程 (namenode, secondary namenode, jobtracker), 同时,我们可以到 home1.hadoop、home2.hadoop 两台机器上用 ps –ef 查看,这两台机器上应该已经自动启动了 2 个新的 java 进程 (datanode, tasktracker)
五、操作HDFS试试
$ bin/hadoop fs -lsr //查看分布式系统中是有哪些文件存在
$ bin/hadoop fs -put /home/yourusername/hadoop-0.20.2/hadoop-0.20.2-tools.jar a.jar //从本地拷贝文件
$ bin/hadoop fs -put /home/yourusername/hadoop-0.20.2/ . //从本地文件系统拷贝文件夹到分布式文件系统
$ bin/hadoop fs -rmr /home/yourusername/hadoop-0.20.2/ . //删除分布式文件系统的所有文件
六、可能你不会很顺利
我的问题呢,就是碰到 could only be replicated to 0 nodes, instead of 1,因为防火墙问题,在这里解决的:http://jiajun.iteye.com/blog/624449。
七、多熟悉熟悉
1、http://home0.hadoop:50070 看看分布式文件系统概况日志
Cluster Summary
15 files and directories, 3 blocks = 18 total. Heap Size is 10.73 MB / 966.69 MB (1%)
Configured Capacity : 56.26 GB
DFS Used : 524 KB
Non DFS Used : 10.86 GB
DFS Remaining : 45.4 GB
DFS Used% : 0 %
DFS Remaining% : 80.7 %
Live Nodes : 2
Dead Nodes : 0
2、http://192.168.0.129:50030 看看工作情况
Cluster Summary (Heap Size is 7.5 MB/966.69 MB)
Maps Reduces Total Submissions Nodes Map Task Capacity Reduce Task Capacity Avg.
Tasks/Node Blacklisted Nodes
0 0 0 2 4 4 4.00 0
3、熟悉hadoop的命令
八、环境搭建完成,到这里你可以玩玩分布式文件系统,下一步我会介绍如何分布式编程
一、准备工作:
Hadoop分布式文件系统,架构和设计 :http://hadoop.apache.org/common/docs/r0.20.2/cn/hdfs_design.html
Hadoop快速入门:http://hadoop.apache.org/common/docs/r0.20.2/cn/quickstart.html
SSH认证登录(可后看):http://www.ibm.com/developerworks/cn/linux/security/openssh/part1/index.html
二、下面实际操作,初步感受分布式文件系统:
1、ssh安装(linux:openssh,windwos:要先安装Cygwin),略过
2、下载Hadoop的发行版,从Apache的某个镜像服务器上下载最近的 稳定发行版:
http://hadoop.apache.org/core/releases.html,解压所下载的Hadoop发行版。
$ wget http://labs.renren.com/apache-mirror/hadoop/core/hadoop-0.20.2/hadoop-0.20.2.tar.gz
$ tar -zxvf hadoop-0.20.2.tar.gz
$ cd hadoop-0.20.2
3、编辑 conf/hadoop-env.sh文件,至少需要将JAVA_HOME设置为Java安装根路径
4、稍微熟悉下使用文档
$ bin/hadoop //将会显示hadoop 脚本的使用文档。
现在你可以用以下三种支持的模式中的一种启动Hadoop集群:
* 单机模式
* 伪分布式模式
* 完全分布式模式
5、单机模式的操作方法
默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程。这对调试非常有帮助。
下面的实例将已解压的 conf 目录拷贝作为输入,查找并显示匹配给定正则表达式的条目。输出写入到指定的output
目录。
$ mkdir input
$ cp conf/*.xml input
我们看看下面的查找:
$ egrep dfs[a-z.]+ input/*
输出:
input/hadoop-policy.xml: dfsadmin and mradmin commands to refresh the security policy in-effect.
运行hadoop命令:
$ bin/hadoop jar hadoop-0.20.2-examples.jar grep input output 'dfs[a-z.]+'
执行上面的命令,会有一些输出日志,随便看看,了解了解。
$ cat output/*
结果:
1 dfsadmin
6、伪分布式模式的操作方法
Hadoop可以在单节点上以所谓的伪分布式模式运行,此时每一个Hadoop守护进程都作为一个独立的Java进程运行。
6.1、配置 (中文官方文档落后了,我上面的链接是中文文档,请自己转到英文文档看):
conf/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/lighttpd/hadoopfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/lighttpd/hadoopfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
6.2、免密码ssh设置(参考我的另外一篇文章:http://jiajun.iteye.com/blog/621309)
现在确认能否不输入口令就用ssh登录localhost:
$ ssh localhost
如果不输入口令就无法用ssh登陆localhost,执行下面的命令:
$ ssh-keygen -t dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
6.3、格式化一个新的分布式文件系统
$ bin/hadoop namenode -format
注意看看输出日志哦,有助于理解。
6.4、启动Hadoop守护进程:
$ bin/start-all.sh
如果你设置了ssh的RSA认证,就不用输入密码,不然就要输入三次密码登录
6.5、日志
Hadoop守护进程的日志写入到 ${HADOOP_LOG_DIR} 目录 (默认是 ${HADOOP_HOME}/logs).
6.6、浏览NameNode和JobTracker的网络接口,它们的地址默认为:
* NameNode - http://localhost:50070/
* JobTracker - http://localhost:50030/
浏览观察一下,会看懂甚至更好的理解一些东西。
6.7、将输入文件拷贝到分布式文件系统:
$ bin/hadoop fs -put conf input //把本地的文件夹conf拷贝到分布式文件系统input文件夹
$ bin/hadoop fs -ls input //浏览分布式文件系统中的input文件
上面的命令是hadoop的,你可以输入下面命令,获取帮助
$ bin/hadoop fs
6.8、运行发行版提供的示例程序:
$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'
查看输出文件:
$ bin/hadoop fs -get output output // 将输出文件从分布式文件系统拷贝到本地文件系统
$ cat output/*
或者,在分布式文件系统中查看:
$ bin/hadoop fs -cat output/*
6.9、你可以多试试bin/hadoop fs 下的java FsShell,和操作本地文件差不多,很快能熟悉。
6.10、最后,完成全部操作后,可以停止守护进程:
$ bin/stop-all.sh
bin下面有很多shell脚本这时可以适当看看名称,猜个大概意思。