原创文档,转载请保留原文url地址hadoop俗称分布式计算,最早作为一个开源项目,最初只是来源于谷歌的两份白皮书。然而正如十年前的Linux一样,虽然Hadoop最初十分简单,但随着近些年来大数据的兴起,其也获得了一个充分体现价值的舞台。这也正是业内普遍将
原创文档,转载请保留原文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
hadoop.tmp.dir
// 临时文件目录
/work/apps/hadoop/tmp
A base for other temporary
directories.
fs.default.name
// namenode的服务器的地址
hdfs://db:9000
fs.trash.interval
// 回收站的文件间隔时间
1440
Number of minutes between trash
checkpoints.
If zero, the trash feature is disabled.
如何确定这个文件有哪些配置可以填写及相关含义?
这个文件对应一个默认的配置文件,在:
打开这个文件如下:
文件可以配置项目含义都在文件中了, 大家慢慢参考。 注意不是在这个文件中配置的项目, 若是写在了这里了, 对系统没有任何作用,
当然配置也是无效的。
5. 配置hdfs-site.xml
输入下面命令vi hdfs-site.xml
注意上面的特别注意的区域相关配置。
dfs.name.dir
// namenode存储数据的数据的地方
/work/apps/hadoop/name
// 这里可以放多个文件的列表, 用逗号分隔,
系统会同步把数据写到这些目录中后,才返回确保元数据的安全。建议这些目录在不同的物理磁盘,这样可以提高系统的io性能。另外,最好能通过nfs等方式把数据写到别的服务器一份或者若干份,这样更会确保元数据完好无误的被保留。
dfs.data.dir //
datanode存放数据的地方
/work/apps/hadoop/data //
这里可以存放用逗号分隔的磁盘目录列表,系统在存储数据时会把不同的块数据轮转的方式分别放到不同目录中。一般一个文件的块1放到目录A,
块2则放目录b等等,这样可以充分提高系统的性能。
dfs.replication // 文件的副本个数
3
6. 配置mapred-site.xml 文件
vi mapred-site.xml
mapred.job.tracker // 设置job
tracker
db:9001
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的理解。