原创文档,转载请保留原文url地址
hadoop俗称分布式计算,最早作为一个开源项目,最初只是来源于谷歌的两份白皮书。然而正如十年前的Linux一样,虽然Hadoop最初十分简单,但随着近些年来大数据的兴起,其也获得了一个充分体现价值的舞台。这也正是业内普遍将Hadoop看做是下一个Linux的原因。
本文介绍基于多台vmware虚拟机来安装hadoop集群的过程及方法,通过这个小的集群让您在本地电脑上就可以研究hadoop的相关工作过程,有人会有疑问在小的虚拟机集群上研究的结果, 写的程序能否在大集群上工作正常?可以肯定的没问题的。
Hadoop的一个特性是线性增长特性,即当前数量情况下,处理时间是1, 若是数据量加倍, 后处理时间加倍, 若是在这种情况下, 处理能力也加倍则处理时间也是1.
正常情况hadoop需要较多的服务器才能搭建, 但是我们在家里学习如何去找那么服务器, 解决办法可以找几台pc机,在pc机上安装linux系统就可以了。
当然我们还有更简单的办法, 就是找一台高性能的电脑, 在电脑上安装虚拟机软件,里面创建若干台虚拟机, 然后让这些虚拟机构成一个小的内部局域网络,在这个网络上我们安装linux软件, java软件, 安装hadoop程序,我们就可以创建一个简单hadoop的研究系统, 进行软件的开发调试, 在这个小的分布式集群上开发的程序可以无缝移植到相同版本的hadoop(不同hadoop的版本兼容性不是很好, 特别是低版本同高版本, 他们的api也有些许变化)集群中。
如下是在笔者笔记本上构建的一个hadoop的虚拟机系统, 相关网络拓扑结构如下:
虚拟机0,机器名称:db, ip:192.168.186.10
虚拟机1,机器名称:red, ip:192.168.186.11
虚拟机2,机器名称:mongdb, ip:192.168.186.12
虚拟机3,机器名称:nginx,ip:192.168.186.13
如上图, 4台虚拟机通过一个虚拟的交换机互联, 开发机器也连接到这个虚拟交换机上, 虚拟的交换机同adsl相连接,这样整个系统都可以直接上网了。
下面是几个虚拟机的典型配置,如下:
Db的配置,如上, 这个机器的内存配置比较高, 这个机器是机器的master服务器, 需要较多的内存。 因此配置了1.3g内存。
下面是red的配置, mongdb及nginx的配置同这个机器配置相同,配置如下:
这个机器的配置同db机器配置相同, 仅仅是内存小了些, 这里内存是188m, 作为调试环境已经足够用了。
1. 网卡的Ip地址配置采用静态ip配置方式, 防止重新启动后dhcp分配新的ip后,造成不必要的混乱。 配置如下:
2. Hosts文件配置
[root@db ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.186.10 db
192.168.186.11 red
192.168.186.12 mongdb
192.168.186.13 nginx
需要确保每一台机器的 hosts文件配置如上图所示。
简便配置方法, 在配置一台机器后, 可以编写脚本实现自动将hosts文件复制到多台机器上。脚本如下:
[root@db ~]# cat update_hosts.sh
#!/bin/sh
for host in red mongdb nginx;do
echo $host
scp /etc/hosts root@${host}:/etc/
done
[root@db ~]#
主要这个脚本要在root下编写, 然后赋予可以执行的权限(chmod a+x *.sh), 然后在root权限下执行。脚本会自动完成hosts文件的复制工作。
上面过程完成后, 分别登录每一台机器, 把每一个服务器都ping一下, 若是不通,在仔细检查一下。
3. Java配置在每个虚拟机服务器上检查是否正确安装了java, 是否配置了java的环境变量等
如上图, 1处输入 java -version, 然后应该输出类似2处的输出,标识java已经正确安装了
同时采用3处的命令, env | grep JAVA_HOME 来检查环境变量是否正确配置了, 若是没有配置java的环境变量则需要进行配置
若是您java还有安装请 用下面命令安装
yum install java-1.7.0-openjdk
然后用下面命令配置环境变量。
vi /etc/profile
打开编辑的文件后, 在文件最后面添加如下内容
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre
JRE_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JRE_HOME PATH CLASSPATH
保存退出, 最后运行下面命令, 使配置生效
source /etc/profile
然后再次测试上面的过程, 看看是否符合相关需要。如果您还没做到到网络搜索一下吧。
4. ssh免登录功能配置Hadoop通过ssh进行相关管理工作,主要是hadoop的管理脚本通过ssh远程对各个服务器进行相关的管理,包括启动,停止等。
关于如何配置ssh的免密码登录,请参考下面文章的相关部分:
Hadoop1.2.1 Pseudo-Distributed伪分布模式配置
http://www.iigrowing.cn/hadoop1-2-1-pseudo-distributed-wei-fen-bu-mo-shi-pei-zhi.html
5. 关闭相关的防火墙Hadoop程序在工作过程中,各个节点间有很多程序要进行通信,因此我们需要对防火墙做些处理, 保证这些访问能正常工作。 我们这里采用最简单的办法是关闭研究用集群虚拟机的全部防火墙.
在虚拟机中,启动setup程序
选择防火墙工作这一项
在下面的对话框中, 选择如下特殊颜色的区域的相关选项, 最后选择ok推出
6. 下载hadoop程序
相关过程略。
1. 在虚拟机db上下载hadoop程序, 然后解压缩到 /work/apps/hadoop目录, 相信你会这个操作, 不行百度一下啦。2. 配置hadoop的环境变量
进入conf目录, 编辑hadoop-env.sh 文件,
修改java home的配置
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.25/jre
注意这个配置,要同前面配置java的时候配置相同。
3. 创建目录Name目录存放namenode的hdfs目录及文件的元数据。
Data目录存放datanode的数据
4. 配置core-site.xml 文件vi core-site.xml
If zero, the trash feature is disabled.
如何确定这个文件有哪些配置可以填写及相关含义?
这个文件对应一个默认的配置文件,在:
打开这个文件如下:
文件可以配置项目含义都在文件中了, 大家慢慢参考。 注意不是在这个文件中配置的项目, 若是写在了这里了, 对系统没有任何作用, 当然配置也是无效的。
5. 配置hdfs-site.xml输入下面命令vi hdfs-site.xml
注意上面的特别注意的区域相关配置。
6. 配置mapred-site.xml 文件
vi mapred-site.xml
7. 配置masters和slaves 文件
查看下面两个文件的内容,如下:
masters文件中存放,secondary server的配置
slaves中存放的是 datanode,tasktractor的服务器的列表
这个两个文件不需要分发给 slaves节点, 但是我们这里简便处理, 在脚本中没有排除这些文件,可以通过一定的配置文件制定相关位置等。
1. 分发配置好的hadoop系统到各个服务器中创建如下脚本程序
[root@db apps]# vi scp_hadoop.sh
脚本内容如下:
#!/bin/sh
for host in red mongdb nginx;do
echo $host
scp -r /work/apps/hadoop sch@${host}:/work/apps/
Done
保存退出后, 修改文件的可执行属性 (chmod a+x *.sh)
然后在合适的帐号下执行上述脚本, 脚本将 已经配置好的hadoop程序拷贝到其他服务器中。
2. 启动hadoop系统进入hadoop的目录,
执行下面命令, 格式化hadoop的文件系统
bin/hadoop namenode -format 格式化namenode的文件系统, 如下图
然后输入bin/start-all.sh 命令, 启动hadoop系统,相关记录如下图:
3. 验证hadoop的启动结果
输入如下命令, 坚持启动的java进程
ps -ef | grep java | awk ‘{print $1, $9,$11 }’
这里由于安装的openjdk版本问题,没有安装好jps进程,这样只好用上面的命令临时检查一下java的进程了。
验证其他服务器的java运行情况,如下:
如上图,不同区域显示了登陆不同服务器后验证java进程的结果。
在整个过程中,发生了一些错误通过检查相关日志, 然后进行专项的处理后, 最后调试通过。
Hadoop毕竟不是普通的程序, 不可能仅仅简单就通过, 需要认真仔细的研究,练习,不断实践。 最重要的在调试工作提高自己的工作能力,提高对hadoop的理解。