资源规划

组件 bigdata-node1 bigdata-node2 bigdata-node3
OS centos7.6 centos7.6 centos7.6
JDK jvm jvm jvm
HDFS NameNode/SecondaryNameNode/DataNode/JobHistoryServer/ApplicationHistoryServer DataNode DataNode
YARN ResourceManager/NodeManager NodeManager NodeManager

安装介质

版本:hadoop-2.7.2.tar.gz
下载:http://archive.apache.org/dist/hadoop/core

环境准备

安装CentOS

参考:《基于Vagrant的CentOS7.6

安装JDK

参考:《CentOS7.6-安装JDK-1.8.221

SSH免密

参考:《CentOS7.6-SSH免密

集群配置

  1. # 设置主机名(集群所有节点)
  2. sudo vi /etc/hosts

配置如下:

  1. # 127.0.0.1 localhost
  2. # 注意:务必注释# 127.0.1.1 ${HOST_NAME}
  3. # 本机内网IP建议配置与第一行(多个域名情况下)
  4. 192.168.0.101 bigdata-node1
  5. 192.168.0.102 bigdata-node2
  6. 192.168.0.103 bigdata-node3

安装Hadoop

先在节点bigdata-node1上安装,之后分发到bigdata-node2、bigdata-node3。

  1. cd /share
  2. tar -zxvf hadoop-2.7.2.tar.gz -C ~/modules/
  3. # 清理安装介质
  4. rm -rf ~/modules/hadoop-2.7.2/share/doc
  5. rm -rf ~/modules/hadoop-2.7.2/*/*.cmd
  6. rm -rf ~/modules/hadoop-2.7.2/*/*/*.cmd

(1).HDFS单机部署

  • 创建相关目录

    1. mkdir ~/modules/hadoop-2.7.2/tmp ## hadoop临时目录,core-site.xml的hadoop.tmp.dir属性相关
    2. sudo chmod -R a+w ~/modules/hadoop-2.7.2/tmp
  • hdfs配置

1.配置hadoop-env.sh。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh

配置如下:

  1. export JAVA_HOME=/home/vagrant/modules/jdk1.8.0_221

2.配置core-site.xml。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/core-site.xml

配置如下:

  1. <!--默认文件系统的名称(uri's的authority部分用来指定host, port等。默认是本地文件系统。)-->
  2. <property>
  3. <name>fs.defaultFS</name>
  4. <value>hdfs://bigdata-node1:9000</value>
  5. </property>
  6. <!--WEB UI访问数据使用的用户名 -->
  7. <property>
  8. <name>hadoop.http.staticuser.user</name>
  9. <value>vagrant</value>
  10. </property>
  11. <!-- Hadoop的临时目录,服务端参数,修改需重启。NameNode的Image/Edit目录依赖此配置 -->
  12. <property>
  13. <name>hadoop.tmp.dir</name>
  14. <value>/home/vagrant/modules/hadoop-2.7.2/tmp</value>
  15. </property>

3.配置hdfs-site.xml。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml

配置如下:

  1. <!--解决内部网络和外部网络访问的问题 -->
  2. <property>
  3. <name>dfs.http.address</name>
  4. <value>0.0.0.0:50070</value>
  5. </property>
  6. <property>
  7. <name>dfs.namenode.secondary.http-address</name>
  8. <value>bigdata-node1:50090</value>
  9. </property>
  10. <!-- HDFS数据副本数,默认3副本:本节点+同机架节点+其他机架节点,一般不大于datanode的节点数,建议默认3副本-->
  11. <property>
  12. <name>dfs.replication</name>
  13. <value>1</value>
  14. </property>
  15. <!-- HDFS中启用权限检查配置-->
  16. <property>
  17. <name>dfs.permissions.enabled</name>
  18. <value>false</value>
  19. </property>
  • 格式化**NameNode**

    1. 格式化HDFS用于初始化NameNode管理的镜像和操作日志文件。
    1. # 清理logs和tmp
    2. rm -rf ~/modules/hadoop-2.7.2/logs/*
    3. rm -rf ~/modules/hadoop-2.7.2/tmp/*
    4. cd ~/modules/hadoop-2.7.2/
    5. bin/hdfs namenode -format

    出现下列提示表示格式化成功。

    1. INFO common.Storage: Storage directory /*/*/tmp/dfs/name has been successfully formatted.
  • 单机启动**hdfs**

    1. core-site.xml,这里配哪一台(bigdata-node1),哪一台启动namenode
    1. cd ~/modules/hadoop-2.7.2/
    2. # 启动NameNode
    3. sbin/hadoop-daemon.sh start namenode
    4. # 启动DataNode
    5. sbin/hadoop-daemon.sh start datanode
    1. 启动完成后,输入jps查看进程,如果看到以下进程,表示NameNode节点基本ok了。
    1. jps
    2. **** DataNode
    3. **** NameNode

    Web UI验证:http://bigdata-node1:50070

  • 单机停止**hdfs**

    1. cd ~/modules/hadoop-2.7.2/
    2. # 停止NameNode
    3. sbin/hadoop-daemon.sh stop namenode
    4. # 停止DataNode
    5. sbin/hadoop-daemon.sh stop datanode

    (2).YARN单机部署

  • yarn__配置

1.配置mapred-env.sh。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/mapred-env.sh

配置如下:

  1. export JAVA_HOME=/home/vagrant/modules/jdk1.8.0_221

2.配置mapred-site.xml。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. cp ${HADOOP_HOME}/etc/hadoop/mapred-site.xml.template ${HADOOP_HOME}/etc/hadoop/mapred-site.xml
  3. vi ${HADOOP_HOME}/etc/hadoop/mapred-site.xml

配置如下:

  1. <!-- 配置MapReduce运行环境 ,yarn/yarn-tez -->
  2. <property>
  3. <name>mapreduce.framework.name</name>
  4. <value>yarn</value>
  5. </property>
  6. <!-- 日志查看IPC及WEB UI配置-->
  7. <property>
  8. <name>mapreduce.jobhistory.address</name>
  9. <value>bigdata-node1:10020</value>
  10. </property>
  11. <property>
  12. <name>mapreduce.jobhistory.webapp.address</name>
  13. <value>bigdata-node1:19888</value>
  14. </property>

3.配置yarn-env.sh。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/yarn-env.sh

配置如下:

  1. export JAVA_HOME=/home/vagrant/modules/jdk1.8.0_221

4.配置yarn-site.xml。

  1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
  2. vi ${HADOOP_HOME}/etc/hadoop/yarn-site.xml

配置如下:

  1. <!-- ResourceManager节点 -->
  2. <property>
  3. <name>yarn.resourcemanager.hostname</name>
  4. <value>bigdata-node1</value>
  5. </property>
  6. <!--解决内部网络和外部网络访问的问题 -->
  7. <property>
  8. <name>yarn.resourcemanager.webapp.address</name>
  9. <value>0.0.0.0:8088</value>
  10. </property>
  11. <!--日志聚合到HDFS提供给WEB UI查看 -->
  12. <property>
  13. <name>yarn.log-aggregation-enable</name>
  14. <value>true</value>
  15. </property>
  16. <property>
  17. <name>yarn.log-aggregation.retain-seconds</name>
  18. <value>10000</value>
  19. </property>
  20. <!-- NodeManager上运行的附属服务,用于提升Shuffle计算性能。mapreduce_shuffle/spark_shuffle -->
  21. <property>
  22. <name>yarn.nodemanager.aux-services</name>
  23. <value>mapreduce_shuffle</value>
  24. </property>
  25. <!-- 如果没配置ApplicationMaster入口无法使用 -->
  26. <property>
  27. <name>yarn.resourcemanager.webapp.address</name>
  28. <value>bigdata-node1:8088</value>
  29. </property>
  • 单机启动__YARN

    1. yarn-site.xml,这里配哪一台(bigdata-node1),哪一台启动ResourceManager
    1. cd ~/modules/hadoop-2.7.2/
    2. ## 启动resourcemanager
    3. sbin/yarn-daemon.sh start resourcemanager
    4. ## 启动nodemanager
    5. sbin/yarn-daemon.sh start nodemanager
    6. ## 启动log服务,默认日志路径:/tmp/hadoop-yarn/staging/history
    7. sbin/mr-jobhistory-daemon.sh start historyserver
    1. 输入jps查看进程,如果看到以下进程,表示ResourceManager节点基本ok了。
    1. jps
    2. **** ResourceManager
    3. **** NodeManager
    4. **** JobHistoryServer

    Web UI验证:http://bigdata-node1:8088

  • 单机停止__YARN

    1. cd ~/modules/hadoop-2.7.2/
    2. sbin/yarn-daemon.sh stop resourcemanager
    3. sbin/yarn-daemon.sh stop nodemanager
    4. sbin/mr-jobhistory-daemon.sh stop historyserver

    (3).HDFS集群部署

    第一次启动前,清除各节点tmp目录,并重新格式化NameNode。

    1. ## 清理logs和tmp
    2. rm -rf ~/modules/hadoop-2.7.2/logs/*
    3. rm -rf ~/modules/hadoop-2.7.2/tmp/*
    4. cd ~/modules/hadoop-2.7.2/
    5. bin/hdfs namenode -format
  • 配置__slaves

    1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
    2. vi ${HADOOP_HOME}/etc/hadoop/slaves

    配置如下:

    1. bigdata-node1
    2. bigdata-node2
    3. bigdata-node3
  • 环境变量设置

    1. vi ~/.bashrc # :$到达行尾添加

    配置如下:

    1. export HADOOP_HOME=/home/vagrant/modules/hadoop-2.7.2
    2. export PATH=$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH
  • 分发__Hadoop

    1. scp -r ~/modules/hadoop-2.7.2 vagrant@bigdata-node2:~/modules/
    2. scp -r ~/modules/hadoop-2.7.2 vagrant@bigdata-node3:~/modules/
    3. scp ~/.bashrc vagrant@bigdata-node2:~/.bashrc
    4. scp ~/.bashrc vagrant@bigdata-node3:~/.bashrc

    注:如果Hadoop临时目录(tmp)不在Hadoop包中,slaves上仍然要先手动创建并赋权。
    环境变量生效:

    1. source ~/.bashrc
  • 集群启动__hdfs

    1. core-site.xml,这里配哪一台(bigdata-node1),哪一台启动namenode
    1. cd ~/modules/hadoop-2.7.2/
    2. sbin/start-dfs.sh
    1. 启动完成后,输入jps查看进程,如果看到以下进程,表示NameNode节点基本ok了。
    1. jps
    2. **** DataNode
    3. **** NameNode
    4. **** SecondaryNameNode

    Web UI验证:http://bigdata-node1:50070

  • 集群停止__hdfs

    1. cd ~/modules/hadoop-2.7.2/
    2. sbin/stop-dfs.sh

    (4).YARN集群部署

  • 集群启动__YARN

    1. yarn-site.xml,这里配哪一台(bigdata-node1),哪一台启动ResourceManager
    1. cd ~/modules/hadoop-2.7.2/
    2. sbin/start-yarn.sh
    3. ## 启动log服务,默认日志路径:/tmp/hadoop-yarn/staging/history
    4. sbin/mr-jobhistory-daemon.sh start historyserver

    输入jps查看进程,如果看到以下进程,表示ResourceManager节点基本ok了。

    1. jps
    2. **** ResourceManager
    3. **** NodeManager
    4. **** JobHistoryServer

    Web UI验证:http://bigdata-node1:8088

  • 集群停止__YARN

    1. cd ~/modules/hadoop-2.7.2
    2. ## 停止log服务
    3. sbin/mr-jobhistory-daemon.sh stop historyserver
    4. sbin/stop-yarn.sh
  • MR__作业验证

    1. cd ~/modules/hadoop-2.7.2
    2. ## 创建MR输入目录
    3. bin/hdfs dfs -mkdir -p /tmp/input
    4. ## bin/hdfs dfs -rm -r /tmp/output # 删除MR输出目录
    5. ## 上传文件到input目录
    6. bin/hdfs dfs -put ~/modules/hadoop-2.7.2/etc/hadoop/core-site.xml /tmp/input
    7. bin/hdfs dfs -ls /tmp/input
    8. bin/hdfs dfs -text /tmp/input/core-site.xml
    9. ## hadoop jar按mr1或mr2(yarn)运行job,决定是否配置yarn;yarn jar按yarn方式运行job。
    10. bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /tmp/input /tmp/output
    11. bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /tmp/input /tmp/output
    12. ## 查看job结果
    13. bin/hdfs dfs -cat /tmp/output/part*

    注意:MR输出目录不要提前建立,如果存在则删除或者修改为别的输出路径。

    WorldCount案例

    插件安装(选做)

    在eclipse上安装Hadoop-Eclipse-Plugin插件,则可以查看hdfs目录结构,上传数据文件。
    版本:hadoop-eclipse-plugin-2.7.3.jar or hadoop-eclipse-plugin-2.6.4.jar
    安装:https://blog.csdn.net/qq_38709565/article/details/82768659
    1.png

    WorldCount原理

    MapReduce采用分而治之的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单来说,MapReduce就是“任务的分解和结果的汇总”。
    66107420_1.png
    WordCount(单词计数)是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版“Hello world.”,其主要完成的功能是:统计一系列文本文件每个单词出现的次数。WordCount具体计算流程如下:

    (1).分割

    将文件拆分成 splits,由于测试用的文件较小,所以每个文件为一个split,并将文件按行分割形成对。这一步由MapReduce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数(Windows和 Linux环境下会不同)。(本地计算
    无标题.png

    (2).Map

    将分割好的对交给用户定义的map方法进行处理,生成新的对。(本地计算
    1.png

    (3).Combine

    得到map方法输出的对后,Mapper会将它们按照key值进行排序,并执行Combine过程,将key 值相同的value值累加,得到Mapper的最终输出结果。(本地计算
    1.png

    (4).Reduce

    Reducer先对从Mapper接收的数据进行排序,再交由用户自定义的reduce方法进行处理,得到新的对,并作为WordCount的输出结果。(网络计算
    1.png

    MR编程实现

    参考1:https://blog.csdn.net/u010416101/article/details/89050203
    参考2:https://blog.csdn.net/chunfenxiaotaohua/article/details/100073912
    代码:BigData_Demo_20200510.zip

    1. # windows打包编译,之后将jar包拷贝至vagrant共享目录share即可
    2. mvn clean package -DskipTests -Dfast

    运行MR程序:

    1. cd ~/modules/hadoop-2.7.2
    2. ## 删除MR输出目录
    3. bin/hdfs dfs -rm -r /tmp/output
    4. bin/yarn jar /share/bigdata_demo.jar
    5. ## 查看job结果
    6. bin/hdfs dfs -cat /tmp/output/part*

    说明:代码有更新,可支持windows本地开发测试,入口类为:*DriverLocal.java。