转自doublexi: https://www.cnblogs.com/doublexi/p/15624246.html
Spark其实是Hadoop生态圈的一部分,需要用到Hadoop的HDFS、YARN等组件。
为了方便我们的使用,Spark官方已经为我们将Hadoop与scala组件集成到spark里的安装包,解压开箱即可使用,给我们提供了很大的方便。
如果我们只是本地学习的spark,又不想搭建复杂的hadoop集群,就可以使用该安装包。
spark-3.2.0-bin-hadoop3.2-scala2.13.tgz
但是,如果是生产环境,想要搭建集群,或者后面想要自定义一些hadoop配置,就可以单独搭建Hadoop集群,后面再与spark进行整合。(推荐)
下面讲一下Hadoop集群环境的搭建。
三台服务器,需要提前做好初始化,配置好主机名、免密登录与JDK配置等等。
参考前面一篇文章:Spark集群环境搭建——服务器环境初始化
https://www.cnblogs.com/doublexi/p/15623436.html
搭建Hadoop集群
1、下载:
Hadoop官网地址:http://hadoop.apache.org/
下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.2.2/
01 02 | cd /data/apps/shell/software wget https: //archive .apache.org /dist/hadoop/common/hadoop-3 .2.2 /hadoop-3 .2.2. tar .gz |
2、解压安装Hadoop
解压:
01 02 | tar xf hadoop-3.2.2. tar .gz mv hadoop-3.2.2 /data/apps/ |
编辑环境变量:
01 02 03 04 | vim /etc/profile ##HADOOP_HOME export HADOOP_HOME= /data/apps/hadoop-3 .2.2/ export PATH=$PATH:$HADOOP_HOME /bin :$HADOOP_HOME /sbin |
source生效:
01 | source /etc/profile |
测试:
01 02 03 04 05 06 07 | # hadoop version Hadoop 3.2.2 Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932 Compiled by hexiaoqiao on 2021-01-03T09:26Z Compiled with protoc 2.5.0 From source with checksum 5a8f564f46624254b27f6a33126ff4 This command was run using /data/apps/hadoop-3 .2.2 /share/hadoop/common/hadoop-common-3 .2.2.jar |
3、集群配置:
3.1、HDFS集群配置:
配置:hadoop-env.sh
将JDK路径明确配置给HDFS
01 02 03 04 05 06 07 08 09 10 | cd /data/apps/hadoop-3 .2.2 /etc/hadoop/ vim hadoop- env .sh ... export JAVA_HOME= /usr/java/jdk1 .8.0_162 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root |
指定NameNode节点以及数据存储目录(修改core-site.xml)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | vim core-site.xml <configuration> <!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS< /name > <value>hdfs: //dev-spark-master-206 :8020< /value > < /property > <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp. dir < /name > <value> /data/apps/hadoop-3 .2.2 /data/tmp < /value > < /property > < /configuration > |
core-site.xml的默认配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-common/coredefault.xml
指定secondarynamenode节点(修改hdfs-site.xml)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | vim hdfs-site.xml <configuration> <!-- 指定Hadoop辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address< /name > <value>dev-spark-slave-172:50090< /value > < /property > <!--副本数量 --> <property> <name>dfs.replication< /name > <value>3< /value > < /property > < /configuration > |
官方默认配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/hdfsdefault.xml
指定datanode从节点(修改workers文件,每个节点配置信息占一行)
注意:这里hadoop2.x是用slaves文件,3.x是用workers文件
01 | vim workers |
01 02 03 | dev-spark-master-206 dev-spark-slave-171 dev-spark-slave-172 |
注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。
3.2、MapReduce集群配置
指定MapReduce使用的jdk路径(修改mapred-env.sh)
01 02 03 | vim mapred- env .sh export JAVA_HOME= /usr/java/jdk1 .8.0_162 |
指定MapReduce计算框架运行Yarn资源调度框架(修改mapred-site.xml)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | vim mapred-site.xml <configuration> <!-- 指定MR运行在Yarn上 --> <property> <name>mapreduce.framework.name< /name > <value>yarn< /value > < /property > <!-- 指定MR环境变量 --> <property> <name>yarn.app.mapreduce.am. env < /name > <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}< /value > < /property > <property> <name>mapreduce.map. env < /name > <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}< /value > < /property > <property> <name>mapreduce.reduce. env < /name > <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}< /value > < /property > < /configuration > |
mapred-site.xml默认配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-mapreduce-client/hadoop-mapreduceclient-core/mapred-default.xml
3.3、Yarn集群配置
编辑yarn-env.sh,指定JDK路径
01 02 03 | vim yarn- env .sh export JAVA_HOME= /usr/java/jdk1 .8.0_162 |
指定ResourceMnager的master节点信息(修改yarn-site.xml)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | vim yarn-site.xml <configuration> <!-- Site specific YARN configuration properties --> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager. hostname < /name > <value>dev-spark-slave-172< /value > < /property > <!-- Reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services< /name > <value>mapreduce_shuffle< /value > < /property > < /configuration > |
yarn-site.xml的默认配置:https://hadoop.apache.org/docs/r2.9.2/hadoop-yarn/hadoop-yarn-common/yarndefault.xml
指定NodeManager节点(slaves文件已修改)
注意:
Hadoop安装目录所属用户和所属用户组信息,默认是501 dialout,而我们操作Hadoop集群的用户使用的是虚拟机的root用户,
所以为了避免出现信息混乱,修改Hadoop安装目录所属用户和用户组!!
01 | chown -R root:root /data/apps/hadoop-3 .2.2 |
3.4、将Hadoop安装包发送到其他节点
01 02 03 | [root@dev-spark-master-206 ~] # cd /data/apps/ # 将hadoop安装包发送到其他两台服务器相同的目录 [root@dev-spark-master-206 apps] # rsync-script hadoop-3.2.2/ |
在其他两台服务器上,也需要重新编辑一下环境变量,并source加载
01 02 03 04 05 | # 检查三台服务器上是否有这个hadoop包,以及环境变量配置 # vim /etc/profile ##HADOOP_HOME export HADOOP_HOME= /data/apps/hadoop-3 .2.2/ export PATH=$PATH:$HADOOP_HOME /bin :$HADOOP_HOME /sbin |
三台机器上都要source一下
01 | source /etc/profile |
三台机器上运行hadoop命令测试:
01 02 03 04 05 06 07 | # hadoop version Hadoop 3.2.2 Source code repository Unknown -r 7a3bc90b05f257c8ace2f76d74264906f0f7a932 Compiled by hexiaoqiao on 2021-01-03T09:26Z Compiled with protoc 2.5.0 From source with checksum 5a8f564f46624254b27f6a33126ff4 This command was run using /data/apps/hadoop-3 .2.2 /share/hadoop/common/hadoop-common-3 .2.2.jar |
3.5、集群初始化:
注意:如果集群是第一次启动,需要在Namenode所在节点格式化NameNode,非第一次不用执行格式化Namenode操作!!
新版都用hdfs namenode命令,旧版用hadoop namenode
01 02 | # 注意,只能执行一次,后面再执行会破坏之前的集群环境 hdfs namenode - format |
初始化成功后,输出日志里会显示”successfully formatted”
3.6、启动集群:
方式一:手动一个个服务启动:
启动HDFS:
在master上启动NameNode
01 | [root@dev-spark-master-206 hadoop-3.2.2] # hadoop-daemon.sh start namenode |
01 |
在master和slave节点,启动DataNode
在dev-spark-master-206上启动datanode
01 02 03 | [root@dev-spark-master-206 hadoop-3.2.2] # hadoop-daemon.sh start datanode # jps查看是否有namenode和datanode的进程 [root@dev-spark-master-206 hadoop-3.2.2] # jps |
在dev-spark-slave-171上,启动datanode
01 02 03 | [root@dev-spark-slave-171 ~] # hadoop-daemon.sh start datanode # 查看是否有datanode的进程 [root@dev-spark-slave-171 ~] # jps |
在dev-spark-slave-172上,启动datanode
01 02 03 | [root@dev-spark-slave-172 ~] # hadoop-daemon.sh start datanode # 查看是否有datanode进程 [root@dev-spark-slave-172 ~] # jps |
Yarn集群单节点启动:
注意:NameNode和ResourceManger不是在同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
按照我们集群的规划,我们在dev-spark-slave-172上启动resourcemanager和nodemanager
01 02 03 04 | [root@dev-spark-slave-172 ~] # yarn-daemon.sh start resourcemanager [root@dev-spark-slave-172 ~] # yarn-daemon.sh start nodemanager # 查看是否有 ResourceManager和 NodeManager进程 [root@dev-spark-slave-172 ~] # jps |
在dev-spark-slave-171上启动nodemanager
01 02 03 | [root@dev-spark-slave-171 ~] # yarn-daemon.sh start nodemanager # 查看是否有 NodeManager的进程 [root@dev-spark-slave-171 ~] # jps |
在dev-spark-master-206上,启动nodemanager
01 02 03 | [root@dev-spark-master-206 hadoop-3.2.2] # yarn-daemon.sh start nodemanager # jps查看是否有 NodeManager的进程 [root@dev-spark-master-206 hadoop-3.2.2] # jps |
方式二:集群群起
在master节点执行start-dfs.sh命令,它会启动namenode,以及去workers文件中指定的节点中,启动datanode
在dev-spark-master-206上启动hdfs
01 02 | # 不单个启动,集群启动 start-dfs.sh |
在dev-spark-slave-172上启动yarn
01 | [root@dev-spark-slave-172 ~] # start-yarn.sh |
注意:NameNode和ResourceManger不是在同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。
注意:如果启动报错
01 02 03 04 05 06 07 08 09 10 | # start-dfs.sh Starting namenodes on [dev-spark-master-206] ERROR: Attempting to operate on hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation. Starting datanodes ERROR: Attempting to operate on hdfs datanode as root ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation. Starting secondary namenodes [dev-spark-slave-172] ERROR: Attempting to operate on hdfs secondarynamenode as root ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation. |
对于start-dfs.sh和stop-dfs.sh文件,添加下列参数:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | # vim sbin/start-dfs.sh # 顶部加上下面的配置 #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root # vim sbin/stop-dfs.sh #!/usr/bin/env bash HDFS_DATANODE_USER=root HADOOP_SECURE_DN_USER=hdfs HDFS_NAMENODE_USER=root HDFS_SECONDARYNAMENODE_USER=root |
对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:
01 02 03 04 05 06 07 08 09 10 11 | # vim sbin/start-yarn.sh #!/usr/bin/env bash YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root # vim sbin/stop-yarn.sh #!/usr/bin/env bash YARN_RESOURCEMANAGER_USER=root HADOOP_SECURE_DN_USER=yarn YARN_NODEMANAGER_USER=root |
发送到其他节点:
01 02 03 04 | rsync -script sbin /start-dfs .sh rsync -script sbin /stop-dfs .sh rsync -script sbin /start-yarn .sh rsync -script sbin /stop-yarn .sh |
再启动:(再启动之前,需要使用jps查看之前残存的进程,用kill杀掉)
01 02 03 04 05 06 07 08 09 | # start-dfs.sh WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER. Starting namenodes on [dev-spark-master-206] Last login: Wed Sep 8 15:05:01 CST 2021 from 192.168.90.188 on pts /6 Starting datanodes Last login: Wed Sep 8 15:37:52 CST 2021 on pts /5 Starting secondary namenodes [dev-spark-slave-172] Last login: Wed Sep 8 15:37:54 CST 2021 on pts /5 dev-spark-slave-172: WARNING: /data/apps/hadoop-3 .2.2 /logs does not exist. Creating. |
启动yarn:
注意:NameNode和ResourceManger不是在同一台机器,不能在NameNode上启动 YARN,应该
在ResouceManager所在的机器上启动YARN。
01 02 | # 在dev-spark-slave-172上面启动yarn start-yarn.sh |
3.7、Hadoop集群启动停止命令汇总
1. 各个服务组件逐一启动/停止
(1)分别启动/停止HDFS组件
01 | hadoop-daemon.sh start / stop namenode / datanode / secondarynamenode |
(2)启动/停止YARN
01 | yarn-daemon.sh start / stop resourcemanager / nodemanager |
2. 各个模块分开启动/停止(配置ssh是前提)常用
(1)整体启动/停止HDFS
01 | start-dfs.sh / stop-dfs.sh |
(2)整体启动/停止YARN
01 | start-yarn.sh / stop-yarn.sh |
3.8、web ui界面查看
web页面查看:http://192.168.90.206:9870/
查看yarn:(注意地址是:192.168.90.172)
http://192.168.90.172:8088/
3.9、测试hdfs:
01 02 03 04 05 06 | [root@dev-spark-master-206 ~] # hdfs dfs -mkdir -p /test/input [root@dev-spark-master-206 ~] # echo "test hdfs" >> test.txt [root@dev-spark-master-206 ~] # hdfs dfs -put test.txt /test/input [root@dev-spark-master-206 ~] # hdfs dfs -ls /test/input Found 1 items -rw-r--r-- 3 root supergroup 10 2021-09-08 16:53 /test/input/test .txt |
web界面上有看到相关文件:
4、配置历史服务器
在Yarn中运行的任务产生的日志数据不能查看,为了查看程序的历史运行情况,需要配置一下历史日志
服务器。具体配置步骤如下:
4.1. 配置mapred-site.xml
01 02 03 04 05 06 07 08 09 10 11 12 13 | # cd /data/apps/hadoop-3.2.2/etc/hadoop/ # vi mapred-site.xml <!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address< /name > <value>dev-spark-master-206:10020< /value > < /property > <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address< /name > <value>dev-spark-master-206:19888< /value > < /property > |
4.2、配置日志的聚集
日志聚集:应用(Job)运行完成以后,将应用运行日志信息从各个task汇总上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和 HistoryManager。
开启日志聚集功能具体步骤如下:
配置yarn-site.xml
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | vim yarn-site.xml <!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregation- enable < /name > <value> true < /value > < /property > <!-- 日志保留时间设置7天 --> <property> <name>yarn.log-aggregation.retain-seconds< /name > <value>604800< /value > < /property > <property> <name>yarn.log.server.url< /name > <value>http: //dev-spark-master-206 :19888 /jobhistory/logs < /value > < /property > |
4.3、分发配置到其他节点:
01 02 | rsync -script mapred-site.xml rsync -script yarn-site.xml |
4.4、启动history server
01 02 03 04 05 06 | # 重启yarn [root@dev-spark-slave-172 logs] # stop-yarn.sh [root@dev-spark-slave-172 logs] # start-yarn.sh # 启动历史服务器: [root@dev-spark-master-206 hadoop] # mapred --daemon start historyserver |
4.5、web页面查看:
查看地址:http://192.168.90.206:19888/jobhistory
5、测试wordcount
创建wc.txt文件
01 02 03 04 05 06 | # vim wc.txt hadoop mapreduce yarn hdfs hadoop mapreduce mapreduce yarn hello hello hello |
上传到hdfs:/text/input目录
01 02 03 04 05 06 | # 如果目录不存在,需要先创建 hdfs dfs - mkdir -p /test/input # 上传 hdfs dfs -put wc .txt /test/input # 查看是否上传成功 hdfs dfs - ls /test/input |
执行WordCount程序
01 | hadoop jar /data/apps/hadoop-3 .2.2 /share/hadoop/mapreduce/hadoop-mapreduce-examples-3 .2.2.jar wordcount /test/input/wc .txt /wcoutput |
运行成功,查看结果:
01 02 03 04 05 06 07 08 09 10 11 12 | [root@dev-spark-master-206 hadoop] # hdfs dfs -ls /wcoutput Found 2 items -rw-r--r-- 3 root supergroup 0 2021-09-08 17:20 /wcoutput/_SUCCESS -rw-r--r-- 3 root supergroup 43 2021-09-08 17:20 /wcoutput/part-r-00000 [root@dev-spark-master-206 hadoop] # hdfs dfs -ls /wcoutput/part-r-00000 -rw-r--r-- 3 root supergroup 43 2021-09-08 17:20 /wcoutput/part-r-00000 [root@dev-spark-master-206 hadoop] # hdfs dfs -cat /wcoutput/part-r-00000 hadoop 2 hdfs 1 hello 3 mapreduce 3 yarn 2 |
web页面查看历史服务器:http://192.168.90.206:19888/jobhistory
点击logs可以查看详情:
日志详情如下: