写在前面的话:
我用了3台VMware虚拟机成功配置了Hadoop2.6.0版本,采用的系统是CentOS6.0。在配置的过程中,我遇到了大大小小、各式各样的问题。比如一定要注意虚拟机系统和软件位数的一致(要全64bit或全32bit)
现在我将我的配置过程分享如下,也是为了巩固学习的过程。如对您有帮助,不甚荣幸;若有失偏颇,还望您多多指导。
CentOS6.0+Hadoop2.6.0搭建完全分布式环境
一、实验环境
1.VMware10;2.CentOS-6.7-x864-bin-DV6_D1.iso;3.hadoop版本:hadoop-2.6.0;4.jdk-8u45-linux-x64.rpm;5.hadoop64bit本地库
这些东西网上都可以免费下载,如实在找不到可以私信我。
二、网络参数和虚拟机配置
1.IP地址表
host name |
ip address |
os |
|
1 |
master |
192.168.230.128 |
CentOS6.0 |
2 |
slave1 |
192.168.230.129 |
CentOS6.0 |
3 |
slave2 |
192.168.230.130 |
CentOS6.0 |
3.安装VMtools工具(作用:可以从windows和linux之间互相移动文件)
注:本Centos镜像文件在安装的过程中就已经默认安装了tools,比较方便。
若有需要,可以参考:http://wenku.baidu.com/link?url=Qz5yGTROVvEKdkg7oDv67XJ-o0r7ls2eCUJnNpIIH6jmpJvq50-quS4hwL7RQmUGHd4SfKLaSuFlycwSQQlMG9iKKnVBUyx3UAO2K1blsgq
三、网络配置
1.关闭linux系统的防火墙(作用:使各个虚拟机之间可以互相通信,否则容易提示错误)
关掉SELINUX:vi /etc/selinux/config ,设置SELINUX=disabled,保存退出。
关闭防火墙:/sbin/service iptables stop;chkconfig --level 35 iptables off
2.设置网络参数。
(1)修改IP地址为静态地址:vi /etc/sysconfig/network-scripts/ifcfg-eth0
比照IP表,在master和slave上都进行设置,如下图所示。注意:HWADDR为标识机器的硬件地址,不要修改!
(2)修改主机名称。(作用:使访问通过主机名而非IP地址访问,更便捷)
比照IP表,在master和slave上都进行设置,这里以master为例。
(3)修改hosts映射,vi /etc/hosts,将其内容改为如下图所示。
(4)执行:service network restart 以重启网络。
注:网络配置最好几台机器同步执行,这样不容易出错。
四、安装JDK
这一步其实非常简单,只需要将rpm包移动到linux文件目录中,傻瓜式安装。然后根据具体位置配置环境变量即可。
1.安装RPM包
下载jdk-8u45-linux-x64.rpm,我将它移动到/tmp目录下,分别在namenode和datanode节点上安装
命令:cd /opt ->rpm -ivh jdk-8u45-linux-x64.rpm 系统将自动安装jdk到/usr/java下
2.配置环境变量
执行vi /etc/profile,配置如下图所示。配置完之后保存退出,执行source /etc/profile 使生效。
、
3.在终端输入java –version 查看java配置情况,成功。
五、配置所有节点之间的SSH无密码访问
SSH是通过提前验证双方秘钥,而免去通过密码访问的一种访问方式。
(1)所有节点执行以下命令,生成rsa密钥对:ssh-keygen -t rsa
这将在/root/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。
(2)将所有datanode节点的公钥id_rsa.pub传送到namenode上:
cp id_rsa.pub datanode01.id_rsa.pub //复制一份id_rsa.pub
scp datanode01.id_rsa.pub namenode节点ip地址:/root/.ssh/ //将公钥文件传送到namenode
(3)namenode节点上综合所有公钥(包括自身)并传送到所有节点上
cp id_rsa.pub authorized_keys //authorized_keys名字不能错!
cat datanode01.id_rsa.pub >> authorized_keys
然后使用SSH协议将所有公钥信息authorized_keys复制到所有DataNode的.ssh目录下
scp authorized_keys data节点ip地址: /root/.ssh/
这样配置过后,所有节点之间可以相互SSH无密码登陆,可以通过命令“ssh 节点ip地址”来验证。
配置完毕,在namenode上执行“ssh 本机,所有数据节点”命令,因为ssh执行一次之后将不会再询问。至此配置SSH成功。
六、安装hadoop2.6.0
1.设置环境变量
在namenode和datanode节点上的/usr/etc/目录下新建hadoop文件夹,将hadoop-2.6.0解压到namenode节点的hadoop文件夹下
(对于datanode节点上的hadoop,将用scp指令直接从namenode节点拷贝过去,这样更方便),
修改namenode节点的/etc/profile文件,在后面添加环境变量,如下图所示:
保存并退出,执行以下命令使配置生效
source /etc/profile
2.解压hadoop-2.6.0.tar.gz
cd/usr/etc/hadoop/ -> tar -zxf hadoop-2.6.0.tar.gz 默认解压缩到当前目录下面
3.修改hadoop配置文件
这里所有的配置文件都在:/usr/etc/hadoop/hadoop-2.6.0/etc/hadoop/,下面我们一次配置里面的文件
(a)修改hadoop-env.sh和 yarn-env.sh,找到里面的JAVA_HOME,改为实际地址,这里设置为JAVA_HOME=/usr/java/jdk1.8.0_45
(b)修改slave 。它配置所有datanode节点,以便namenode搜索,本例配置的内容如下:slave1 slave2
(c) core-site.xml。修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号,其中,fs.defaultFS表示要配置的默认文件系统,io.file.buffer.size表示设置buffer的大小。
<configuration>
<property>
<name>hadoop.native.lib</name>
<value>true</value> <description>Should native hadoop libraries, if present, be used.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/etc/hadoop/hadoopp-2.6.0/mytmp</value> <description>A base for other temporarydirectories.</description> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>master</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> </configuration>(d) hdfs-site.xml
修改Hadoop中HDFS的配置,配置的备份方式默认为1。
<configuration>
<property>
<name>dfs.namenode.name.dir</name> <value>/usr/etc/hadoop/name</value> <final>true</final> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/etc/hadoop/data</value> <final>true</final> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> </configuration>
(e) mapred-site.xml.template(或者mapred-site.xml,这两个名字都可以)
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> <property> <name>mapreduce.jobhistory.intermediate-done-dir</name> <value>/mr-history/tmp</value> </property> <property> <name>mapreduce.jobhistory.done-dir</name> <value>/mr-history/done</value> </property> </configuration>(f)yarn-site.xml
<span style="font-family:Times New Roman;font-size:14px;"><configuration> <property> <name>yarn.resourcemanager.address</name> <value>master:18040</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:18030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:18025</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:18041</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/usr/etc/hadoop/mynode/my</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/usr/etc/hadoop/mynode/logs</value> </property> <property> <name>yarn.nodemanager.log.retain-seconds</name> <value>10800</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/logs</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir-suffix</name> <value>logs</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>-1</value> </property> <property> <name>yarn.log-aggregation.retain-check-interval-seconds</name> <value>-1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration></span>
4.复制配置文件
将上述文件配置好后,将hadoop-2.6.0文件复制到其余datanode机器上的相同路径下。
scp -r /usr/etc/hadoop/hadoop-2.6.0 slave1: /usr/etc/hadoop
scp -r /usr/etc/hadoop/hadoop-2.6.0 slave2: /usr/etc/hadoop
切换到root用户,修改/etc/profile文件 设置hadoop环境变量。如下图所示。
修改后保存,执行命令使生效:source /etc/profile。
5.所有配置完成之后需要重启电脑,所有datanode节点也需要对环境变量增加上面配置,配置完成之后重启电脑。
重启电脑命令:reboot
七、hadoop的启动和验证
(1)hadoop namenode的初始化,只需要第一次的时候格式化,之后就不需要了
cd /usr/etc/hadoop/hadoop-2.2.0/bin
hdfs namenode -format
注:若对namenode又一次初始化,必须首先删除dfs.data.dir所配置文件中的data文件夹下的所有内容(data文件夹在slave节点里:slave:/usr/etc/hadoop/data/*),否则datanode起不来
(2)启动
启动:在namenode机器上,进入/usr/etc/hadoop/hadoop-2.2.0/sbin
执行脚本start-all.sh
(3) 关闭
在namenode节点上,进入/usr/etc/hadoop/hadoop-2.2.0/sbin
stop-all.sh
(4)验证
在master和slave上执行jps命令,可以看到name节点和slave节点配置成功
查看集群状态:[root@master bin]# hdfs dfsadmin -report
查看文件块组成:[root@master bin]# hdfs fsck / -files -blocks
八、Web接口测试
启动hadoop后,在主节点的浏览器中输入地址查看
http://master:50070
http://master:8088
至此,hadoop平台的搭建全部结束。
在环境搭建的过程中,如果出现任何问题,都要去查看日志
日志路径是:/home/hadoop/hadoop2.2/logs
九、wordcount测试
1.在/目录下 ->创建一个空文件input,输入内容为
My name is MengZhengYU!
My major is Computer Science!
I am a very luck man!
I love you NEU!
并将文件上传到hdfs。执行[root@master /]# hadoop fs -put /input /input
2.执行测试
在hadoop的bin目录cd /usr/etc/hadoop/hadoop-2.6.0/bin 下执行,
[root@masterbin]#./yarn jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /input /output
执行完毕之后可以看到:output文件夹下有两个文件
[root@master ~]# hadoop fs -ls /output
Found 2 items
-rw-r--r-- 1 root supergroup 0 2014-11-06 21:21 /output/_SUCCESS
-rw-r--r-- 1 root supergroup 64 2014-11-06 21:21 /output/part-r-00000
3.查看结果
[root@master bin]# hadoop fs -cat /output/part-r-00000
最后,我想谈谈我遇到的很多问题。
第一个,我安装了VM-TOOLS工具后间歇性的出现无法移动文件的现象,极为纳闷,最后解决的方法是重启主机(非虚拟机)。
第二个,在成功配置完环境之后,在运行wordcount程序时,出现了本地库无法读取的错误,通过网上查阅资料,我下载了64位naive库函数,将其移到根目录(/usr/etc/hadoop/hadoop-2.6.0/lib/native)下,配置core-site.xml文件和环境变量并重启虚拟机,问题终于解决。
第三个,输入hadoop dfsadmin -report查不到集群中文件系统的信息,得到的信息全是0,后来发现格式化了hdfs多次,导致namenode产生的新的namespaceID与datanode所持有的namespaceID不一致。因此,在格式化namenode前,应首先删除slave中的dfs.data.dir所配置文件中的data文件夹下的所有内容,否则怎么也通不了。