目标:
1 本地模式
2 分布式搭建
3 集群测试
hadoop运行模式
1 本地模式
1.1 hadoop官网运行测试
mkdir input
$ cp etc/hadoop/*.xml input
[atguigu@localhost hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
记住:1 位置很重要,进入hadoop-3.1.3文件下进行操作,要是再别的位置,则需要改变相应的位置 2 hadoop的grep 不是linux的grep ,两个意思 。 3 该代码是将input的查找数据输出到output中,再output中的part-r-0000中可以看到查询的具体数据 4 将grep 换成wordcount,可以计算文件里面的单词个数
1.2 图形化的虚拟机需要卸载自带的openJDK
2 分布式搭建
2.1 要求 模拟准备3台虚拟机
2.2 scp安全拷贝
语法:scp -r 资源文件 目标文件
1 scp test.txt atguitu@192.168.40.103: /opt/software
将当前机器位置下的test.txt 拷贝到103的机器中,
存放在 opt/software里面
2 scp -r aa atguitu@192.168.40.104: /opt/software
将当前机器位置下的aa文件 拷贝到104的机器中,
存放在 opt/software里面
2.3 rsync 远程同步工具
rsync -av test.txt atguigu@192.168.40.104: /opt/software
2.4 集群规划
1 理论规划:
1)HDFS:NameNode,DataNode,secondryNode
2) Yarn:ResourceManager,NodeManager
3) NameNode,secondryNode,ResourceManager对资源的消耗比较大,应该分别部署在三台机器上
4)按照hadoop官方默认的3个副本说明,最少需要3个dataNode节点,也就是3台机器
5)nodeManager 主要管理的dataNode节点,因此nodeManager和dataNode要在一台服务器上,(每一个dataNode都有与其对应的nodeManager)
6)理论上集群最少需要6台机器
2 实际情况:
现有机器:
102:dataNode nodeManager nameNode
103:dataNode nodeManager resourceManager
104:dataNode nodeManager secondryNode
2.4.1配置文件
2.4.2 配置集群
1 核心配置文件
配置core-site.xml
cd /opt/module/hadoop-3.1.3/etc/hadoop
vim core-site.xml
文件内容如下:
<!--指定NameNode的节点-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.40.102:8020</value>
</property>
<!--指定hadoop数据的存储目录
官方配置文件中的配置项是hadoop.tmp.dir
,用来指定hadoop数据的存储目录,此次配置用的hadoop.data.dir是
自己定义的变量, 因为在hdfs-site.xml中会使用此配置的值来
具体指定namenode和datanode存储数据的目录-->
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 下面是兼容性配置,先跳过 -->
<!-- 配置该caron(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.caron.hosts</name>
<value>*</value>
</property>
<!-- 配置该caron(superuser)允许代理的用户所属组 -->
<property>
<name>hadoop.proxyuser.caron.groups</name>
<value>*</value>
</property>
<!-- 配置该caron(superuser)允许代理的用户-->
<property>
<name>hadoop.proxyuser.caron.users</name>
<value>*</value>
</property>
2 HDFS配置文件
配置hdfs-site.xml
vim hdfs-site.xml
文件内容如下:
<!-- 指定副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定NameNode数据的存储目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<!--指定Datanode数据的存储目录-->
<property>
<name>dfs.datanode.data.dir</name>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定NameNode数据的存储目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<!--指定Datanode数据的存储目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<!--指定SecondaryNameNode数据的存储目录-->
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<!-- 兼容配置,先跳过 -->
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30s</value>
</property>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>192.168.40.102:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>192.168.40.104:9868</value>
</property>
3 YARN配置文件
配置yarn-site.xml
vim yarn-site.xml
文件内容如下:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.40.103</value>
</property>
<!-- 环境变量的继承-->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<!--取消虚拟内存的限制
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
-->
4 MapReduce配置文件
配置mapred-site.xml
vim mapred-site.xml
文件内容如下:
<!--指定MapReduce程序运行在Yarn上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
2.2.3、在集群上分发配置好的hadoop
xsync集群分发脚本之前需要创建脚本 (a)在/home/atguigu目录下创建bin目录,并在bin目录下创建xsync文件
[atguigu@hadoop102 hadoop] cd /home/caron
[atguigu@hadoop102 ~] mkdir bin
[atguigu@hadoop102 bin] touch xsync
[atguigu@hadoop102 bin] vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in 192.168.40.102 192.168.40.103 192.168.40.104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
(b)修改脚本 xsync 具有执行权限
chmod +x xsync
(d)测试脚本
xsync /home/caron/xsync
分发配置命令:
xsync /opt/module/hadoop-3.1.3/etc/hadoop
2.4.4、集群单点启动
(1)如果集群是第一次启动,在102机器需要格式化NameNode
hdfs namenode -format
(2)在hadoop102上启动NameNode
hdfs --daemon start namenode
完成后执行jps命令,看到如下结果(进程号可能不同):
3461 NameNode
(3)在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)
hdfs --daemon start datanode
(4)在Hadoop104上执行如下命令
hdfs --daemon start secondarynamenode
(5)web界面查看
http://192.168.40.102:9870/
http://192.168.40.103:8088/
(6)在hadoop103上执行如下命令
yarn --daemon start resourcemanager
(7)在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)
yarn --daemon start nodemanager
2.4.5 格式化需要注意的问题
格式化NameNode,会产生新的集群id(clusterID),导致DataNode中记录的集群
id(clusterID)和 NameNode中的集群id不一致,DataNode找不到NameNode
所以,格式NameNode的时候,一定要删除每个节点的data目录和log日志,
然后再格式化NameNode
2.4.6 出问题看日志
1 明确在哪台机器出的问题
2 看日志:tail -n 300 ***.log 看最新的300行数据
2.4.7 ssh免密登录
6.1 分别在102,103,104生成公钥
ssh-keygen -t rsa
然后敲(四个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
6.2 将公钥拷贝到要免密登录的目标机器上
ssh-copy-id 192.168.40.102
ssh-copy-id 192.168.40.103
ssh-copy-id 192.168.40.104
注意:需要每种账户都配置,才能使用相关账户具有无密登录的权限,目前是用的atguigu设置,就是说在root用户,或者其他用户都没有权限免密登录,除非在重新配置
2.4.8、群起集群
1. 配置workers,要是hadoop2.x中是slaves文件
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
192.168.40.102
192.168.40.103
192.168.40.104
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
xsync /opt/module/hadoop-3.1.3/etc/hadoop/workers
2.4.9. 启动集群
(1)如果集群是第一次启动,需要在hadoop101节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
hdfs namenode -format
(2)启动HDFS
start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop102)启动YARN
start-yarn.sh
2.4.10、集群启动/停止方式总结
- 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
2.4.11. 各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
2.4.12 集群的启动和停止脚本 在102机器中 编写mySlavers.sh
#!/bin/bash
if [ $# -lt 1 ];
then
echo "Input Args is Error !!!"
exit
fi
case $1 in
start)
echo "=========start hdfs==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "=========start yarn==========="
ssh 192.168.40.103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
;;
stop)
echo "=========stop yarn==========="
ssh 192.168.40.103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
echo "=========stop hdfs==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
;;
*)
echo "Input Args is Error !!!"
;;
esac
2.4.12 查看集群中各个机器进程的脚本,在102中编写myjps.sh脚本
#!/bin/bash
for i in 192.168.40.102 192.168.40.103 192.168.40.104
do
echo "=============$i JPS================"
ssh $i /opt/module/jdk1.8.0_301/bin/jps
done
3 集群测试
3.1在HDFS中创建目录,在102机器中
hadoop fs -mkdir /input
3.2 上传数据到HDFS
hadoop fs -put /opt/software/hadoop-3.1.3.tar.gz /input
注意:上传到HDFS的文件,HDFS是按块大小划分,默认是128M,如果超过128M,将划分多块
3.3 执行wordcount程序,在102机器上
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /wcoutput
4 日志、历史服务器搭建
4.1、配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
1. 配置mapred-site.xml
vim mapred-site.xml
在该文件里面增加如下配置。
<!--历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.40.102:10020</value>
</property>
<!--历史服务器web端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.40.102:19888</value>
</property>
2. 分发配置
xsync mapred-site.xml
3. 在102启动历史服务器
mapred --daemon start historyserver
4. 查看历史服务器是否启动
jps
5. 查看JobHistory
http://192.168.40.102:19888/jobhistory
4.2、配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。所以为了方便起见,先全部关闭,群停服务 执行./myclusters stop 代码如下
#!/bin/bash
if [ $# -lt 1 ];
then
echo "Input Args is Error !!!"
exit
fi
case $1 in
start)
echo "=========start hdfs==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/sbin/start-dfs.sh
echo "=========start yarn==========="
ssh 192.168.40.103 /opt/module/hadoop-3.1.3/sbin/start-yarn.sh
echo "=========start jobhistory==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver
;;
stop)
echo "=========stop yarn==========="
ssh 192.168.40.103 /opt/module/hadoop-3.1.3/sbin/stop-yarn.sh
echo "=========stop hdfs==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/sbin/stop-dfs.sh
echo "=========stop jobhistory==========="
ssh 192.168.40.102 /opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver
;;
*)
echo "Input Args is Error !!!"
;;
esac
开启日志聚集功能具体步骤如下:
1. 配置yarn-site.xml
vim yarn-site.xml
在该文件里面增加如下配置。
<!--是否开启日志聚集功能-->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--日志聚集web端地址-->
<property>
<name>yarn.log.server.url</name>
<value>http://192.168.40.102:19888/jobhistory/logs</value>
</property>
<!--日志保存时常 默认7天-->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
2. 分发配置
xsync yarn-site.xml
3 群起服务
./myclusters start
4.3、集群时间同步
时间服务器配置(必须root用户) (1)在所有节点关闭ntp服务和自启动
sudo systemctl stop ntpd
sudo systemctl disable ntpd
(2)修改ntp配置文件
sudo vim /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
去掉注释 去掉前面的#
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
全部增加注释 在最前面加#号
c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)
server 127.127.1.0
fudge 127.127.1.0 stratum 10
(3)修改/etc/sysconfig/ntpd 文件
sudo vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
Tips:
系统时间: 一般说来就是我们执行date命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取 这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而 定)
(4)重新启动ntpd服务
sudo systemctl start ntpd
(5)设置ntpd服务开机启动
sudo systemctl enable ntpd
- 其他机器配置(必须root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
sudo crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop101
(2)修改任意机器时间
sudo date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
date
5 hadoop相关端口
|