在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4、5次,接下来就把搭建的过程详细叙述一下
0.相关工具:
1,系统环境说明:
我这边给出我的集群环境是由一台主节点master和2台从节点slave组成:
master 192.168.137.122
slave1 192.168.137.123
slave2 192.168.137.124
3个节点上均是CentOS7.0系统
2,虚拟机设置
这里用的是 VMware12.1,虚拟CentOS7环境,虚拟机环境配置如下:
系统配置:
虚拟机:一个master,slave1, slave2
网络设置:共享主机IP
内存:每个虚拟机配置1024M内存
分区:自动
软件选择:基础设施服务器
用户设置:密码都设置为:hadoophadoop, 不创建任何用户,操作时使用root直接进行
完成VMware安装后先设置,先在物理机中设置VMnet1、VMnet8 为自动获取IP 如下图所示:
并将3台虚拟机网络连接方式都设置为:NAT模式,否则虚拟无法上网
3,环境安装
插入CentOS7系统盘,选择第一项进入系统安装,稍后会弹出设置界面:
这里我们把环境设置为:基础设施服务器,否则会各种 "command not found..."他提供了,hadoop服务的基础环境
下面是选择"安装位置",这里我直接默认了,接下来很重要,设置网路和主机名,折腾好了,就不用安装完系统后在使用命令设置了
主机名的位置,添写"master",点击右侧"配置",在出现的网络设置中选择"IPv4设置",在出现的"方法"中选择手动,点击添加,设置"master"对应的IP,出现如下界面:
其余两台slave,设置一致,如果虚拟直接拷贝的,可以使用下列命令方法设置
1)修改主机名(分别在3台虚拟机修改为:master、slave1、slave2):
vi /etc/hostname
进入编辑状态后按"Insert"直接修改主机名,完成后,按"ESC",然后按住Shift 按两次Z保存退出
2)修改IP地址(分别在3台虚拟机修改为:192.168.137.122,192.168.137.123,192.168.137.124):
vi /etc/sysconfig/network-scripts/ifcfg-eno16777736(虚拟机的网卡一般默认都是ifcfg-eno16777736)
增加以下内容:
BOOTPROTO=static #设置为静态IP
ONBOOT=yes #打开网卡
IPADDR=192.168.137.122 #设置IP,对应上面给出的四个IP地址,这里是master的IP
NETMASK=255.255.255.0 #设置子网掩码
GATEWAY=192.138.137.2 #设置网关
系统安装完成后需要设置root账号密码,这里我没有添加新用户,所以后续设置均通过root账号完成。
4,配置host
通过下列命令打开hosts文件,修改hosts配置,3台机器都需要
vi /etc/hosts
加入下列代码
192.168.137.122 master
192.168.137.123 slave1
192.168.137.124 slave2
在完成以上步骤后reboot重启3台虚拟机:reboot
5,SSH无密码验证配置
每台机器可以生成自己的一对公司钥,私钥自己保存。将本机作为服务器,要通过无密钥SSH访问本机的机器作为客户端,首先将服务器的公钥放到客户端,客户端将此公钥放到authorized_keys中,可以将authorized_keys认为是公钥的字典文件,因为可以放多个服务器的公钥进去,即可实现无密钥SSH访问。
Hadoop运行过程中,需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个DataNode上的各种守护进程的。这就必须在节点之间执行指令的时候是不需要输入密码的形式,故我们需要配置SSH运用无密码公钥认证的形式,这样NameNode使用SSH无密码登录并启动DataName进程,同样原理,DataNode上也能使用SSH无密码登录到NameNode。
在各节点上生成各自SSH秘钥对(这里秘钥类型为rsa,也可以设置为安全性更高的dsa),以master为例。
创建秘钥文件使用下列命令
ssh-keygen -t rsa
截图说明如下:
(参数说明参考:http://killer-jok.iteye.com/blog/1853451)
在本机上生成authorized_keys,并验证能否对本机进行SSH无密码登陆
在其余所有节点都生成自己的authorized_keys之后,通过ssh-copy-id命令拷贝各自的公钥到其他节点,公钥会加入到对方机器的authorized_keys文件中,可以将authorized_keys认为是公钥的字典文件,因为可以放多个服务器的公钥进去,即可实现无密钥SSH访问。下面以slave1节点为例,将master节点的公钥复制到slave1节点中并加入到授权的key中,并验证是否配置成功。
在slave1中生成秘钥文件
将master节点的公钥复制到slave1节点中并测试连接
在slave中使用 more 查看完成公钥复制后的文件
6,安装jdk环境设置
WinSCP是一个很好用的工具可以在windows物理机与虚拟之间传递文件
输入连接虚拟机机的IP,用户名,密码,链接成功后,上传jdk与hadoop到"/usr/local"目录下(这里目录可随意指定,稍后会登陆到虚拟机解压安装)
使用 tar -zvxf jdk-8u91-lunux-x64.tar.gz 解压
通过mv修改文件夹名称
配置jdk环境变量
vi /etc/profile
在尾部,加入下面内容:
(当然这里也可以使用WinSCP在windows 中修改。)
保存退出后,执行下列命令 让更改及时生效
source /etc/profile
然后,执行下列命令验证安装成功
java -version
如果显示的版本与我们安装的版本一致,即安装成功
7,安装hadoop环境设置
使用 tar -zvxf hadoop-2.7.2.tar.gz 解压
移动到安装目录,我这里是"home/hadoop",可自定义
配置hadoop环境变量,还是修改刚刚配置jdk环境变量的文件
vi /etc/profile
在尾部,加入下面内容:
保存退出后,执行下列命令 让更改及时生效
source /etc/profile
然后,执行下列命令验证安装成功
hadoop version
正常会显示版本信息
配置 ~/hadoop/etc/hadoop下的hadoop-env.sh、yarn-env.sh、mapred-env.sh
使用命令:
vi /home/hadoop/etc/hadoop/hadoop-env.sh
修改JAVA_HOME
使用命令:
vi /home/hadoop/etc/hadoop/yarn-env.sh
修改JAVA_HOME
使用命令:
vi /home/hadoop/etc/hadoop/mapred-env.sh
修改JAVA_HOME
配置系统目录:Hadoop程序存放目录为/home/hadoop/,可以将程序和数据目录分开,可以更加方便的进行配置的同步,具体目录的配置如下所示:
l 在每个节点上创建程序存储目录/home/hadoop/,用来存放Hadoop程序文件。
l 在每个节点上创建数据存储目录/home/hadoop/hdfs,用来存放集群数据。
l 在主节点node上创建目录/home/hadoop/hdfs/name,用来存放文件系统元数据。
l 在每个从节点上创建目录/home/hadoop/hdfs/data,用来存放真正的数据。
l 所有节点上的日志目录为/home/hadoop/logs。
l 所有节点上的临时目录为/home/hadoop/tmp。
执行命令mkdir -p /home/hadoop/logs,为还没有的目录创建,后面以此类推
8, 修改hadoop配置文件
Hadoop2.7.2配置文件在hadoop/etc/hadoop目录下,配置文件也被分成了4个主要的配置文件需要配置其中包含:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。core-site.xml和hdfs-site.xml是站在HDFS角度上配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上配置文件。
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
<description> 设定 namenode 的 主机名 及 端口 </description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description> 设置缓存大小 </description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/hadoop/tmp</value>
<description> 存放临时文件的目录 </description>
</property>
</configuration>
hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/hdfs/name</value>
<description> namenode 用来持续存放命名空间和交换日志的本地文件系统路径 </description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/hdfs/data</value>
<description> DataNode 在本地存放块文件的目录列表,用逗号分隔 </description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description> 设定 HDFS 存储文件的副本个数,默认为3 </description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
mapred-site.xml
<configuration>
property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>
<property>
<name>mapreduce.jobtracker.http.address</name>
<value>master:50030</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>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<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>
<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.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
9,设置hadoop集群
master上配置好的hadoop所在文件夹"/home/hadoop"复制到所有的Slave的"/home"目录下,而不必每台机器都要安装设置,用下面命令格式进行。
例如:从"master"到"slave1"复制配置Hadoop的文件:
scp –r /home/hadoop root@slave1:/home/
复制完成后在master上配置节点信息(其余节点不需要),使用下列命令
vi /home/hadoop/etc/hadoop/slaves
去掉"localhost",每行只添加一个主机名或者IP地址
10,格式化HDFS文件系统
输入命令:
cd /home/hadoop
hadoop namenode -format
如果不出错大致会显示如下信息:
次数如产生错误,基本都是配置文件的问题,诸如不识别中文,配置文件中指定的路径不存在,等等,请认真检查配置文件
11,启动hadoop服务
cd /home/hadoop
sbin/start-all.sh
如无异常显示如下内容
命令“sbin/stop-all.sh”停止hadoop服务
12,服务验证
- java自带的小工具jps查看进程
在master应该输出以下信息(端口号仅供参考)
在slave应该输出以下信息(端口号仅供参考)
若不显示DataNode进程,表示DataNode节点启动失败,这里可以在slave节点中查看日子中的错误
more /home/hadoop/logs/hadoop-root-datanode-slave2.log
根据日志得知 datanode的clusterID 和 namenode的clusterID 不匹配将slave节点中/home/hadoop/hdfs/data/current/VERSION文件中的clusterID 修改为与master中的一致重新启动服务即可。
- 通过网页查看
先使用下面命令关闭防火墙
systemctl stop firewalld
输入以下网页,//192.168.137.122:50070/dfshealth.html#tab-overview 进入hadoop管理首页