第四章 Hadoop运行模式
Hadoop运行模式包括:本地模式、伪分布式模式以及完全分布式模式
Hadoop官方网站 : https://hadoop.apache.org
文档链接 :https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster.html
-
4.1本地运行模式
-
4.1.1官方Grep案例
1、在hadoop-2.7.7文件下面创建一个input文件夹
[ge@hadoop101 hadoop-2.7.7]$ mkdir input
2、将Hadoop的xml配置文件复制到input
[ge@hadoop101 hadoop-2.7.7]$ cp etc/hadoop/*.xml input
3、执行share目录下的MapReduce程序
[ge@hadoop101 hadoop-2.7.7]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar grep input output 'dfs[a-z.]+'
4、查看输出结果
[ge@hadoop101 hadoop-2.7.7]$ cat output/*
-
4.1.2官方WordCount案例
1、在hadoop-2.7.7文件下面创建一个wcinput文件夹
[ge@hadoop101 hadoop-2.7.7]$ mkdir wcinput
2、在wcinput文件夹下创建一个wc.input文件
[ge@hadoop101 hadoop-2.7.7]$ cd wcinput/
[ge@hadoop101 wcinput]$ touch wc.input
3、编辑wc.input文件
[ge@hadoop101 wcinput]$ vim wc.input
添加下面内容
hadoop yarn
hadoop mapreduce
ge
ge
保存退出:wq
4、回到Hadoop 目录 /opt/module/hadoop-2.7.7
5、执行程序
[ge@hadoop101 hadoop-2.7.7]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount wcinput/ wcoutput
6、查看结果
[ge@hadoop101 hadoop-2.7.7]$ cat wcoutput/*
-
4.2伪分布式运行模式
-
4.2.1启动HDFS并运行MapRedcue程序
1、分析
(1)配置集群
(2)启动、测试集群增、删、查
(3)执行WordCount案例
2、执行步骤
(1)配置集群
(a)配置:hadoop-env.sh
Linux系统中获得JDK的安装路径
[ge@hadoop101 ~]$ echo $JAVA_HOME /opt/module/jdk1.8.0_161
修改JAVA_HOME路径
export JAVA_HOME=/opt/module/jdk1.8.0_161
(b)配置:core-site.xml
<!--指定HDFS中NameNode的地址--> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!--指定Hadoop运行时产生文件的存储目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.7/data/tmp</value> </property>
(c)配置hdfs-site.xml
<!--指定HDFS副本的数量-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
(2)启动集群
(a)格式化NameNode(第一次启动时格式化,以后不要总格式化)
[ge@hadoop101 hadoop-2.7.7]$ bin/hdfs namenode -format
(b)启动NameNode
[ge@hadoop101 hadoop-2.7.7]$ hadoop-daemon.sh start namenode
(c)启动DataNode
[ge@hadoop101 hadoop-2.7.7]$ hadoop-daemon.sh start datanode
(3)查看集群
(a)查看是否启动成功
[ge@hadoop101 hadoop-2.7.7]$ jps
4738 NameNode
4884 DataNode
4964 Jps
注意:jps是JDK中的命令,不是Linux命令,不安装JDK,不能使用jps.
(b)web端查看HDFS文件系统
http://hadoop101:50070/dfshealth.html#tab-overview
如果不能查看,看如下帖子处理
https://www.cnblogs.com/zlslch/p/6604189.html
(c)查看产生的Log日志s
说明:当企业遇到Bug时,经常根据日志提示信息分析问题、解决bug
当前目录:/opt/module/hadoop-2.7.7/logs
[ge@hadoop101 logs]$ ll 总用量 64 -rw-rw-r--. 1 ge ge 24549 3月 8 14:31 hadoop-ge-datanode-hadoop101.log -rw-rw-r--. 1 ge ge 713 3月 8 14:31 hadoop-ge-datanode-hadoop101.out -rw-rw-r--. 1 ge ge 28509 3月 8 14:31 hadoop-ge-namenode-hadoop101.log -rw-rw-r--. 1 ge ge 713 3月 8 14:27 hadoop-ge-namenode-hadoop101.out -rw-rw-r--. 1 ge ge 761 3月 8 14:26 hadoop-ge-nodename-hadoop101.out -rw-rw-r--. 1 ge ge 0 3月 8 14:27 SecurityAuth-ge.audit
[ge@hadoop101 logs]$ cat hadoop-ge-datanode-hadoop101.log
(d)思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。所以,格式化NameNode时,一点要先删除data数据和log日志,然后再格式化NameNode。
-
4.2.2启动YARN并运行MapRedcue程序
1、分析
(1)配置集群
(2)启动、测试集群增、删、查
(3)执行WordCount案例
2、执行步骤
(1)配置集群
(a)配置:yarn-env.sh
Linux系统中获得JDK的安装路径
[ge@hadoop101 ~]$ echo $JAVA_HOME /opt/module/jdk1.8.0_161
修改JAVA_HOME路径
export JAVA_HOME=/opt/module/jdk1.8.0_161
(b)配置yarn-site.xml
<!--Reducer获取数据的方式--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--指定YARN的ResourceManager的地址--> <property> <name>yarn.nodemanager.hostname</name> <value>hadoop101</value> </property>
(c)配置:mapres-env.sh
配置一下JAVA_HOME,修改JAVA_HOME路径
export JAVA_HOME=/opt/module/jdk1.8.0_161
(d)配置:(对mapred-site.xml.template重新命名为)mapred-site.xml
[ge@hadoop101 hadoop]$ mv mapred-site.xml.template mapred-site.xml
[ge@hadoop101 hadoop]$ vim mapred-site.xml
<configuration>
<!--指定MR运行在YARN上-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(2)启动集群
(a)启动前,必须保证NameNode 和 DataNode 已经启动
(b)启动resourcemanager
[ge@hadoop101 hadoop-2.7.7]$ sbin/yarn-daemon.sh start resourcemanager
(c)启动NodeManager
[ge@hadoop101 hadoop-2.7.7]$ sbin/yarn-daemon.sh start nodemanager
(3)集群操作
(a)YARN的浏览器页面查看,如下图所示
-
4.2.3 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下
1、配置mapred-site.xml
[ge@hadoop102 hadoop-2.7.7]$ vim etc/hadoop/mapred-site.xml
添加如下内容
###选择一个历史服务器###
<!--历史服务器端地址--> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop104:10020</value> </property> <!--历史服务器web端地址--> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop104:19888</value> </property>
重启dfs和yarn即可,并在hadoop104上运行开启历史服务器命令
[ge@hadoop104 ~]$ mr-jobhistory-daemon.sh start historyserver
-
4.2.4 配置日志的聚集
1、配置yarn-site.xml
[ge@hadoop102 hadoop-2.7.7]$ vim etc/hadoop/yarn-site.xml
在该文件中增加如下配置
<!--日志聚集功能--> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!--日志保留时间设置七天--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
4.3完全分布式运行模式(开发重点)
分析:
1)准备三台客户机(关闭防火墙,静态ip,主机名称)
2)安装JDK
3)配置环境变量
4)安装Hadoop
5)配置环境变量
6)配置集群
7)单点启动
8)配置ssh
9)群起并测试集群
-
4.3.1 虚拟机准备
详见3.1章
-
4.3.2 编写集群分发脚本xsync
1、scp(secure copy)安全拷贝
(1)scp 定义:
scp 可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
scp -r $spdir/$fname $user@hadoop$host:$spdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
(3)案例实操
(a)在hadoop1上,将hadoop1中 /opt/module 目录下的软件拷贝到hadoop102上
[ge@hadoop101 ~]$ scp -r hadoop101:/opt/module/ hadoop102:/opt/module/
(b)在hadoop3上,将hadoop1中 /opt/module 目录下的软件拷贝到hadoop103上
[ge@hadoop101 ~]$ scp -r hadoop101:/opt/module/ hadoop103:/opt/module/
2、rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp的区别:用rsync 做文件的复制要比scp的速度更快,rsync只对差异文件做更新。scp是把所有的文件都复制过去
(1)基本语法
rsync -av $spdir/$fname $user@hadoop$host:$spdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
注意:源服务器和目的服务器,一定要有一个在本地
选项参数说明
选项 | 功能 |
-a | 归档拷贝 |
-v | 显示复制过程 |
(2)案例实操
(a)把Hadoop101机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录
[ge@hadoop101 ~]$ rsync -av /opt/software/ hadoop102:/opt/module/
3、rsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析
(a)rsync命令原始拷贝
rsync -av /opt/module root@hadoop103:/opt/
(b)期望脚本
xsync要同步的文件名称
(c)说明:在/home/ge/bin 这个目录下存放的脚本,ge用户可以在系统任何地方执行
(3)脚本实现
(a)在/home/ge 目录下创建bin目录,并在bin目录下创建rsync文件,代码如下:
[ge@hadoop101 ~]$ mkdir bin
[ge@hadoop101 ~]$ cd bin/
[ge@hadoop101 ~]$ touch rsync
[ge@hadoop101 ~]$ vim rsync
在该文件中编写如下代码
#!/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=102;host<105;host++)); do echo --------hadoop$host----------- rsync -av $pdir/$fname $user@hadoop$host:$pdir done
-
4.3.3集群配置
1、集群部署规划
hadoop102 | hadoop103 | hadoop104 | |
HDFS |
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN | NodeManger |
ResourceManager NodeManger |
NodeManger |
2、配置集群
(1)核心配置文件
配置core-site.xml
[ge@hadoop102 hadoop]$ vim core-site.xml
在文件中编写如下配置
<configuration> <!--指定HDFS中NameNode的地址--> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!--指定Hadoop运行时产生文件的存储目录--> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.7/data/tmp</value> </property> </configuration>
(2)HDFS配置文件
配置hadoop-env.sh
[ge@hadoop102 hadoop]$ vim hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_161
配置hdfs-site.xml
<configuration> <!--指定HDFS副本的数量--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--指定Hadoop辅助名称结点主机配置--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> </configuration>
(3)Mapreduce配置文件
配置mapreduce-env.sh
[ge@hadoop102 hadoop]$ vim mapreduce-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_161
配置mapred-site.xml
<configuration> <!--指定MR运行在YARN上--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
(4)YARN配置文件
配置yarn-env.sh
[ge@hadoop102 hadoop]$ vim yarn-env.sh export JAVA_HOME=/opt/module/jdk1.8.0_161
配置yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!--Reducer获取数据的方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--指定YARN的ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
</configuration>
-
4.3.4集群单点启动
重新配置了全新集群,得格式化集群
[ge@hadoop102 hadoop-2.7.7]$ hdfs namenode -format
启动hadoop102单点集群
[ge@hadoop102 hadoop-2.7.7]$ hadoop-daemon.sh start namenode #启动namenode [ge@hadoop102 hadoop-2.7.7]$ hadoop-daemon.sh start datanode #启动datanode
[ge@hadoop102 hadoop-2.7.7]$ jps #查看启动情况
启动hadoop103单点集群
[ge@hadoop103 hadoop-2.7.7]$ hadoop-daemon.sh start datanode #启动datanode [ge@hadoop103 hadoop-2.7.7]$ jps #查看启动情况
启动hadoop104单点集群
[ge@hadoop104 hadoop-2.7.7]$ hadoop-daemon.sh start secondarynamenode #启动secondarynamenode [ge@hadoop104 hadoop-2.7.7]$ hadoop-daemon.sh start datanode #启动datanode [ge@hadoop104 hadoop-2.7.7]$ jps #查看启动情况
http://hadoop102:50070/dfshealth.html#tab-datanode
-
4.3.5 SSH免密登录配置
-
4.3.6 集群群起
-
4.3.7 集群启动/停止方式总结
-
4.3.8 集群时间同步(时间一样,但不一定对)
HBase对此要求很严格,hadoop要求不高
时间同步的方式,找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间
配置时间同步具体步骤
1、时间服务器配置(必须root用户)
普通用户切换到root用户
[ge@hadoop103 hadoop]$ su - #输入root用户密码即可
(1)检查 ntp是否安装
[root@hadoop104 ~]# rpm -qa |grep ntp fontpackages-filesystem-1.41-1.1.el6.noarch ntpdate-4.2.6p5-10.el6.centos.x86_64 ntp-4.2.6p5-10.el6.centos.x86_64
(2)查看ntp服务是否开始
[root@hadoop102 ~]# service ntpd status #开启要把停掉
ntpd 已停
(3)修改ntp配置文件
[root@hadoop102 ~]# 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 改为 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(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提高时间同步)
server 127.127.1.0 fudge 127.127.1.0 stratum 10
(4)修改/etc/sysconfig/ntpd文件
[root@hadoop102 ~]# vim /etc/sysconfig/ntpd
在文件中添加一下内容
SYNC_HWCLOCK=yes
(5)重启ntpd服务
[root@hadoop102 ~]# service ntpd status ntpd 已停 [root@hadoop102 ~]# service ntpd start 正在启动 ntpd: [确定] [root@hadoop102 ~]#
(6)设置ntpd服务开机启动
[root@hadoop102 ~]# chkconfig ntpd on
2、其他服务器配置(必须是root用户)
(1)在其他机器上配置10分钟与时间服务器同步一次
[root@hadoop104 ~]# crontab -e
编制定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
[root@hadoop104 ~]# date 2020年 03月 13日 星期五 14:49:51 CST You have new mail in /var/spool/mail/root [root@hadoop104 ~]# date -s "2017-9-11 11:11:11" 2017年 09月 11日 星期一 11:11:11 CST [root@hadoop104 ~]# date 2017年 09月 11日 星期一 11:11:14 CST
(3)10分钟后查看机器是否与时间服务器同步
[root@hadoop104 ~]# date