这是我第一次搭建全分布模式,本文都是参照网友教程,按照我自己的实践过程将其进行组织。我是利用三台虚拟机进行搭建的,每台虚拟机都是ubuntuserver16.04.1(64位)。搭建过程中有很多步骤和参数配置我还在研究,具体原理我现在无法讲清楚,等以后知识到我了我再来修改本文的不足和完善。文末有参考文章,大家可以综合参考。
一 集群搭建准备
1 虚拟机:三个虚拟机均为ubuntuserver16.04.1(ubuntu-16.04.1-desktop-amd64.iso)操作系统,虚拟机主机名(hostname)分别为master,slave0,slave1
2 hadoop版本:hadoop-2.7.3.tar.gz
3 JDK: jdk-8u101-linux-x64.tar.gz
4 在每台虚拟机中都新建一个用户,取名hadoop(注:用户名取任何名字都可以,但要保证每台虚拟机的用户名一致,这样在后面配置虚拟机之间远程免密码登录时才能成功)
二 安装jdk(在每台机器上都进行同样操作)
(1) 网上下载源:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)将压缩包放置到/usr/lib/jvm目录下
(3)解压压缩包:sudo tar -zxvf jdk-8u101-linux-x64.tar.gz
(4)配置环境变量
打开当前用户的shell环境变量配置文件
vim ~/.bashrc
在文件末尾添加如下信息
#begin copy
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_101
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
#end copy
注意:
(1)上面配置信息中的蓝色部分为你解压出来的jdk文件夹所在的路径,这个可以根据自己的实际情况设置,如我将安装包jdk-8u101-linux-x64.tar.gz解压到/usr/local路径下,则JAVA_HOME配置变为export JAVA_HOME=/usr/local/jdk1.8.0_101
(2)上述配置只适用于当前用户,如果要对所有用户进行同样的设置,即要让所有用户都能使用该jdk,则应该配置/etc/bashrc文件,关于/etc/profile,/etc/bashrc,~/.bashrc以及~/.bash_profile之间的关系请参看http://blog.csdn.net/chenchong08/article/details/7833242
(5)使配置的环境变量生效:source ~/.bashrc(~/.bashrc文件的配置改变后不需要重启系统即可立即设置生效)
(6)检查安装是否成功:
java -version
#若安装成功,则会提示如下信息
三 免密码登录设置
hadoop工作时,各节点要相互通讯,正常情况下linux之间通讯要提供用户名、密码(目的是保证通讯安全),如果需要人工干预输入密码,显然不方便,做这一步的目的,是让各节点能自动通过安全认证,不影响正常通讯。
在设置免密码登录前确保安装了ssh服务,依次直接执行下面命令安装即可,若安装了则会提示已安装。
sudo apt-get install openssh-server
sudo apt-get install ssh
3.1 先在master上生成公钥、私钥对
以hadoop身份登录系统
cd ~/.ssh
如果没有.ssh这个隐藏文件夹,则先执行以下命令:
ssh localhost
在.ssh目录下执行:
ssh-keygen -t rsa -P ‘‘(注:最后使两个单引号)
即:以rsa算法,生成公钥、私钥对,-P ‘‘表示空密码。该命令运行完后,会在个人主目录下生成.ssh目录,里面会有二个文件id_rsa(私钥) ,id_rsa.pub(公钥)
3.2 导入公钥
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
执行完以后,可以在本机上测试下,用ssh连接自己,即:ssh localhost (或ssh master),如果不幸还是提示要输入密码,说明还没起作用,还有一个关键的操作
chmod 600 .ssh/authorized_keys (修改文件权限,否则不起作用)
然后再测试下 ssh localhost ,如果不需要输入密码,就连接成功,表示ok,一台机器已经搞定了。
3.3在其它机器上生成公钥、密钥,并将公钥文件复制到master
a) 以hadoop身份登录其它二台机器 slave0、slave1,执行:
ssh-keygen -t rsa -P ‘‘ 生成公钥、密钥
b) 然后用scp命令,把公钥文件发放给master(即:刚才已经搞定的那台机器)
slave0上:
scp .ssh/id_rsa.pub [email protected]:/home/hadoop/id_rsa_0.pub
slave1上:
scp .ssh/id_rsa.pub [email protected]:/home/hadoop/id_rsa_1.pub
这二行执行完后,回到master中,查看下/home/hadoop目录,应该有二个新文件id_rsa_0.pub、id_rsa_1.pub,然后在master上,导入这二个公钥
cat id_rsa_0.pub >> .ssh/authorized_keys
cat id_rsa_1.pub >> .ssh/authorized_keys
这样,master这台机器上,就有所有3台机器的公钥了。
完成这一步后,只能实现master免密码远程登录到slave0和slave1,单两个从节点(slave0,slave1)无法免密码登录到主节点master上。还需接着做下一步配置
3.4将master上的“最全”公钥,复制到其它机器
a) 继续保持在master上,
scp .ssh/authorized_keys [email protected]e0:/home/hadoop/.ssh/authorized_keys
scp .ssh/authorized_keys [email protected]:/home/hadoop/.ssh/authorized_keys
b) 修改其它机器上authorized_keys文件的权限(如果hadoop用户对authorized_keys已经具有权限6或7,则这一步可以不用做)
slave0以及slave1机器上,均执行命令
chmod 600 .ssh/authorized_keys
3.5 验证
在每个虚拟机上,均用 ssh 其它机器的hostname 验证下,如果能正常无密码连接成功,表示ok
小结:该步骤非常重要,主要思路是在各节点上生成公钥、私钥,然后将公钥发放其它所有节点。RSA算法是非对称加密算法,仅公布“公钥”,只要私钥不外泄,还是不能解密的,所以安全性依然有保障。
如果本步骤失败,根据我个人经验,多半是权限问题,请检查hadoop是否具有足够权限,建议将hadoop加入sudoers列表及root用户组。另外,这里也整理了一些SSH免密码设置失败的原因,请移步 ssh 免密码设置失败原因总结
四 安装hadoop
我们直接将hadoop安装在用户根目录下(/home/hadoop/)
4.1 直接解压hadoop压缩包到根目录下
tar -zxvf hadoop-2.7.3.tar.gz
解压完成后在/home/hadoop/会多出一个hadoop-2.7.3文件夹
4.2 修改配置文件
一共有七个文件需要配置:
$HADOOP_HOME/etc/hadoop/hadoop-env.sh
$HADOOP_HOME/etc/hadoop/yarn-env.sh
$HADOOP_HOME/etc/hadoop/core-site.xml
$HADOOP_HOME/etc/hadoop/hdfs-site.xml
$HADOOP_HOME/etc/hadoop/mapred-site.xml
$HADOOP_HOME/etc/hadoop/yarn-site.xml
$HADOOP_HOME/etc/hadoop/slaves
其中$HADOOP_HOME表示hadoop根目录,本文中默认为/home/hadoop/hadoop-2.7.3
(1) 配置文件1:hadoop-env.sh
该文件是hadoop运行基本环境的配置,需要修改的为java虚拟机的位置。
故在该文件中修改JAVA_HOME值为本机安装位置(如,export JAVA_HOME=/usr/lib/jvm/java-1.7.0)
(2) 配置文件2:yarn-env.sh
该文件是yarn框架运行环境的配置,同样需要修改java虚拟机的位置。
在该文件中修改JAVA_HOME值为本机安装位置(如,export JAVA_HOME=/usr/lib/jvm/java-1.7.0)
(3)配置文件3:slaves
该文件里面保存所有slave节点的信息,以本篇为例
写入以下内容(hosts里从机的主机名):
Slave0
Slave1
(4)配置文件4:core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下(我将tpm文件夹创建在用户根目录下)。
有关core-site.xml各项参数的具体介绍请见:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/core-default.xml
(5)配置文件5:hdfs-site.xml
<configuration>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
注意:路径/dfs/name和/dfs/data需要手动创建;dfs.http.address配置了hdfs的http的访问位置;dfs.replication配置了文件块的副本数,一般不大于从机的个数。
namenode的hdfs-site.xml是必须将dfs.webhdfs.enabled属性设置为true,否则就不能使用webhdfs的LISTSTATUS、LISTFILESTATUS等需要列出文件、文件夹状态的命令,因为这些信息都是由namenode来保存的。
访问namenode的hdfs使用50070端口,访问datanode的webhdfs使用50075端口。访问文件、文件夹信息使用namenode的IP和50070端口,访问文件内容或者进行打开、上传、修改、下载等操作使用datanode的IP和50075端口。要想不区分端口,直接使用namenode的IP和端口进行所有的webhdfs操作,就需要在所有的datanode上都设置hefs-site.xml中的dfs.webhdfs.enabled为true。
有关hdfs-site.xml各项参数的详细介绍请见:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
(6)配置文件6:mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>20</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>4</value>
</property>
<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>
</configuration>
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数,至于什么是map和reduce,可参考其它资料进行了解。
其它属性为一些进程的端口配置,均配在主机下。
mapred-site.xml的详细参数介绍请见:http://hadoop.apache.org/docs/r2.7.3/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml
(7)配置文件7:yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>Master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>Master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>Master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>Master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>Master:8033</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value></property>
</configuration>
该文件为yarn框架的配置,主要是一些任务的启动位置
4.3 将配置好的hadoop直接复制到其他从节点(以下命令均在master主节点上执行)
scp –r ~/hadoop-2.7.3 [email protected]:~/
scp –r ~/hadoop-2.7.3 [email protected]:~/
4.4 启动验证
(1)格式化namenode(在hadoop安装文件夹下执行以下命令)
bin/hdfs namenode -forma
(2)启动hdfs
sbin/start-dfs.sh
此时在Master上面运行的进程有:namenode secondarynamenode
slave0和slave1上面运行的进程有:datanode
(3)启动yarn
sbin/start-yarn.sh
此时在Master上面运行的进程有:namenode secondarynamenode resourcemanager
Slave0和Slave1上面运行的进程有:datanode nodemanager
(4)检查启动结果
查看集群状态:bin/hdfs dfsadmin –report
查看文件块组成: bin/hdfs fsck / -files -blocks
查看HDFS: http://192.168.56.109:50070(主机IP)
查看RM: http:// 192.168.56.109:8088(主机IP)
5参考文章
(1)http://www.aboutyun.com/thread-11824-1-1.html
(2)http://jingyan.baidu.com/article/27fa73269c02fe46f9271f45.html
(3)http://www.cnblogs.com/yjmyzz/p/4280069.html
(4)http://www.cnblogs.com/yjmyzz/p/4481720.html
(5)http://blog.csdn.net/m1213642578/article/details/52468829?locationNum=3
(6)http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/ExtendedAttributes.html
(7)http://blog.csdn.net/shoubuliaolebu/article/details/43575027
(8)http://blog.csdn.net/yangjl38/article/details/7583374