写点什么

跟我学丨如何用鲲鹏服务器搭建 Hadoop 全分布式集群

发布于: 2021 年 03 月 31 日

摘要:今天教大家如何利用鲲鹏服务器搭建 Hadoop 全分布式集群,动起来···


本文分享自华为云社区《利用鲲鹏服务器快速搭建一个Hadoop全分布式集群笔记分享》,原文作者:Jack20。

一、Hadoop 常见的三种运行模式

1、单机模式(独立模式)(Local 或 Standalone Mode)


默认情况下 Hadoop 就是处于该模式,用于开发和调式。不对配置文件进行修改。使用本地文件系统,而不是分布式文件系统。


Hadoop 不会启动 NameNode、DataNode、JobTracker、TaskTracker 等守护进程,Map()和 Reduce()任务作为同一个进程的不同部分来执行的。


用于对 MapReduce 程序的逻辑进行调试,确保程序的正确。

2、伪分布式模式(Pseudo-Distrubuted Mode)


Hadoop 的守护进程运行在本机机器,模拟一个小规模的集群,在一台主机模拟多主机。


Hadoop 启动 NameNode、DataNode、JobTracker、TaskTracker 这些守护进程都在同一台机器上运行,是相互独立的 Java 进程。


在这种模式下,Hadoop 使用的是分布式文件系统,各个作业也是由 JobTraker 服务,来管理的独立进程。在单机模式之上增加了代码调试功能,允许检查内存使用情况,HDFS 输入输出,以及其他的守护进程交互。类似于完全分布式模式,因此,这种模式常用来开发测试 Hadoop 程序的执行是否正确。

3、全分布式集群模式(Full-Distributed Mode)


Hadoop 的守护进程运行在一个集群上 Hadoop 的守护进程运行在由多台主机搭建的集群上,是真正的生产环境。


  1. 下载并解压 Hadoop、JDK 安装包并配置好环境变量、节点域名解析、防火墙、端口等组成相互连通的网络。

  2. 进入 Hadoop 的解压目录,编辑 hadoop-env.sh 文件(注意不同版本后配置文件的位置有所变化)

  3. 编辑 Hadoop 中配置文件 core-site.xml(Hadoop 集群的特性,作用于全部进程及客户端)、hdfs-site.xml(配置 HDFS 集群的工作属性)、mapred-site.xml(配置 MapReduce 集群的属性)、yarn-site.xml 四个核心配置文件

  4. 配置 ssh,生成密钥,使到 ssh 可以免密码连接 localhost,把各从节点生成的公钥添加到主节点的信任列表。

  5. 格式化 HDFS 后 使用./start-all.sh 启动 Hadoop 集群

二、Hadoop 常见组件


Hadoop 由 HDFS、Yarn、Mapreduce 三个核心模块组成,分别负责分布式存储、资源分配和管理、分布式计算。

1、Hadoop-HDFS 模块



  1. HDFS:是一种分布式存储系统,采用 Master 和 Slave 的主从结构,主要由 NameNode 和 DataNode 组成。HDFS 会将文件按固定大小切成若干块,分布式存储在所有 DataNode 中,每个文件块可以有多个副本,默认副本数为 3。

  2. NameNode: Master 节点,负责元数据的管理,处理客户端请求。

  3. DataNode: Slave 节点,负责数据的存储和读写操作。

2、Hadoop-Yarn 模块



  1. Yarn:是一种分布式资源调度框架,采用 Master 和 Slave 的主从结构,主要由 ResourceManager . ApplicationMaster 和 NodeManager 组成,负责整个集群的资源管理和调度。

  2. ResourceManager:是一个全局的资源管理器,负责整个集群的资源管理和分配。

  3. ApplicationMaster:当用户提交应用程序时启动,负责向 ResourceManager 申请资源和应用程序的管理。

  4. NodeManager:运行在 Slave 节点,负责该节点的资源管理和使用。

  5. Container: Yarn 的资源抽象,是执行具体应用的基本单位,任何一个 Job 或应用程序必须运行在一个或多个 Container 中。

3、Hadoop-Mapreduce 模块



  1. Mapreduce:是一种分布式计算框架,主要由 Map 和 Reduce 两个阶段组成。支持将一个计算任务划分为多个子任务,分散到各集群节点并行计算。

  2. Map 阶段:将初始数据分成多份,由多个 map 任务并行处理。

  3. Reduce 阶段:收集多个 Map 任务的输出结果并进行合并,最终形成一个文件作为 reduce 阶段的结果。

全分布式集群模式(Full-Distributed Mode)搭建

【基本环境】


三台鲲鹏 km1.2xlarge.8 内存优化型 8vCPUs | 64GB CentOS 7.6 64bit with ARM CPU:Huawei Kunpeng 920 2.6GHz


其中 jack20 节点作为 NameNode, Node1、 Node2 作为 DataNode,而 Node1 也作为辅助 NameNode ( Secondary NameNode )。



【基本流程】


  1. 下载并解压 Hadoop、JDK 安装包并配置好环境变量、节点域名解析、防火墙、端口

  2. 进入 Hadoop 的解压目录,编辑 hadoop-env.sh 文件(注意不同版本后配置文件的位置有所变化)

  3. 编辑 Hadoop 中配置文件 core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 四个核心配置文件

  4. 配置 ssh,生成密钥,使到 ssh 可以免密码连接 localhost

  5. 格式化 HDFS 后 使用./start-all.sh 启动 Hadoop 集群

关闭防火墙和 selinux


(1)各个节点都执行命令关闭防火墙:


systemctl stop firewalldsystemctl disable firewalldsystemctl status firewalld
复制代码



(2)关闭 selinux


进入 selinux 的 config 文件,将 selinux 原来的强制模式(enforcing)修改为关闭模式(disabled)


setenforce 0getenforcesed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinuxgrep SELINUX=disabled /etc/sysconfig/selinuxcat /etc/sysconfig/selinux
复制代码


1.安装 openJDK-1.8.0

1.1. 下载安装 openJDK-1.8.0


下载 openJDK-1.8.0 并安装到指定目录(如“/home”)。


进入目录:


cd /home
复制代码


下载 openJDK-1.8.0 并安装:


wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/hadoop-performance-tuning/OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gz#解压tar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u252b09.tar.gz
复制代码



1.2. 配置环境变量


执行如下命令,打开/etc/profile 文件:


vim /etc/profile
复制代码


点击键盘"Shift+g"移动光标至文件末尾,单击键盘“i”键进入编辑模式,在代码末尾回车下一行,添加如下内容:


下一行,添加如下内容:


export JAVA_HOME=/home/jdk8u252-b09export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
复制代码


添加完成,单击键盘 ESC 退出编辑,键入“:wq”回车保存并退出。



1.3. 环境变量生效


使环境变量生效:


source /etc/profile
复制代码


验证 openJDK-1.8.0 安装是否成功:


java -version
复制代码



1.4.配置域名解析


vim /etc/hosts
复制代码



2.安装 dstat 资源监控工具


yum install dstat-0.7.2-12.el7 -y
复制代码


验证 dstat 是否安装成功:


dstat -V
复制代码



3. 部署 hadoop-3.1.1

3. 1. 获取 hadoop-3.1.1 软件包


①下载 hadoop-3.1.1 安装包到/home 目录下:


cd /homewget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/hadoop-performance-tuning/hadoop-3.1.1.tar.gz#解压hadoop-3.1.1tar -zxvf hadoop-3.1.1.tar.gz
复制代码


②建立软链接


ln -s hadoop-3.1.1 hadoop
复制代码


③配置 hadoop 环境变量,打开/etc/profile 文件:


vim /etc/profile
复制代码


点击键盘"Shift+g"移动光标至文件末尾,单击键盘“i”键进入编辑模式,在代码末尾回车下一行,添加如下内容:


export HADOOP_HOME=/home/hadoopexport PATH=$HADOOP_HOME/bin:$PATH
复制代码


添加完成,单击键盘 ESC 退出编辑,键入“:wq”回车保存并退出。



④使环境变量生效:


source /etc/profile
复制代码


⑤验证 hadoop 安装是否成功:


hadoop version
复制代码


执行结果如下图所示,表示安装成功:



3.2. 修改 hadoop 配置文件


hadoop 所有的配置文件都在 $HADOOP_HOME/etc/hadoop 目录下,修改以下配置文件前,需要切换到"$HADOOP_HOME/etc/hadoop"目录。


cd $HADOOP_HOME/etc/hadoop/
复制代码


①修改 hdfs-env.xml


打开 hadoop-env.sh 文件:


vim hadoop-env.sh
复制代码


找到 hadoop-env.sh 的第 54 行中的 java 目录(在命令模式下输入“:set nu”,查看行数),输入 java 的安装目录(),然后删除行左端“#”取消注释,并保存退出



② 修改 core-site.xml


打开 core-site.xml 文件


vim core-site.xml
复制代码


在<configuration></configuration>标签之间添加如下代码并保存退出


    <property>        <name>fs.defaultFS</name>        <value>hdfs://jack20:9000/</value>        <description> 设定NameNode的主机名及端口</description>    </property>
<property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/tmp/hadoop-${user.name}</value> <description>指定hadoop 存储临时文件的目录 </description> </property> <property> <name>hadoop.proxyuser.hadoop.hosts</name> <value>*</value> <description>配置该superUser允许通过代理的用户 </description> </property>
<property> <name>hadoop.proxyuser.hadoop.groups</name> <value>*</value> <description>配置该superUser允许通过代理用户所属组 </description> </property>
复制代码


③ 修改 hdfs-site.xml,


打开 hdfs-site.xml 文件


vim hdfs-site.xml
复制代码


在<configuration></configuration>标签之间添加如下代码并保存退出


    <property>          <name>dfs.namenode.http-address</name>          <value>jack20:50070</value>          <description> NameNode 地址和端口 </description>      </property>     <property>          <name>dfs.namenode.secondary.http-address</name>          <value>node1:50090</value>          <description> Secondary NameNode地址和端口 </description>      </property>      <property>        <name>dfs.replication</name>        <value>3</value>        <description> 设定 HDFS 存储文件的副本个数,默认为3 </description>    </property>     <property>          <name>dfs.namenode.name.dir</name>          <value>file:///home/hadoop/hadoop3.1/hdfs/name</value>                 <description> NameNode用来持续存储命名空间和交换日志的本地文件系统路径</description>      </property>  
<property> <name>dfs.datanode.data.dir</name> <value>file:///home/hadoop/hadoop3.1/hdfs/data</value> <description> DataNode在本地存储块文件的目录列表</description> </property>
<property> <name>dfs.namenode.checkpoint.dir</name> <value>file:///home/hadoop/hadoop3.1/hdfs/namesecondary</value> <description> 设置 Secondary NameNode存储临时镜像的本地文件系统路径。如果这是一个用逗号分隔的文件列表,则镜像将会冗余复制到所有目录 </description> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> <description>是否允许网页浏览HDFS文件</description> </property>
<property> <name>dfs.stream-buffer-size</name> <value>1048576</value> <description> 默认是4 KB,作为Hadoop缓冲区,用于Hadoop读HDFS的文件和写HDFS的文件, 还有map的输出都用到了这个缓冲区容量(如果太大了map和reduce任务可能会内存溢出) </description> </property>
复制代码


④修改 mapred-site.xml


打开 mapred-site.xml 文件:


vim mapred-site.xml
复制代码


在<configuration></configuration>标签之间添加如下代码并保存退出


    <property>        <name>mapreduce.framework.name</name>        <value>yarn</value>        <description> 指定MapReduce程序运行在Yarn上 </description>      </property>
<property> <name>mapreduce.jobhistory.address</name> <value>jack20:10020</value> <description> 指定历史服务器端地址和端口 </description> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>jack20:19888</value> <description> 历史服务器web端地址和端口</description> </property>
<property> <name>mapreduce.application.classpath</name> <value> /home/hadoop/etc/hadoop, /home/hadoop/share/hadoop/common/*, /home/hadoop/share/hadoop/common/lib/*, /home/hadoop/share/hadoop/hdfs/*, /home/hadoop/share/hadoop/hdfs/lib/*, /home/hadoop/share/hadoop/mapreduce/*, /home/hadoop/share/hadoop/mapreduce/lib/*, /home/hadoop/share/hadoop/yarn/*, /home/hadoop/share/hadoop/yarn/lib/* </value> </property>
<property> <name>mapreduce.map.memory.mb</name> <value>6144</value> <description> map container配置的内存的大小(调整到合适大小防止物理内存溢出)</description> </property>
<property> <name>mapreduce.reduce.memory.mb</name> <value>6144</value> <description> reduce container配置的内存的大小(调整到合适大小防止物理内存溢出)</description> </property>
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoop</value> </property>
<property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoop</value> </property>
<property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoop</value> </property>
复制代码


⑤修改 yarn-site.xml


打开 yarn-site.xml 文件:


vim yarn-site.xml
复制代码


在<configuration></configuration>标签之间添加如下代码并保存退出


    <property>        <name>yarn.resourcemanager.hostname</name>        <value>jack20</value>        <description> 指定ResourceManager的主机名</description>    </property>
<property> <name>yarn.nodemanager.resource.memory-mb</name> <value>53248</value> <description> NodeManager总的可用物理内存。 注意:该参数是不可修改的,一旦设置,整个运行过程中不可动态修改。 该参数的默认值是8192MB,即使你的机器内存不够8192MB,YARN也会按照这些内存来使用, 因此,这个值通过一定要配置。 </description> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description> 指定MapReduce走shuffle</description> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>jack20:8032</value> <description> 指定ResourceManager对客户端暴露的地址和端口,客户端通过该地址向RM提交应用程序,杀死应用程序等</description> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>jack20:8030</value> <description> 指定ResourceManager对ApplicationMaster暴露的访问地址。ApplicationMaster通过该地址向RM申请资源、释放资源等</description> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>jack20:8031</value> <description> 指定ResourceManager对NodeManager暴露的地址。NodeManager通过该地址向RM汇报心跳,领取任务等</description> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>jack20:8033</value> <description> 指定ResourceManager 对管理员暴露的访问地址。管理员通过该地址向RM发送管理命令等</description> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>jack20:8088</value> <description> 指定ResourceManager对外web UI地址。用户可通过该地址在浏览器中查看集群各类信息</description> </property>
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> <description> 开启日志聚集功能</description> </property>
<property> <name>yarn.log.server.url</name> <value>http://jack20:19888/jobhistory/logs</value> <description> 设置日志聚集服务器地址</description> </property>
<property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> <description> 设置日志保留时间为7天</description> </property>
复制代码


⑥将各个节点加入到 workers


echo jack20 > workersecho node1 > workersecho node2 > workers
复制代码


⑦修改 dfs 和 yarn 的启动脚本,添加 root 用户权限


(1)打开 start-dfs.sh 和 stop-dfs.sh 文件:


vim /home/hadoop/sbin/start-dfs.shvim /home/hadoop/sbin/stop-dfs.sh
复制代码


单击键盘“i”键进入编辑模式,在两个配置文件的第一行添加并保存退出:


HDFS_DATANODE_USER=rootHDFS_DATANODE_SECURE_USER=hdfsHDFS_NAMENODE_USER=rootHDFS_SECONDARYNAMENODE_USER=root
复制代码


(2)打开 start-yarn.sh 和 stop-yarn.sh 文件


vim /home/hadoop/sbin/start-yarn.shvim /home/hadoop/sbin/stop-yarn.sh
复制代码


单击键盘“i”键进入编辑模式,在两个配置文件的第一行添加并保存退出:


YARN_RESOURCEMANAGER_USER=rootHADOOP_SECURE_DN_USER=yarnYARN_NODEMANAGER_USER=root
复制代码


4.集群配置 &节点间免密登录

(1)连通性测试



(2)从主节点同步各个节点域名解析文件


scp /etc/hosts node1:/etc/hostsscp /etc/hosts node2:/etc/hosts
复制代码



(3) 配置各节点间 SSH 免密登录


分别在三台服务器中输入命令生成私钥和公钥(提示输入时按回车即可):


ssh-keygen -t rsa
复制代码


jack20:



node1:



node2:



然后分别在三台服务器上输入命令以复制公钥到服务器中:


ssh-copy-id -i ~/.ssh/id_rsa.pub root@jack20ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2
复制代码


①继续连接:输入“yes”回车;

②输入密码(输入密码时,命令行窗口不会显示密码,输完之后直接回车)


查看所有协商的秘钥



SSH 免密登录测试:


Jack20->node1->node2->jack20->node2->node1->jack20



(4) 复制 hadoop 到各 datanode 并修改


把 jack20 的 hadoop 目录、jdk 目录、/etc/hosts、/etc/profile 复制到 node1,node2 节点


cd $HADOOP_HOME/..#hadoop目录scp -r hadoop node1:/homescp -r hadoop node2:/home#java目录scp -r jdk8u252-b09 node1:/homescp -r jdk8u252-b09 node2:/home
复制代码


登录修改各服务器 java 和 haoop 环境变量


vim /etc/profile
复制代码


点击键盘"Shift+g"移动光标至文件末尾,单击键盘“i”键进入编辑模式,在代码末尾回车下一行,添加如下内容并保存退出:


export JAVA_HOME=/home/jdk8u252-b09export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport HADOOP_HOME=/home/hadoopexport PATH=$HADOOP_HOME/bin:$PATH
复制代码



使环境变量生效:


source /etc/profile
复制代码


5.启动 hadoop


注意:如果启动报错,请检查 hadoop 配置文件是否配置有误。


第一次启动前一定要格式化 HDFS:


hdfs namenode -format
复制代码


注意:提示信息的倒数第 2 行出现“>= 0”表示格式化成功,如图。在 Linux 中,0 表示成功,1 表示失败。因此,如果返回“1”,就应该好好分析前面的错误提示信息,一 般来说是前面配置文件和 hosts 文件的问题,修改后同步到其他节点上以保持相同环境,再接着执行格式化操作



执行脚本命令群起节点


cd /home/hadoop/sbin#群起节点./start-all.sh
复制代码



启动 HDFS 后,可以发现 jack20 节点作为 NameNode, Node1、 Node2 作为 DataNode,而 Node1 也作为辅助 NameNode ( Secondary NameNode )。可以通过 jps 命令在各节点上验证 HDFS 是否启动。jps 也是 Windows 中的命令,表示开启的 Java 进程如果出现下图所示的结果,就表示验证成功。



客户端 Web 访问测试:

(1)RMwebUI 界面 http://IP:8088



(2)NameNode 的 webUI 界面 http://IP:50070



6.集群基准测试


(1)使用 Hadoop 自带的 WordCount 例子/share/Hadoop/mapredu icehadoop-mapreduce-examples-3.1.1.jar 验证集群


#创建目录,目录/data/wordcount用来存储Hadoop自带的WordCount例子的数据文件,运行这个MapReduce任务的结果输出到目录中的/output/wordcount文件中hdfs dfs -mkdir -p /data/wordcounthdfs dfs -mkdir -p /output/ #将本地文件上传到HDFS中(这里上传一个配置文件),执行如下命令hdfs dfs -put /home/hadoop/etc/hadoop/core-site.xml /data/wordcount
复制代码



可以查看,上传后的文件情况,执行如下命令


hdfs dfs -ls /data/wordcount
复制代码



下面运行 WordCount 案例,执行如下命令


hadoop jar /home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /data/wordcount /output/wordcount
复制代码


(2)DFSIO 测试


使用 hadoop 的 DFSIO 写入 50 个文件,每个文件 1000M


hadoop jar /home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.1-tests.jar TestDFSIO -write -nrFiles 50 -filesize 1000
复制代码


可以在 RMwebUI 界面查看当前任务的基本情况,包括内存使用量,CPU 使用量等



在 NameNode 的 webUI 界面查看刚刚 DFSIO 测试的各个节点 HDFS 占用情况



(3)计算圆周率的大小


hadoop jar /home/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.1-tests.jar pi 20 20
复制代码



静静等待结果就可以~


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 03 月 31 日阅读数: 15
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
跟我学丨如何用鲲鹏服务器搭建Hadoop全分布式集群