目标
运行环境配置
- 准备三台Linux虚拟机,并且配好ip,网关,子掩码等。原则互相通讯,也能外连Windows主机,并且在/opt目录下创建两个目录,一个是software,一个是module。
- 三台虚拟机关闭所有防火墙服务。
- 利用工具将Windows下载的jdk与hadoop压缩包传送到Linux放到module目录下,保证software和module的属主和属组都是当前操作用户(即有操作权限)。
- 将jdk和hadoop解压到module。(安装前验证java是否已经安装)
xx]$ rpm -qa | grep java
xx]$ sudo rpm -e 软件包
- 在/etc/profile里面配置JAVA_HOME,HADOOP_HOME并且加入到PATH中
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
每次服务器更改了profile文件,一定要在/etc下面 source profile
!!
再利用scp命令传到其他虚拟机
命令 | 递归 | 要拷贝的文件路径/名称 | 目的用户@主机: | 目的路径/名称 |
---|---|---|---|---|
scp | -r | $pdir/$fname | $user@hadoop$host: | $pdir/$fname |
@hadoop101 /]$ scp -r /opt/module root@hadoop107:/opt/module
或者
@hadoop101 opt]$ rsync -av /opt/software/ hadoop107:/opt/software
- 配置hosts
在 /etc/hosts 中配置(根据自己的网关配置,Windows上面也配好方便查看8088和50070端口信息)
192.168.58.100 hadoop100
192.168.58.101 hadoop101
192.168.58.102 hadoop102
192.168.58.103 hadoop103
192.168.58.104 hadoop104
192.168.58.105 hadoop105
192.168.58.106 hadoop106
192.168.58.107 hadoop107
192.168.58.108 hadoop108
9.配置网络,我选择105到107段配置配置方法下面点击
添加链接描述
脚本分发
原理
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
命令 | 递归 | 要拷贝的文件路径/名称 | 目的用户@主机: | 目的路径/名称 |
---|---|---|---|---|
rsync | -av | $pdir/$fname | $user@hadoop$host: | $pdir/$fname |
命令使用案例
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
参数说明
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
(2)案例实操
(a)把hadoop107机器上的/opt/software目录同步到hadoop105服务器的root用户下的/opt/目录
hadoop107 opt]$ rsync -av /opt/software/ hadoop105:/opt/software
3. xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:
rsync -av /opt/module root@hadoop105:/opt/
(b)期望脚本:
xsync要同步的文件名称
(c)说明:在/home/zhengkw/bin这个目录下存放的脚本,zhengkw用户可以在系统任何地方直接执行。
(3)脚本实现
(a)在/home/zhengkw目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下:
hadoop107 ~]$ mkdir bin
hadoop107 ~]$ cd bin/
hadoop107 bin]$ vi xsync
在该文件中编写如下代码
#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi
#2 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取当前用户名称
user=`whoami`
#5 循环
for host in hadoop105 hadoop106 hadoop107
do
echo ------------------- $host --------------
rsync -av $pdir/$fname $user@$host:$pdir
done
测试
修改脚本 xsync 具有执行权限
@hadoop107 bin]$ chmod 777 xsync
调用脚本形式:xsync 文件名称
hadoop107 bin]$ xsync /home/zhengkw/bin
搞定!!
SSH免密传输
生成密钥
ssh-keygen -t rsa
将密钥分发给需要免密的机器
将公钥拷贝到要免密登录的目标机器上
hadoop107 .ssh]$ ssh-copy-id hadoop107 #(内部通讯)
hadoop107 .ssh]$ ssh-copy-id hadoop106
hadoop107 .ssh]$ ssh-copy-id hadoop105
NameNode配置的服务器需要将公钥给别的机器
ResourceManager的服务器也是需要生成密钥分发给别的服务器公钥
集群环境准备
核心配置文件
核心文件 | 主要作用 |
---|---|
core-site.xml | 指定HDFS中NameNode的地址 ,Hadoop运行时产生文件的存储目录 |
hdfs-site.xml | 指定副本数量 指定SN节点 |
hadoop-env.sh | hadoop运行环境,配置hdfs必要环境 |
yarn-site.xml | 指定Reducer获取数据的方式,ResourceManager的地址 |
yarn-env.sh | yarn运行环境 |
mapred-env.sh | mr运行环境 |
mapred-site.xml | 将MR指定到yarn中 ,配置历史服务器 |
slaves etc/hadoop/slaves | 不能空行不能空格!! 配置集群 |
所有配置文件的路径如下
/opt/module/hadoop-2.7.2/etc/hadoop/
- 配置core-site.xml
在该文件中编写如下配置
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop107:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
- HDFS配置文件
配置hadoop-env.sh
#将JAVA_HOME=修改为绝对路径(jdk在哪里就配哪里)
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置hdfs-site.xml
在该文件中编写如下配置
<!-- 指定副本数量3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop106: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>hadoop105</value>
</property>
- MapReduce配置文件
配置mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置mapred-site.xml
在该文件中增加如下配置
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
配置slaves
slaves是作为群起脚本输入的host,里面存放的都是datanode节点的host名称
hadoop105
hadoop106
hadoop107
代码不能有空行,不能有空格!
集群启动
集群启动首要是配置好免密登录和slaves,hosts!
配置slaves(**注意:**配置文件里不能存在空格和空行不然会导致启动namenode时初始化报错)
坐标:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
@hadoop107 hadoop]$ vim slaves
在该文件中增加如下内容:
hadoop105
hadoop106
hadoop107
同步所有节点配置文件
@hadoop107 hadoop]$ xsync slaves
启动集群
(1)如果集群是第一次启动,需要格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
hadoop107 hadoop-2.7.2]$ bin/hdfs namenode -format
切换到/opt/module/hadoop-2.7.2目录下执行
hadoop107 hadoop-2.7.2]$ sbin/start-dfs.sh
启动YARN
转到配置了ResourceManager的服务器,群起yarn服务
hadoop105 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
集群停止
在配置NameNode节点上面运行
stop-dfs.sh
在配置ResourceManger节点上运行
stop-yarn.sh
配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
- 配置mapred-site.xml
hadoop107 hadoop]$ vi mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop107:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop107:19888</value>
</property>
- 分发配置
xsync etc/hadoop/mapred-site.xml
- 启动历史服务器(可以随意挂载到任何服务器,哪里挂载哪里启动)
sbin/mr-jobhistory-daemon.sh start historyserver
- 查看历史服务器是否启动
[zhengkw@hadoop107 hadoop-2.7.2]$ jps
- 查看JobHistory
http://hadoop107:19888/jobhistory
配置日志的聚集
- 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
- 日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
开启日志聚集功能具体步骤如下:
- 配置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>
- 分发配置
hadoop107 hadoop-2.7.2]$ xsync etc/hadoop/yarn-site.xml
因为修改了yarn文件 所以影响了nm rm hs服务!
- 关闭NodeManager 、ResourceManager和HistoryServer
hadoop105 hadoop-2.7.2]$ sbin/stop-yarn.sh
hadoop107 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh stop historyserver
- 启动NodeManager 、ResourceManager和HistoryServer
hadoop105 hadoop-2.7.2]$ sbin/start-yarn.sh
hadoop107 hadoop-2.7.2]$ sbin/mr-jobhistory-daemon.sh start historyserver
- 删除HDFS上已经存在的输出文件
hadoop107 hadoop-2.7.2]$ bin/hdfs dfs -rm -R /user/zhengkw/output
- 执行WordCount程序
hadoop107 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/zhengkw/input /user/zhengkw/output
- 查看日志
http://hadoop107:19888/jobhistory
集群时间同步
- 时间服务器配置(必须root用户)
(1)检查ntp是否安装
[root@hadoop107 桌面]# 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配置文件
[root@hadoop107 桌面]# vi /etc/ntp.conf
修改内容如下
a)修改1(授权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
b)修改2(集群在局域网中,不使用其他互联网上的时间)
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 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
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
添加到上面步骤b server 那一段
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
[root@hadoop107 桌面]# vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
(4)重新启动ntpd服务
[root@hadoop107 桌面]# service ntpd status
ntpd 已停
[root@hadoop107 桌面]# service ntpd start
正在启动 ntpd: [确定]
(5)设置ntpd服务开机启动
[root@hadoop107 桌面]# chkconfig ntpd on
(6)在master机器上设置定时任务(每1小时执行一次!)
* */1 * * * /usr/sbin/ntpdate -u ntp1.aliyun.com & > /home/zhengkw/ntp.log
- 其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
[root@hadoop105桌面]# crontab -e
编写定时任务如下(附带打印日志到/var/log/):
*/10 * * * * /usr/sbin/ntpdate -u hadoop107 &> &>/var/log/ntpdate.log
(2)修改任意机器时间
[root@hadoop105 桌面]# date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
[root@hadoop105桌面]# date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。
总结
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件:
|
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] | hadoop-common-2.7.2.jar/ core-default.xml |
[hdfs-default.xml] | hadoop-hdfs-2.7.2.jar/ hdfs-default.xml |
[yarn-default.xml] | hadoop-yarn-common-2.7.2.jar/ yarn-default.xml |
[mapred-default.xml] | hadoop-mapreduce-client-core-2.7.2.jar/ mapred-default.xml |
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
核心配置文件
核心文件 | 主要作用 |
---|---|
core-site.xml | 指定HDFS中NameNode的地址 ,Hadoop运行时产生文件的存储目录 |
hdfs-site.xml | 指定副本数量 【namenode.secondary】2nn的配置 上电时加载到内存(启动服务时仅一次!) |
hadoop-env.sh | hadoop运行环境,配置hdfs必要环境 |
yarn-site.xml | 指定Reducer获取数据的方式,ResourceManager的地址 |
yarn-env.sh | yarn运行环境 |
mapred-env.sh | mr运行环境 |
mapred-site.xml | 将MR指定到yarn中 ,配置历史服务器 |
slaves etc/hadoop/slaves | 不能空行不能空格!! 配置集群 |
(3)修改一台主机配置文件,其他的用脚本分发!注意scp命令传输时用的是目的地虚拟机的root用户,所以一定时刻注意主属组属权限!
(4) slaves 文件里不能有空行和末尾空格!
(5) 每个.env都要重新配置JAVA_HOME原因是跨服务器访问时可能需要重新声明,所以直接配上以免读不到java环境!
最后每次初始化namenode时必须保证每个节点的hadoop目录里没有logs 和data 目录!