3.1 本地运行模式(官方wordCount)
- 创建在hadoop-3.1.3文件下面创建一个wcinput文件夹
- 在wcinput文件下创建一个word.txt文件
- 编辑word.txt文件,输入一些单词
- 执行词频统计:
- 查看结果: cd wcoutput
3.2 完全分布式运行模式
分析:1)准备3台客户机(关闭防火墙,静态IP、主机名称);2)安装JDK;3)配置环境变量;4)安装hadoop;5)配置环境变量;6)配置集群;7)单点启动;8)配置ssh;9)群起并测试集群
3.2.1 虚拟机准备
3.2.2 编写集群分发脚本xsync
- scp(secure copy)安全拷贝
- 定义:可以实现服务器与服务器之间的数据拷贝
- 基本语法:
- 案例操作:前提是hadoop102、103、104已经有创建好的/opt/module、/opt/module,且已经修改权限:sudo chown atguigu:atguigu -R /opt/module。在hadoop103机器上也可进行拷贝:scp -r atguigu@hadoop102:/opt/module/* atguigu@hadoop104:/opt/module
- rsync远程同步工具
- 定义:主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。比scp复制的速度要快,且只对差异文件做更新,scp是把所有文件都复制过去。
- 基本语法:
- 案例操作:(1)删除文件:rm -rf wcinput/ (2)同步hadoop102的数据到hadoop103:rsync -av hadoop-3.1.3/ atguigu@hadoop103:/opt/module/hadoop-3.1.3/
- xsync集群分发脚本
- 在/home/atguigu/bin目录下创建xsync文件
#!/bin/bash #1. 判断参数个数,是否小于1 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in hadoop102 hadoop103 hadoop104 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
- 查询全局环境变量:echo $PATH
- 修改脚本xsync具有执行权限:chmod 777 xsync
- 测试脚本:xsync /home/atguigu/bin
- 将脚本复制到/bin中,以便全局调用:sudo cp xsync /bin/
- 同步环境变量配置(root所有者):sudo ./bin/xsync /etc/profile.d/my_env.sh,如果用了sudo,那么xsync一定要补全路径
- 生效:source /etc/profile
3.2.3 SSH无密登录配置
- ls -al 可以查看所有隐藏的目录,查看有.ssh目录;
- 在hadoop102机器的.ssh文件下,生成公钥和私钥:ssh-keygen -t rsa,三次回车;
- 将hadoop102上的公钥拷贝到hadoop103上:ssh-copy-id hadoop103,输入hadoop103密码,即可从102上直接免密到hadoop103上
- 不同用户,如果需要免密登录,都需要生成自己的公钥和私钥
3.2.4 集群配置
- 集群部署规划
- NameNode和SecondaryNameNode不安装在同一台服务器
- ResourceManager也很消耗内存,不要和NameNode、SecondaryNameNode配置在同一台机器上。
- 配置文件说明:hadoop配置文件分两类,默认配置文件和自定义配置文件,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值。
- 默认配置文件
- 自定义文件:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop路径上,用户可以根据需要重新进行修改配置。
- 配置集群
- 核心配置文件,core-site.xml配置,cd $HADOOP_HOME/etc/hadoop,vim core-site.xml,文件内容如下:
- 核心配置文件,hdfs-site.xml配置,vim hdfs-site.xml,文件内容如下:
- 核心配置文件,yarn-site.xml配置,vim yarn-site.xml,文件内容如下:
- 核心配置文件,mapred-site.xml配置,vim mapred-site.xml
- 在集群上分发配置好的hadoop文件:xsync /opt/module/hadoop-3.1.3/etc/hadoop/
- 去103和104上查看文件的分发情况:cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml,cat /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml
3.2.5 群起集群
- 配置workers
- vim /opt/module/hadoop-3.1.3/etc/hadoop/workers,在改文件中按行增加如下内容:hadoop102和hadoop103和hadoop104。注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
- 同步所有结点配置文件:xsync /opt/module/hadoop-3.1.3/etc/hadoop/workers
- 启动集群
- 如果集群是第一次启动,需要在hadoop102节点格式化NameNode(注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到以往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止NameNode和DataNode进程,并且要删除所有机器的data和logs目录,然后再进行格式化。):hdfs namenode -format
- 启动hdfs:sbin/start-dfs.sh
- 在配置了ResourceManager的节点(hadoop103)启动yarn:sbin/start-yarn.sh
- Web端查看hdfs的NameNode:浏览器中输入http://hadoop102:9870,查看hdfs上存储的数据信息
- Web端查看yarn的ResourceManager:浏览器中输入http://hadoop103:8088,查看yarn上运行的Job信息
- 集群基本测试
- 上传文件到集群:(1)上传小文件:hadoop fs -mkdir /input,hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input,(2)上传大文件:hadoop fs -put /opt/software/jdk-8u212-linux-x64.tat.gz /
- 文件上传成功后,查看文件存放在什么位置
- 拼接
- 下载
- 执行wordcount程序
-
集群出现故障,解决方法:(1)首先停掉hadoop102上的dfs:sbin/stop-dfs.sh;(2)删除集群上每台机器的data和logs:rm -rf data/ logs/;(3)格式化namenode:hdfs namenode -format;(4)启动集群:sbin/start-dfs.sh
3.2.6 配置历史服务器
- 配置mapred-site.xml,:vim maored-site.xml
- 分发配置:xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml
- 在hadoop102启动历史服务器,mapred在bin目录下:
- 查看历史 服务器是否启动:jps
- 查看JobHistory如http://hadoop102:19888/jobhistory
3.2.7 配置日志的聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到hdfs系统上。可以方便查看到程序运行详情,方便开发调试。注意:开启日志聚集功能,需要重新启动NodeManager、ResourceManager和HistoryServer。
- 配置yarn-site.xml
- 分发配置:xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml
- 关闭NodeManager、ResourceManager和HistoryServer:hadoop103上:sbin/stop-yarn.sh,sbin/start-yarn.sh、hadoop102上:mapred --daemon stop historyserver,mapred --daemon start historyserver
3.2.8 集群启动/停止方式总结
- 各个模块分开启动停止(配置ssh是前提)
- 整体启动/停止HDFS:start-dfs.sh/stop-dfs.sh
- 整体启动/停止YARN:start-yarn.sh/stop-yarn.sh
- 各个服务组件逐一启动停止
- 分别启动/停止hdfs组件:hdfs --daemon start/stop namenode/datanode/secondarynamenode
- 启动/停止yarn:yarn --daemon start/stop resourcemanager/nodemanager
3.2.9 编写hadoop集群常用脚本
- Hadoop集群启停脚本(包含HDFS,YARN,HISTORYSERVER):cd /home/atguigu/bin,vim myhadoop.sh,保存并退出,赋予脚本权限chmod 777 myhadoop.sh ,myhadoop.sh stop/start
#!/bin/bash if [ $# -lt 1] then echo "No Args Input..." exit ; fi case $1 in "start") echo "=========================启动hadoop集群======================" echo "-------------------------启动hdfs----------------------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh" echo "-------------------------启动yarn----------------------------" ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh" echo "------------------------启动historyserver--------------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver" ;; "stop") echo "=========================关闭hadoop集群======================" echo "------------------------关闭historyserver--------------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver" echo "-------------------------关闭yarn----------------------------" ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh" echo "-------------------------关闭hdfs----------------------------" ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh" ;; *) echo "Input Args Erroe..." ;; esac
- 查看三台服务器Java进程脚本:cd /home/atiguigu/bin,vim jpsall,chmod 777 jpsall,jpsall,xsync /home/atguigu/bin/
#!/bin/bash for host in hadoop102 hadoop103 hadoop104 do echo =======================$host================== ssh $host jps done
3.2.10 常用端口号/配置文件说明
- 常用端口号
HDFS NameNode内部通常端口号 | HDFS NameNode 对用户的查询端口号 | Yarn查看任务运行情况的端口号 | 历史服务器端口号 | |
hadoop3.x | 8020/900/9820 | 9870 | 8088 | 19888 |
hadoop2.x | 8020/9000 | 50070 | 8088 | 19888 |
-
常用配置文件
hadoop3.x:core-site.xml、hfds-site.xnl、yarn-site.xml、mapred-site.xml、works
hadoop2.x:core-site.xml、hfds-site.xnl、yarn-site.xml、mapred-site.xml、slaves
3.2.11 集群时间同步
如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差,导致集群执行任务时间不同步。
- 需求:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,生产环境根据任务对时间的准确程度要求周期同步。测试环境为了尽快看到效果,采用1分钟同步一次。
- 时间服务器配置(必须root用户)
- 查看所有节点ntpd服务状态和开机自启动状态:进入hadoop102机器,执行:sudo systemctl status ntpd,sudo systemctl start ntpd,sudo systemctl is-enabled ntpd
- 修改hadoop102的ntp.conf配置文件:sudo vim /etc/ntp.conf
修改1:授权192.168.10.0-192.168.10.225网段上的所有机器都可以从这台机器上查询和同步时间;
修改2:集群在局域我那个中,不使用其他互联网上的时间;
添加3:server 127.127.1.0,fudge 127.127.1.0 startum 10,当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步;
修改4:修改hadoop102的/etc/sysconfig/ntpd文件,增加SYNC_HWCLOCK=yes,让硬件时间与系统时间一起同步;
步骤5:重新启动ntpd服务:sudo systemctl start ntpd;
步骤6:设置ntpd服务开机启动:sudo systemctl enable ntpd
- 其他机器配置(必须root用户)
- 关闭所有节点上ntp服务和自启动:进入hadoop103和104上分别执行:sudo systemctl stop ntpd,sudo systemctl disable ntpd
- 在其他机器配置1分钟与时间服务器同步一次:sudo crontab -e,在hadoop103编写定时任务,向hadoop102更新时间,如下:*/1 * * * * /usr/sbin/ntpdate/hadoop102
- 修改任意机器时间:sudo date -s "2022-9-11 11:11:11"
- 1分钟后查看机器是否与时间服务器同步:sudo date
说明:网络不通
解决:
- 修改物理机上的DNS:
- vim /etc/resolv.conf,添加:nameserver 114.114.114.114
- vim /etc/sysconfig/network-scripts/ifcfg-eno16777736
- 可以ping通了