1. 克隆虚拟机
母机信息:
**
为了描述的过程能尽可能通俗易懂, 笔者将集群节点暂且命名为: slave1,slave2.slave3
**
linux版本: CentOs6.8
jdk版本: jdk1.8.0_144
hadoop版本: hadoop2.7.2
虚拟机母机Master配置:
① 防火墙关闭
② 设置静态ip
注: 如何设置静态ip及如何设置虚拟网络这篇文章笔者不在进行赘述
③ 更改主机名称
② 配置地址映射
注:linux环境下查看主机映射
vim /etc/hosts
windows10环境下查看主机映射
C:\Windows\System32\drivers\etc\hosts
③ 在opt目录下创建Java和hadoop的目录
注: /opt/module 存放运行时软件
/opt/software 存放软件安装包
③ 配置JAVA_HOME和HADOOP_HOME
linux环境下查看环境变量信息: vim /etc/profile
注:这里笔者不在赘述环境变量配置
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
PATH=$PATH:$HADOOP_HOME/bin
PATH=$PATH:$HADOOP_HOME/sbin
④ 上传jdk和hadoop安装包到/opt/software目录下
注: 这里需要注意用户权限问题
2. 集群部署规划
集群规划注意事项:
NameNode和SecondaryNameNode不要安装在同一节点
ResourceManager同样也比较消耗内存,不要和NameNode / SecondaryNameNode配置在同一节点
3. SSH无密登录配置
在用户家目录下生成公钥和秘钥
ssh-keygen -t rsa
敲三个回车即可 会生成两个文件
id_rsa(私钥)、id_rsa.pub(公钥)
将公钥拷贝到客户机上实现无密通讯
ssh-copy-id slave1
ssh-copy-id slave1
ssh-copy-id slave1
注:这里只需要NameNode和ResourceManager节点有无密登录权限即可, 笔者为了后续配置文件方便所以三个节点都配置了无密登录
注: ssh访问自己也需要输入密码, 所以需要将公钥也拷贝给当前客户机一份
注:在配置SSH时如碰到下面的坑参考加福大佬的路子修改SSH配置文件即可:
[centos@s200 hadoop]$ ssh localhost
The authenticity of host ‘localhost (::1)’ can’t be established.
ECDSA key fingerprint is b7:a7:1d:80:34:67:c6:1e:a2:ac:8e:67:a5:38:38:d0.
Are you sure you want to continue connecting (yes/no)? 1
Please type ‘yes’ or ‘no’: yes
Warning: Permanently added ‘localhost’ (ECDSA) to the list of known hosts.
Write failed: Broken pipe
方法一:
ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
方法二
一个彻底去掉这个提示的方法是,修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
修改好配置后,重新启动sshd服务即可。
4. 编写Shell分发脚本
在用户家目录下创建bin目录编写分发脚本:vim /home/hadoopShell/xsync
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径 –P指向实际物理地址,防止软连接
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for((host=1; host<3; host++)); do
echo ------------------- slave$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
执行分发脚本
chmod 777 xsync
xsync /home/hadoopShell/bin/
4. 更改集群配置文件
core核心配置文件
hadoop目录下 vim etc/hadoop/
① 配置core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://slave1:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
HDFS 配置文件
hadoop目录下 vim etc/hadoop/
② 配置hadoop-env.sh
#注意:我们已经在/etc/profile文件中配置了JAVA_HOME,这里为什么还需要配置JAVA_HOME?
#答:因为Hadoop运行是守护进程(守护进程是一个在后台运行并且不受任何终端控制的进程。--摘自百度百科),正是因为它后台运行,不接受任何终端控制,所以它读取不到我们配置好的环境变量,所以这里需要单独配置一下。
export JAVA_HOME=/opt/module/jdk1.8.0_144
③ 配置hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave2:50090</value>
</property>
YARN配置文件
④ 配置yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
⑤ 配置yarn-site.xml
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave3</value>
</property>
<!-- =========yarn-site.xml配置聚集日志========== -->
<!-- 日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
MapReduce配置文件
⑥ 配置mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
⑦ 配置mapred-site.xml
#注:第一次配置需要将mapred-site.xml.template文件重命名为mapred-site.xml
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- =======mapred-site.xml下配置历史服务器====== -->
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>slave1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>slave1:19888</value>
</property>
slaves配置文件
1. 配置slaves
2. 切换目录到:hadoop安装目录/etc/hadoop/
3. 在目录下的slaves文件中添加如下内容
# 注意结尾不能有空格,文件中不能有空行
slave1
slave2
slave3
同步所有节点配置文件
5. 分发配置文件
#指定hadoop节点的配置文件目录
xsync /opt/module/hadoop-2.7.2/etc/hadoop/
6. 群起集群
1. 格式化NameNode
如果是第一次启动需要格式化NameNode
bin/hdfs namenode -format
格式化需要注意的问题:
只有第一次启动需要格式化,以后不要总是格式化,否则会出现namenode和datanode的集群id不一致的情况,导致datanode启动失败
正确的格式化姿势:
在执行第一次格式化时会在hadoop安装目录下产生data文件夹,里面会生成namenode的信息
在启动namenode和datanode后,还会在同样的目录下产生logs的日志文件夹
所以在格式化之前需要先将这两个文件夹删除,然后再格式化,最后启动namenode和datanode
2. 整体启停HDFS相关组件
start/stop-dfs.sh
3. 整体启停YARN相关组件
start/stop-yarn.sh
4. 启停历史服务器
mr-jobhistory-daemon.sh start/stop historyserver
5. 单起HDFS组件
hadoop-daemon.sh start/stop namenode/datanode/secondarynamenode
6. 单起YARN组件
yarn-daemon.sh start/stop resourcemanager/nodemanager
7. 集群时间同步
配置时间服务器
1 检查ntp是否安装(必须是root用户配置)
rpm -qa|grep ntp
ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64
2 修改ntp配置文件
vi /etc/ntp.conf
修改一: 授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
修改二: 集群在局域网中,不使用其他互联网上的时间
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
注: 将上面这四段注销即可~~
添加三: 当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步
server 127.127.1.0
fudge 127.127.1.0 stratum 10
3 修改/etc/sysconfig/ntpd 文件
vim /etc/sysconfig/ntpd
增加内容:让硬件时间与系统时间一起同步
SYNC_HWCLOCK=yes
4 重新启动ntpd服务
service ntpd status
service ntpd start
5 设置开机自启动
chkconfig ntpd on
6 其他机器配置(必须是root用户)
1)配置10分钟与时间服务器同步一次
crontab -e
*/10 * * * * /usr/sbin/ntpdate hadoop102
2)修改任意机器时间测试
date -s "1111-11-11 11:11:11"
8. Web端查看信息
8088端口: 查看MR运行情况
50070端口: 查看HDFS集群文件信息
19888端口: 查看JobHistory历史日志
50090端口: SecondaryNameNode信息
9000端口: 集群内部通讯端口
例: slave1:50070
9. 待处理思考问题
HDFS副本存放机制