Hadoop的运行模式包括:本地模式、伪分布式模式和完全分布式模式。
具体可参考官方网站:http://hadoop.apache.org/
1.本地运行模式
1.1 官方Grep案例
(1)在hadoop-3.1.3目录下面创建一个input文件夹
cd /opt/module/hadoop-3.1.3
mkdir input
(2)将Hadoop的xml配置文件复制到input
cp etc/hadoop/*.xml input
(3)执行share目录下的MapReduce程序
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
(4)查看输出结果
cat output/*
1.2 官方WordCount案例
(1)在hadoop-3.1.3目录下面创建一个wcinput文件夹
mkdir wcinput
(2)在wcinput文件下创建一个wc.input文件
cd wcinput
(3)编辑wc.input文件
vi wc.input
输入如下内容:
hadoop yarn
hadoop mapreduce
scala
java
保存退出。
(4)回到Hadoop目录/opt/module/hadoop-3.1.3
(5)执行程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
(6)查看结果
[JL@hadoop101 hadoop-3.1.3]$ cat wcoutput/part-r-00000
看到如下结果:
scala 1
java 1
hadoop 2
mapreduce 1
yarn 1
2.伪分布式运行模式
2.1 启动HDFS并运行MapReduce程序
2.1.1 分析
(1)配置集群
(2)启动、测试集群增、删、查
(3)执行WordCount案例
2.1.2 执行步骤
(1)配置集群
a. 配置:hadoop-env.sh
Linux系统中获取JDK的安装路径:
[JL@ hadoop101 ~]# echo $JAVA_HOME
/opt/module/jdk1.8.0_212
修改JAVA_HOME路径:
export JAVA_HOME=/opt/module/jdk1.8.0_212
b. 配置:core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9820</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data/tmp</value>
</property>
c. 配置hdfs-site.xml
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
(2)启动集群
a. 格式化NameNode(只在第一次启动时格式化)
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs namenode -format
b. 启动NameNode
[JL@hadoop101 hadoop-3.1.3]$ sbin/hadoop-daemon.sh start namenode (已过时)
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs –daemon start namenode
c. 启动DataNode
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs –daemon start datanode
(3)查看集群
a. 查看是否启动成功
[JL@hadoop101 hadoop-3.1.3]$ jps
13586 NameNode
13668 DataNode
13786 Jps
注意:jps是JDK中的命令,不是Linux命令。
b. web端查看HDFS文件系统
http://hadoop101:9870
c. 常用端口号说明
Daemon | App | Hadoop2 | Hadoop3 |
---|---|---|---|
NameNode | NameNode RPC | 8020/9000 | 9820 |
NameNode | NameNode HTTP UI | 50070 | 9870 |
Secondary NameNode | Secondary NameNode HTTP UI | 50090 | 9868 |
DataNode | DataNode IPC | 50020 | 9867 |
DataNode | DataNode HTTP UI | 50075 | 9864 |
(4)出现问题查看日志
当前目录:/opt/module/hadoop-3.1.3/logs
[JL@hadoop101 logs]$ ls
-rw-rw-r--. 1 JL JL 31356 3月 27 14:13 hadoop-JL-datanode-hadoop202.log //datanode的日志
-rw-rw-r--. 1 JL JL 690 3月 27 14:13 hadoop-JL-datanode-hadoop202.out
-rw-rw-r--. 1 JL JL 110234 3月 27 14:13 hadoop-JL-namenode-hadoop202.log //namenode的日志
-rw-rw-r--. 1 JL JL 690 3月 27 14:12 hadoop-JL-namenode-hadoop202.out
-rw-rw-r--. 1 JL JL 690 3月 27 14:11 hadoop-JL-namenode-hadoop202.out.1
-rw-rw-r--. 1 JL JL 690 3月 27 14:10 hadoop-JL-namenode-hadoop202.out.2
-rw-rw-r--. 1 JL JL 0 3月 27 14:09 SecurityAuth-JL.audit
(5)操作集群
a. 在HDFS文件系统上创建一个input文件夹
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -mkdir -p /user/JL/input
b. 将测试文件内容上传到文件系统上
[JL@hadoop101 hadoop-3.1.3]$bin/hdfs dfs -put wcinput/wc.input
/user/JL/input/
c. 查看上传的文件是否正确
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -ls /user/JL/input/
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -cat /user/JL/ input/wc.input
d. 运行MapReduce程序
[JL@hadoop101 hadoop-3.1.3]$ bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/JL/input/ /user/JL/output
e. 查看输出结果
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -cat /user/JL/output/*
f.将测试文件内容下载到本地
[JL@hadoop101 hadoop-3.1.3]$ hdfs dfs -get /user/JL/output/part-r-00000 ./wcoutput/
g. 删除输出结果
[JL@hadoop101 hadoop-3.1.3]$ hdfs dfs -rm -r /user/JL/output
2.2 格式化需要注意的问题
重新格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往的数据。所以,格式化NameNode的时候,一定要伤处data数据和logs日志,然后再格式化NameNode
2.3 启动Yarn并运行MapReduce程序
2.3.1 分析
(1)配置集群在yarn上运行MR
(2)启动、测试集群增删查功能
(3)在yarn上执行WordCount案例
2.3.2 执行步骤
(1)配置集群
a. 配置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>hadoop101</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>
b. 配置mapred-site.xml
[JL@hadoop101 hadoop]$ vi mapred-site.xml
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(2)启动集群
a. 启动前必须保证NameNode和DataNode已经启动
b. 启动ResourceManager
[JL@hadoop101 hadoop-3.1.3]$ sbin/yarn-daemon.sh start resourcemanager (已过时)
[JL@hadoop101 hadoop-3.1.3]$ bin/yarn --daemon start resourcemanager
c. 启动NodeManager
[JL@hadoop101 hadoop-3.1.3]$ bin/yarn --daemon start nodemanager
(3)集群操作
a. yarn的浏览器页面查看
http://hadoop101:8088
b. 执行MapReduce程序
[JL@hadoop101 hadoop-3.1.3]$ bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/JL/input /user/JL/output
c. 查看运行结果
[JL@hadoop101 hadoop-3.1.3]$ bin/hdfs dfs -cat /user/JL/output/*
http://hadoop101:8088
2.4 配置文件说明
Hadoop配置文件分两类:默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
(1)默认配置文件
默认文件名 | 文件存放在Hadoop的jar包中的位置 |
---|---|
core-default.xml | hadoop-common-3.1.3.jar/ core-default.xml |
hdfs-default.xml | hadoop-hdfs-3.1.3.jar/ hdfs-default.xml |
yarn-default.xml | hadoop-yarn-common-3.1.3.jar/ yarn-default.xml |
mapred-default.xml | hadoop-mapreduce-client-core-3.1.3.jar/ mapred-default.xml |
(2)自定义配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。
3.完全分布式运行模式
3.1 虚拟机准备
参考hadoop之运行环境搭建一文。
3.2 编写集群分发脚本xsync
3.2.1 scp(secure copy)安全拷贝
(1)scp定义
scp可以实现服务器与服务器之间的数据拷贝
(2)基本语法
scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
3.2.2 rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
参数说明:
-a:归档拷贝
-v:显示复制过程
3.2.3 xsync集群分发脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)脚本实现
在/home/JL目录下创建bin目录,并且在bin目录下创建xsync文件
[JL@hadoop101 hadoop] cd /home/JL
[JL@hadoop101 ~] mkdir bin
[JL@hadoop101 bin] touch xsync
[JL@hadoop101 bin] vim xsync
在该文件中编写如下代码:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop101 hadoop102 hadoop103
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
修改脚本xsync具有执行权限:
chmod +x xsync
测试脚本:
sudo xsync xsync
3.3 集群配置
3.3.1集权部署规划
组件 | hadoop101 | hadoop102 | hadoop103 |
---|---|---|---|
HDFS | NN/DN | DN | 2NN/DN |
YARN | NM | RM/NM | NM |
说明:
NN:NameNode
DN:DataNode
RM:ResourceManager
NM:NodeManager
3.3.2 配置
(1)核心配置文件
配置core-site.xml
cd $HADOOP_HOME/etc/hadoop
vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<property>
<name>hadoop.data.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<property>
<name>hadoop.proxyuser.JL.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.JL.groups</name>
<value>*</value>
</property>
</configuration>
(2)HDFS配置文件
配置hdfs-site.xml
cd $HADOOP_HOME/etc/hadoop
vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
(3)Yarn配置文件
配置yarn-site.xml
cd $HADOOP_HOME/etc/hadoop
vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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>
</configuration>
(4)MapReduce配置文件
配置mapred-site.xml
cd $HADOOP_HOME/etc/hadoop
vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.3.3 分发文件
xsync /opt/module/hadoop-3.1.3
3.4 集群单点启动
(1)如果集群是第一次启动,需要格式化NameNode
hdfs namenode -format
(2)在hadoop102上启动NameNode
hdfs --daemon start namenode
完成后执行jps命令,看到如下结果(进程号可能不同):
3461 NameNode
(3)在hadoop102、hadoop103以及hadoop104上执行如下命令(三台都要执行)
hdfs --daemon start datanode
3.5 SSH免密登录配置(为群起/群停做准备)
3.5.1 配置ssh
(1)生成公钥和私钥:
ssh-keygen -t rsa
连续敲三个回车,就会生成两个文件:id_rsa(私钥)、id_rsa.pub(公钥)
(2)将公钥拷贝到要免密登陆的目标机器上
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
注意:
还需要在hadoop101上采用root账号,配置一下无密登录到hadoop101、hadoop102、hadoop103;
还需要在hadoop102上采用JL账号配置一下无密登录到hadoop101、hadoop102、hadoop103服务器上。
3.6 群起集群
3.6.1 配置workers
在2.x版本为slaves文件
vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop101
hadoop102
hadoop103
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
xsync workers
3.6.2 启动集群
(1)如果集群是第一次启动,需要在hadoop101节点格式化NameNode(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)
hdfs namenode -format
(2)启动HDFS
sbin/start-dfs.sh
(3)在配置了ResourceManager的节点(hadoop102)启动YARN
sbin/start-yarn.sh
3.6.3 集群基本测试
(1)上传文件到集群
上传小文件
hadoop fs -mkdir -p /user/JL/input
hadoop fs -put $HADOOP_HOME/wcinput/wc.input /user/JL/input
上传大文件
hadoop fs -put /opt/software/hadoop-3.1.3.tar.gz /
(2)上传文件后查看文件存放在什么位置
a. 查看HDFS文件存储路径
[JL@hadoop102 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
b. 查看HDFS在磁盘存储文件内容
[JL@hadoop102 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
JL
JL
(3)拼接
-rw-rw-r--. 1 JL JL 134217728 5月 23 16:01 blk_1073741836
-rw-rw-r--. 1 JL JL 1048583 5月 23 16:01 blk_1073741836_1012.meta
-rw-rw-r--. 1 JL JL 63439959 5月 23 16:01 blk_1073741837
-rw-rw-r--. 1 JL JL 495635 5月 23 16:01 blk_1073741837_1013.meta
[JL@hadoop102 subdir0]$ cat blk_1073741836>>tmp.jar
[JL@hadoop102 subdir0]$ cat blk_1073741837>>tmp.jar
[JL@hadoop102 subdir0]$ tar -zxvf tmp.jar
(4)下载
[JL@hadoop102 hadoop-3.1.3]$ bin/hadoop fs -get
/hadoop-3.1.3.tar.gz ./
(5)执行wordcount程序
[JL@hadoop102 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/JL/input /user/JL/output
3.7 集群启动/停止方式总结
3.7.1 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止YARN
yarn --daemon start/stop resourcemanager/nodemanager
3.7.2 各个模块分开启动/停止(配置ssh是前提)——常用
(1)整体启动/停止HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止YARN
start-yarn.sh/stop-yarn.sh
3.8 配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
(1)配置mapred-site.xml
cd $HADOOP_HOME/etc/hadoop
vim mapred-site.xml
在改文件中添加如下配置:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
(2)分发配置
xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
(3)在hadoop101启动历史服务器
mapred --daemon start historyserver
(4)使用jps查看历史服务器是否启动
(5)web端查看JobHistory
http://hadoop101:19888/jobhistory
3.9 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情(历史服务器的logs),方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。
(1)配置yarn-site.xml
cd $HADOOP_HOME/etc/hadoop
vim yarn-site.xml
在该文件里面增加如下配置:
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop101:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/tmp/logs</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>
(2)分发配置
xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
(3)关闭NodeManager 、ResourceManager和HistoryServer
在102上执行: stop-yarn.sh
在101上执行: mapred --daemon stop historyserver
(4)启动NodeManager 、ResourceManager和HistoryServer
在102上执行:start-yarn.sh
在101上执行:mapred --daemon start historyserver
(5)删除HDFS上已经存在的输出文件
hdfs dfs -rm -R /user/JL/output
(6)执行WordCount程序
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /user/JL/input /user/JL/output
(7)查看日志,如图所示
http://hadoop101:19888/jobhistory
4.集群时间同步配置
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
4.1 时间服务器配置(必须使用root用户)
(1)所有节点关闭ntp服务何自启动
sudo systemctl stop ntpd
sudo systemctl disable ntpd
(2)修改ntp配置文件
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
(3)修改/etc/sysconfig/ntpd文件
vim /etc/sysconfig/ntpd
增加内容如下(让硬件时间与系统时间一起同步)
SYNC_HWCLOCK=yes
说明:
系统时间:一般指执行date命令看到的时间,linux系统下的所有时间调用(撤了直接访问硬件时间的命令)都是使用该时间;
硬件时间:主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
(4)重新启动ntpd服务
systemctl start ntpd
(5)设置ntpd服务开机启动
systemctl enable ntpd
4.2 其他机器配置(必须使用root用户)
(1)在其他机器配置10分钟与时间服务器同步一次
crontab -e
编写定时任务如下:
*/10 * * * * /usr/sbin/ntpdate hadoop102
(2)修改任意机器时间
date -s "2017-9-11 11:11:11"
(3)十分钟后查看机器是否与时间服务器同步
date
说明:测试的时候可以将10分钟调整为1分钟,节省时间。