文章目录
Hadoop 运行模式
1、本地运行模式(WordCount)
1.1 在 hadoop-3.1.3 文件下面创建一个 fileinput 文件夹
[xiaoxq@hadoop105 hadoop-3.1.3]$ mkdir fileinput
1.2 在 filenput 文件下创建一个word.txt文件
[xiaoxq@hadoop105 hadoop-3.1.3]$ cd fileinput/
1.3 编辑 word.txt 文件
[xiaoxq@hadoop105 fileinput]$ vim word.txt
在文件中输入如下内容
java java
hadoop hadoop
shell shell
idea idea idea
xiao datenode namenode
hdfs yarn mapreduce
保存退出::wq
1.4 回到 Hadoop 目录 /opt/module/hadoop-3.1.3
[xiaoxq@hadoop105 fileinput]$ cd ..
[xiaoxq@hadoop105 hadoop-3.1.3]$
1.5 执行程序
[xiaoxq@hadoop105 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount fileinput fileoutput
1.6 查看结果(如果搭建了集群的话本地模式是报错的—配置文件改动了)
[xiaoxq@hadoop105 hadoop-3.1.3]$ cat fileoutput/part-r-00000
java 2
hadoop 2
shell 2
idea 3
xiao 1
datenode 1
namenode 1
hdfs 1
yarn 1
mapreduce 1
2、完全分布式运行模式(开发重点)
步骤
1)准备3台客户机(关闭防火墙、修改静态ip、主机名称)
2)安装JDK / Hadoop
3)配置环境变量
4)配置集群
5)单点启动
6)配置ssh
7)群起并测试集群
2.1虚拟机准备
详见 Hadoop运行环境搭建 文章
2.2 编写集群分发脚本xsync
2.2.1 scp(secure copy)安全拷贝
(1)scp 定义:
scp 可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)
(2)基本语法
scp -r pdir / fname user@hadoophost:pdir/fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
[xiaoxq@hadoop105 ~]$ scp -r /opt/module/hadoop-3.1.3 xiaoxq@hadoop106:/opt/module/
(3)案例实操
前提:在 hadoop105 hadoop106 hadoop107 都已经创建好的 /opt/module /opt/software 两个目录, 并且已经把这两个目录修改为xiaoxq:xiaoxq
sudo chown xiaoxq:xiaoxq -R /opt/module (权限问题)
2.2.2 rsync远程同步工具
rsync 主要用于 备份 和 镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av pdir/fname user@hadoophost:pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
选项 | 功能 |
---|---|
-a | 归档拷贝 |
-v | 显示复制过程 |
2.2.3 xsync 集群分发脚本(重点-具有更新功能)
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync 命令原始拷贝:
rsync -av /opt/module root@hadoop106:/opt/
(b)期望脚本:
xsync 要同步的文件名称
(c)说明:在/home/xiaoxq/bin这个目录下存放的脚本,xiaoxq 用户可以在系统任何地方直接执行。
(3)脚本实现
(a)在 /home/xiaoxq/bin 目录下创建 xsync 文件
[xiaoxq@hadoop105 ~]$ cd /home/xiaoxq/ [xiaoxq@hadoop105 ~]$ mkdir bin [xiaoxq@hadoop105 ~]$ cd bin [xiaoxq@hadoop105 bin]$ vim xsync
在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop105 hadoop106 hadoop107
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 具有执行权限
[xiaoxq@hadoop105 bin]$ chmod +x xsync
(c)将脚本复制到/bin中,以便全局调用
[xiaoxq@hadoop105 bin]$ sudo cp xsync /bin/
(d)测试脚本
[xiaoxq@hadoop105 bin]$ xsync /home/xiaoxq/bin
[xiaoxq@hadoop105 bin]$ sudo xsync /bin/xsync
3、SSH无密登录配置
3.1 配置 ssh
(1)基本语法
ssh 另一台电脑的ip地址
(2)ssh 连接时出现 Host key verification failed 的解决方法
[xiaoxq@hadoop105 ~]$ ssh hadoop106
出现:
The authenticity of host '192.168.6.106 (192.168.6.106)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
(3)解决方案如下:直接输入yes
3.2 无密钥配置
- 3.2.1 免密登录原理
- 3.2.2 生成公钥和私钥:
[xiaoxq@hadoop105 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
- 3.2.3 将公钥拷贝到要免密登录的目标机器上
[xiaoxq@hadoop105 .ssh]$ ssh-copy-id hadoop105
[xiaoxq@hadoop105 .ssh]$ ssh-copy-id hadoop106
[xiaoxq@hadoop105 .ssh]$ ssh-copy-id hadoop107
注意:
还需要在hadoop106上采用xiaoxq账号配置一下无密登录到hadoop105、hadoop106、hadoop107服务器上。
还需要在hadoop107上采用xiaoxq账号配置一下无密登录到hadoop105、hadoop106、hadoop107服务器上。
还需要在hadoop105上采用root账号,配置一下无密登录到hadoop105、hadoop106、hadoop107;
3.3 ssh文件夹下(~/.ssh)的文件功能解释
known_hosts | 记录ssh访问过计算机的公钥(public key) |
---|---|
id_rsa | 生成的私钥 |
id_rsa.pub | 生成的公钥 |
authorized_keys | 存放授权过的无密登录服务器公钥 |
4、集群配置
4.1 集群部署规划
注意:NameNode 和 SecondaryNameNode 不要安装在同一台服务器
注意:ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上。
hadoop105 | hadoop106 | hadoop107 | |
---|---|---|---|
HDFS | NameNodeDataNode | DataNode | SecondaryNameNodeDataNode |
YARN | NodeManager | ResourceManagerNodeManager | NodeManager |
4.2 配置文件说明
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)常用端口号说明
Daemon | App | Hadoop2 | Hadoop3 |
---|---|---|---|
NameNode Port | Hadoop HDFS NameNode | 8020 / 9000 | 9820 |
Hadoop HDFS NameNode HTTP UI | 50070 | 9870 | |
Secondary NameNode Port | Secondary NameNode | 50091 | 9869 |
Secondary NameNode HTTP UI | 50090 | 9868 | |
DataNode Port | Hadoop HDFS DataNode IPC | 50020 | 9867 |
Hadoop HDFS DataNode | 50010 | 9866 | |
Hadoop HDFS DataNode HTTP UI | 50075 | 9864 |
4.3 配置集群
(1)核心配置文件
配置core-site.xml
[xiaoxq@hadoop105 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
[xiaoxq@hadoop105 hadoop]$ vim core-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop105:9820</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
<!-- 配置HDFS网页登录使用的静态用户为xiaoxq -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>xiaoxq</value>
</property>
<!-- 配置该xiaoxq(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.xiaoxq.hosts</name>
<value>*</value>
</property>
<!-- 配置该xiaoxq(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.xiaoxq.groups</name>
<value>*</value>
</property>
<!-- 配置该xiaoxq(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.xiaoxq.groups</name>
<value>*</value>
</property>
</configuration>
(2)HDFS配置文件
配置 hdfs-site.xml
[xiaoxq@hadoop105 hadoop]$ vim hdfs-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- nn web端访问地址-->
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop105:9870</value>
</property>
<!-- 2nn web端访问地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop107:9868</value>
</property>
</configuration>
(3)YARN配置文件
配置yarn-site.xml
[xiaoxq@hadoop105 hadoop]$ vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<configuration>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop106</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>
<!-- yarn容器允许分配的最大最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
<!-- yarn容器允许管理的物理内存大小 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 开启日志聚集功能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://hadoop105:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- Site specific YARN configuration properties -->
</configuration>
(4)MapReduce配置文件
配置mapred-site.xml
[xiaoxq@hadoop105 hadoop]$ vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.4 在集群上分发配置好的Hadoop配置文件
[xiaoxq@hadoop105 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/
4.5 去106和107上查看文件分发情况
[xiaoxq@hadoop106 hadoop]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
[xiaoxq@hadoop107 hadoop]$ cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
5、群起集群
5.1 配置 workers
[xiaoxq@hadoop105 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers
在该文件中增加如下内容:
hadoop105
hadoop106
hadoop107
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
同步所有节点配置文件
[xiaoxq@hadoop105 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc
5.2 启动集群
(1)如果集群是第一次启动,需要在hadoop105节点格式化NameNode(注意格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。)
[xiaoxq@hadoop105 ~ ]$ hdfs namenode -format
(2)启动HDFS
[xiaoxq@hadoop105 hadoop-3.1.3]$ sbin/start-dfs.sh
(3)在配置了 ResourceManager 的节点(hadoop106)启动YARN
[xiaoxq@hadoop106 hadoop-3.1.3]$ sbin/start-yarn.sh
(4)Web 端查看 HDFS 的 NameNode
(a)浏览器中输入:http://hadoop105:9870
(b)查看HDFS上存储的数据信息
(5)Web 端查看 YARN 的 ResourceManager
(a)浏览器中输入:http://hadoop106:8088
(b)查看 YARN 上运行的 Job 信息
5.3 集群基本测试
(1)上传文件到集群
上传小文件
[xiaoxq@hadoop105 ~]$ hadoop fs -mkdir /input
[xiaoxq@hadoop105 ~]$ hadoop fs -put /opt/module/hadoop-3.1.3/fileinput/word.txt /input
上传大文件
[xiaoxq@hadoop105 ~]$ hadoop fs -put /opt/software/jdk-8u212-linux-x64.tar.gz /
(2)上传文件后查看文件存放在什么位置
(a)查看HDFS文件存储路径
[xiaoxq@hadoop105 subdir0]$ pwd
/opt/module/hadoop-3.1.3/data/dfs/data/current/BP-758920941-192.168.6.105-1595469797643/current/finalized/subdir0/subdir0
(b)查看HDFS在磁盘存储文件内容
[xiaoxq@hadoop105 subdir0]$ cat blk_1073741826
java java
hadoop hadoop
shell shell
idea idea idea
xiao datenode namenode
hdfs yarn mapreduce
(3)拼接(追加)
[xiaoxq@hadoop105 subdir0]$ hadoop fs -put /opt/module/hadoop-3.1.3/fileinput/word.txt /input2
-rw-rw-r--. 1 xiaoxq xiaoxq 94 7月 23 16:55 blk_1073741826
-rw-rw-r--. 1 xiaoxq xiaoxq 11 7月 23 16:55 blk_1073741826_1002.meta
-rw-rw-r--. 1 xiaoxq xiaoxq 94 7月 23 17:14 blk_1073741829
-rw-rw-r--. 1 xiaoxq xiaoxq 11 7月 23 17:14 blk_1073741829_1005.meta
[xiaoxq@hadoop105 subdir0]$ cat blk_1073741826>>tmp.tar
[xiaoxq@hadoop105 subdir0]$ cat blk_1073741829>>tmp.tar
[xiaoxq@hadoop105 subdir0]$ cat tmp.tar
java java
hadoop hadoop
shell shell
idea idea idea
xiao datenode namenode
hdfs yarn mapreduce
java java
hadoop hadoop
shell shell
idea idea idea
xiao datenode namenode
hdfs yarn mapreduce
(4)下载
[xiaoxq@hadoop106 software]$ hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./
(5)执行 wordcount 程序
[xiaoxq@hadoop105 hadoop-3.1.3]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
6、集群启动/停止方式总结
6.1 各个服务组件逐一启动/停止
(1)分别启动/停止 HDFS 组件
hdfs --daemon start/stop namenode/datanode/secondarynamenode
(2)启动/停止 YARN
yarn --daemon start/stop resourcemanager/nodemanager
6.2 各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh
(2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh
7、配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:
7.1 配置 mapred-site.xml
[xiaoxq@hadoop105 hadoop]$ vim mapred-site.xml
在该文件里面增加如下配置。
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop105:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop105:19888</value>
</property>
7.2 分发配置
[xiaoxq@hadoop105 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml
7.3 在 hadoop105 启动历史服务器
[xiaoxq@hadoop105 hadoop]$ mapred --daemon start historyserver
7.4 查看历史服务器是否启动
[xiaoxq@hadoop105 hadoop]$ jps
7.5 查看JobHistory
http://hadoop105:19888/jobhistory
8、配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager 、ResourceManager 和 HistoryServer。
开启日志聚集功能具体步骤如下:
8.1 配置 yarn-site.xml
[xiaoxq@hadoop105 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://hadoop105:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
8.2 分发配置
[xiaoxq@hadoop105 hadoop]$ xsync /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml
8.3 关闭 NodeManager 、ResourceManager 和 HistoryServer
[xiaoxq@hadoop106 ~]$ stop-yarn.sh
[xiaoxq@hadoop105 ~]$ mapred --daemon stop historyserver
8.4 启动 NodeManager 、ResourceManage 和 HistoryServer
[xiaoxq@hadoop106 ~]$ start-yarn.sh
[xiaoxq@hadoop105 ~]$ mapred --daemon start historyserver
8.5 删除HDFS上已经存在的输出文件
[xiaoxq@hadoop105 ~]$ hadoop fs -rm -r /output
8.6 执行 WordCount 程序
[xiaoxq@hadoop105 ~]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
8.7 查看日志
http://hadoop105:19888/jobhistory
图 Job History
图 job运行情况
图 查看日志
9、编写hadoop集群常用脚本
9.1 查看三台服务器 java 进程脚本:jpsall
[xiaoxq@hadoop105 ~]$ cd /home/xiaoxq/bin
[xiaoxq@hadoop105 bin]$ vim jpsall
然后输入
#!/bin/bash
for host in hadoop105 hadoop106 hadoop107
do
echo =============== $host ===============
ssh $host jps $@ | grep -v Jps
done
保存 (:wq )后退出,然后赋予脚本执行权限
[xiaoxq@hadoop105 bin]$ chmod +x jpsall
9.2 hadoop集群启停脚本(包含hdfs,yarn,historyserver):myhadoop.sh
[xiaoxq@hadoop105 ~]$ cd /home/xiaoxq/bin
[xiaoxq@hadoop105 bin]$ vim myhadoop.sh
然后输入
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop105 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " --------------- 启动 yarn ---------------"
ssh hadoop106 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop105 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop105 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop106 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop105 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
保存 (:wq) 后退出,然后赋予脚本执行权限
[xiaoxq@hadoop105 bin]$ chmod +x myhadoop.sh
9.3 分发 /home/xiaoxq/bin 目录,保证自定义脚本在三台机器上都可以使用
[xiaoxq@hadoop105 bin]$ xsync /home/xiaoxq/bin/