Ubuntu 14.04 Server 环境下Hadoop 2.7.2 的安装部署
Ubuntu 14.04 Server 环境下Hadoop 2.7.2 的安装部署
实验环境:
3台机器
- Ubuntu 14.04 Server 主机名:ubuntu7 作master
- Ubuntu 14.04 Server 主机名:ubuntu130 作slave1
- Ubuntu 14.04 Server 主机名:ubuntu131 作slave2
配置/etc/hosts文件:
ubuntu7即master 机器上的/etc/hosts文件如下:
把master上hosts文件内容复制并覆盖掉slave1和salve2中的hosts文件,仅仅修改主机名即可,即在slave1的/etc/hosts文件中,把ubuntu7改为ubuntu130.
注意!!!!Ubuntu 环境下,hosts文件中,主机名千万不能与127.0.0.1 或127.0.1.1配对,一定要与对应的局域网IP配对。如上图,主机名ubuntu7 一定要与局域网IP 172.16.0.7配对。重要教训请参考 http://www.linuxidc.com/Linux/2017-11/148344.htm 以及Hadoop 官方wiki友情提醒:http://wiki.apache.org/hadoop/ConnectionRefused
配置ssh无密码连接:
由于hadoop 是集群资源管理系统,涉及到集群中各台机器相互之间数据传输等通信过程,因此需要处理好机器之间的数据通信安全问题。在linux环境下,最常用的通信处理手段就是ssh服务。
下面以ssh的连接过程为例,简单说一下ssh的原理:
客户端连接服务端每次都要输入密码的原因在于:服务器没有长时间保留客户端的公钥。因此如果服务器把客户端的公钥保留在一个固定的文件中,下次客户端连接时,服务器直接从这个固定文件中查取,就不需要客户端再重新发送一次了,因此就可实现无密码连接。
那么有没有这个固定文件呢?没错,ssh软件默认是.ssh目录下的authorized_keys文件
因此ssh无密码连接的关键在于,把客户端的公钥永久保存至服务器上的一个文件。
下面配置从slave1 ssh无密码连接master
slave1端
ssh-keygen
//生成客户端的公私钥,一般保存在~/.ssh文件下
把slave1端的公钥上传到master端
scp ~/.ssh/id_rsa.pub lilelr@master:~
master端
在 master的~目录下,将客户端的公钥追加到authorized_keys文件下
cat id_rsa.pub >> .ssh/authorized_keys
ssh 服务重启,使新配置生效:
sudo /etc/init.d/ssh restart
ok, 此时,slave1 登录到master 就无需密码。注意!!!此时无密码连接只是单向关系,即slave1到master无需密码登录,但master 到slave1 端连接依然需要密码。怎么办?把master和slave1 的位置互换一下,重新执行上述步骤,即可实现master到slave1端的无密码登录。
配置相关环境变量:
在master节点上:
去apache官网下载 hadoop-2.7.2.tar.gz以及下载JDK 1.8.
注意!!!开源的openJdk 是执行不了jps命令的,因此若经常使用jps命令,最好下载JDK.
在~用户目录下新建文件夹hadoop。在hadoop目录中新建hdfs和script文件夹,并把hadoop 2.7.2.tar.gz解压到hadoop目录中。
将jDK 1.8 解压到/usr/lib/jvm 目录下。
~/hadoop 目录情况:
在.bashrc文件末尾添加环境变量。
vim ~/.bashrc
加上:
其中 lilelr 为我的linux用户名。
立刻使环境变量生效:
source ~/.bashrc
上述操作在salve1和slave2节点上重复,或复制master相关文件覆盖slave下的相关文件。
配置hadoop相关参数:
进入到配置目录
cd ~/hadoop/hadoop-2.7.2/etc/hadoop
修改 hadooop-env.sh 文件,更改JAVA_HOME路径。
修改 core-site.xml
修改 hdfs-site.xml
修改 mapred-site.xml
修改 yarn-site.xml
修改 slaves,添加slave1和slave2名。
上述配置修改完之后,进入到~/hadoop/hdfs目录,新建data、name、和tmp目录
mkdir data name tmp
最后把master上配置好的hadoop复制到slave1和slave2节点上。
scp -r ~/hadoop slave1:~ scp -r ~/hadoop slave2:~
终于成功完成安装配置了。
hdfs文件系统格式化
由于我们已经把hadoop的bin或sbin相关目录路径写入环境变量,因此下面的命令可在任意路径下执行。
master节点上,格式化文件系统:
hdfs namenode -format
格式化无误的话,即可看到下图的输出信息提示。
hadoop2.7.2启动测试
以下操作在master节点上进行:
一次性启动NameNode和所有DataNode的脚本为hadoop自带的start-dfs.sh(在sbin目录下)
报告文件系统状态的命令为:
hdfs dfsadmin -report
启动yarn,一次性启动ResourceManager和NodeManager的hadoop脚本为start-yarn.sh(在sbin目录下)
报告yarn节点信息的命令为:
yarn node -list
当然,既然hadoop启动都是java进程,jps命令当然也可以用来观察master机器上的hadoop进程。
为了启动方便,我把上述启动命令都写在一个脚本里面,命名为start.sh,并把它放在~/hadoop/script目录下。
vim start.sh
来看看start.sh脚本的内容:
#!/bin/bash start-dfs.sh hdfs dfsadmin -report start-yarn.sh yarn node -list jps
在~/hadoop/script目录下,执行start.sh脚本。输出结果如下,表明hadoop启动成功。
在slave1 节点上执行jps命令,观察到有NodeManager 和DataNode进程。
以hadoop自带的example jar为例测试。此测试程序目的是找出hadoop etc目录下文件中
包含 “dfs”的各个文件中的行数及每行内容。
为了便于重复测试,同样,我把测试命令写成了脚本,命名为testhadoop.sh,并把它放在~/hadoop/script目录中,其内容如下。
#!/bin/bash hdfs dfs -mkdir /user hdfs dfs -mkdir /user/lilelr hdfs dfs -put ~/hadoop/hadoop-2.7.2/etc/hadoop input hadoop jar ~/hadoop/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+' hdfs dfs -cat output/*
执行testhadoop.sh脚本,输出结果如下。
map 和reduce过程
包含 “dfs”的各个文件中的行数及每行内容。
测试完成,停止hadoop集群。先关闭yarn,后停止hdfs。
hadoop自带脚本为stop-yarn.sh及stop-dfs.sh。
Thanks!