Hadoop部署配置及运行调试(上)

2022-01-07 16:56:34 浏览数 (1)

文章大纲:

01本地模式

本地模式是最简单的部署模式,所有模块都运行在一台机器的单个JVM进程中,使用的是本地文件系统,而不是HDFS. 本地模式主要是用于本地开发过程中的运行调。下载Hadoop安装后不用进行任何的配置,默认的就是本地模式。

一、部署配置

按照《第一篇:Hadoop环境搭建及安装》中3.1、3.2、3.3的步骤安装JDK及Hadoop即可,无需修改Hadoop中的任何配置文件,默认使用本地模式。

若不对Hadoop的 /etc 目录下的参数配置文件进行修改,系统会采用默认值,默认使用的值及参数含义描述可以在Apache Hadoop官网中检索查找:

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

在Configuration中可找到:

图1-1-1:Apache官网Hadoop配置信息

二、运行调试

1. 目录及文件准备

在运行程序前需要先创建存放数据的目录及数据文件。

(1) 创建数据文件目录,后面介绍的模式都会用到此目录:

代码语言:javascript复制
sudo mkdir -p /opt/data

(2) 修改其所有者为hadoop用户:

代码语言:javascript复制
sudo chown -R hadoop:hadoop /opt/data

(3) 在此数据文件目录下创建输入数据文件wc.input:

代码语言:javascript复制
vim /opt/data/wc.input
hadoop  hdfs   mapreduce
hadoop  hbase  hive
hadoop  storm  yarn
spark   sparkstreaming  sparksql
spark   hdfs   yarn
spark   hdfs   mapreduce
hadoop  spark
hadoop  spark

(4) 在data目录下再创建一个input目录:

代码语言:javascript复制
mkdir -p /opt/data/input

(5) 将Hadoop的 /etc 目录下的xml文件拷贝到input目录下:

代码语言:javascript复制
cp /opt/modules/hadoop-2.10.1/etc/hadoop/*.xml /opt/data/input/

图1-2-1:拷贝xml文件到input目录

2. 运行Hadoop自带的程序

Hadoop官方自带的MapReduce Demo程序位于 /share/hadoop 目录下,下面举例在本地模式下运行两个最经典的程序。

(1) Grep官方案例

(a) 此案例的功能是将文件中符合规则的内容进行输出。

(b) 运行下面的hadoop命令,注意命令中结果输出用的output目录程序会自动创建,千万不要自行创建output目录,不然会报错:

代码语言:javascript复制
hadoop jar /opt/modules/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar grep input output 'dfs[a-z.] '

(c) 查看输出到本地output目录下的结果文件:

图1-2-2:Grep案例输出文件

可以看到,符合正则表达式 'dfs[a-z.] ' 的内容输出到了part-r-00000结果文件中;另外还有一个_SUCCESS文件,说明Job运行成功。

图1-2-3:Grep案例输出结果

(2) WordCount官方案例

(a) 此案例的功能是统计输入的文件中单词出现的次数。

(b) 运行下面的hadoop命令:

代码语言:javascript复制
hadoop jar /opt/modules/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /opt/data/wc.input output2

(c) 查看输出到本地output2目录下的结果文件:

图1-2-4:WordCount案例输出文件

可以看到,输入文件wc.input的单词统计结果记录输出到了part-r-00000结果文件中;另外还有一个_SUCCESS文件,说明Job运行成功。

图1-2-5:WordCount案例输出结果

02伪分布式模式

伪分布式模式是在一台机器的多个JVM进程中运行各个模块,虽然每个JVM进程都是独立分开运行的,而且使用的不是本地文件系统,而是HDFS,但他们都是运行在同一台机器上,不是真正的分布式,因此也叫伪分布式模式。该模式一般用于调试Hadoop分布式程序代码,检查程序是否正确执行。

一、部署配置

1. 安装JDK及Hadoop

按照《第一篇:Hadoop环境搭建及安装》中3.1、3.2、3.3的步骤安装JDK及Hadoop.

2. 配置JAVA_HOME参数

修改Hadoop的 /etc/hadoop 目录中以下配置文件的JAVA_HOME参数:hadoop-env.sh、mapred-env.sh、yarn-env.sh

(1) hadoop-env.sh

代码语言:javascript复制
# The java implementation to use.
export JAVA_HOME="/opt/modules/jdk1.8.0_301"

(2) mapred-env.sh

代码语言:javascript复制
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME="/opt/modules/jdk1.8.0_301"

(3) yarn-env.sh

代码语言:javascript复制
# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
export JAVA_HOME="/opt/modules/jdk1.8.0_301"

3. HDFS设置、格式化、启动及使用管理

(1) 配置core-site.xml

缺省情况下,Hadoop的 /etc/hadoop 目录下的core-site.xml中的参数使用默认值(各参数默认值及描述可在官网检索:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/core-default.xml),这里我们需要修改此配置文件其中两个参数的值。

(a) fs.defaultFS

此参数用以指定HDFS中NameNode的地址。通过官网检索,可以看到其默认值为:file:///,即使用本地文件系统。若不作修改则无法使用HDFS;同样地,若修改了此参数则无法使用本地模式运行Hadoop程序进行文件读写。

添加以下内容修改此参数值,配置HDFS地址:

代码语言:javascript复制
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop100:8020</value>
</property>

*注:hadoop1.x的默认端口9000,hadoop2.x的默认端口是8020.

(b) hadoop.tmp.dir

此参数用以指定Hadoop运行时产生的文件的存储目录,比如HDFS的NameNode数据都默认存放在这个目录下。通过官网检索,可以看到其默认值为:/tmp/hadoop-${user.name}.

若不作修改,NameNode会将HDFS的元数据存储在这个 /tmp 目录下,此时操作系统一旦重启,系统会清空 /tmp 目录下的文件,导致NameNode元数据丢失,无法关联上DataNodes对数据文件进行操作,是个非常严重的问题,因此需要修改此参数值。

创建临时目录:

代码语言:javascript复制
mkdir -p /opt/data/tmp

添加以下内容修改此参数值,配置临时文件存储目录:

代码语言:javascript复制
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/data/tmp</value>
</property>

图2-1-1:配置core-site.xml文件

(2) 配置hdfs-site.xml

缺省情况下,Hadoop的 /etc/hadoop 目录下的hdfs-site.xml中的参数使用默认值(各参数默认值及描述可在官网检索:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml),这里我们需要修改此配置文件其中一个参数的值。

(a) dfs.replication

此参数用以指定HDFS存储时备份的副本数量。通过官网检索,可以看到其默认值为:3. 因为伪分布式模式下只有一个节点,所以这里需要修改参数为1。若不作修改,会在这一个节点下拷贝三份副本,没有必要,造成存储空间浪费。日后若使用完全分布式模式部署扩展到N个节点,则会自动按照此参数设置的值(例如为5)备份副本到任意(5个)节点上。

添加以下内容修改此参数值,配置HDFS备份副本数量:

代码语言:javascript复制
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>

图2-1-2:配置hdfs-site.xml文件

(3) 格式化并启动HDFS

在第一次启动HDFS前需要进行NameNode格式化,格式化是对HDFS中的DataNodes进行分块(一个块默认128M),再将分块后的初始文件元数据信息及块与块所在DataNode之间的地址映射关系存储在NameNode中。

(a) 格式化NameNode

代码语言:javascript复制
hdfs namenode -format

格式化后,查看之前配置core-site.xml文件里hadoop.tmp.dir参数指定的文件存储目录下(这里设置的是 /opt/data/tmp)是否有dfs目录,如果有,说明格式化成功。

(b) 启动HDFS

  • 启动NameNode
代码语言:javascript复制
${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
  • 启动DataNode
代码语言:javascript复制
${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
  • 启动SecondaryNameNode
代码语言:javascript复制
${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode
  • 使用jps命令查看启动是否已经成功

图2-1-3:查看HDFS是否成功启动

  • 在浏览器中输入地址:http://hadoop100:50070/(这里需要替换成你设置的节点hostname或IP,端口为50070), 通过Web页面查看HDFS的信息,检查是否正常工作,这里还可以界面化管理HDFS中的文件。

图2-1-4:HDFS信息及文件管理Web页面

(c) 格式化后的文件解析

下面我们进入NameNode格式化后的目录 /opt/data/tmp/dfs/name/current 看看里面的内容。

图2-1-5:NameNode格式化目录文件

  • fsimage是namespace镜像文件,其中包含了NameNode的元数据信息,这些信息会被Cache在内存中,也会被持久化存储在本地硬盘中。
  • fsimage*.md5是校验文件,用于校验fsimage的完整性。
  • seen_txid是hadoop的版本。
  • VERSION文件保存的信息:

图2-1-6:VERSION文件信息

  • namespaceID:NN的唯一ID, 一个NN管理一组blockpoolID.
  • clusterID:集群ID, NN和DN的集群ID应该一致,表明是一个集群。
  • cTime:标记了NN存储系统的创建时间。
  • storageType:存储目录的数据结构。
  • blockpoolID:一个 block pool id 标识一个 block pool, 并且是跨集群的全局唯一ID. 格式化过程中,当一个新的namespace被创建的时候会创建并持久化一个唯一ID, NN将blockpoolID持久化到磁盘中,在后续的启动过程中,会再次加载并使用。每个DN的blockpoolID均一致。
  • layoutVersion:一个负整数,通常只有HDFS增加新特性时才会更新这个版本号。

(d) log日志查看

HDFS的格式化及启动等操作可以在Hadoop的logs路径下查看日志信息。

图2-1-7:查看日志信息

(e) 格式化注意事项

  • 不要经常对NameNode进行格式化,因为格式化NameNode会产生新的集群ID, 从而导致NameNode和DataNode的集群ID不一致,集群就会找不到以往的数据。

图2-1-8:NN与DN的集群ID需要一致

  • 如果一定要进行格式化(不是首次格式化的情况下),格式化前一定要先删除log日志及data文件夹的数据,再格式化NameNode.

图2-1-9:NameNode多次格式化问题

(4) 使用管理HDFS

我们可以通过hdfs的命令或者浏览器界面操作这两种方式来使用和管理HDFS中的文件。

(a) 使用hdfs命令

  • 在HDFS上创建目录
代码语言:javascript复制
hdfs dfs -mkdir -p /user/hadoop/input
  • 上传本地文件到HDFS上
代码语言:javascript复制
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /user/hadoop/input
  • 读取HDFS上的文件内容
代码语言:javascript复制
hdfs dfs -cat /user/hadoop/input/core-site.xml

图2-1-10:读取HDFS上的文件内容

  • 下载HDFS上的文件到本地
代码语言:javascript复制
hdfs dfs -get /user/hadoop/input/core-site.xml /opt/data

图2-1-11:下载HDFS上的文件到本地

(b) 使用Web页面

打开HDFS的Web页面地址:http://hadoop100:50070/,点击Utilities-->Browse the file system进入文件管理界面进行操作。

图2-1-12:使用浏览器界面使用HDFS

4. YARN设置及启动

(1) 配置yarn-site.xml

缺省情况下,Hadoop的 /etc/hadoop 目录下的yarn-site.xml中的参数使用默认值(各参数默认值及描述可在官网检索:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml),这里我们需要修改此配置文件其中两个参数的值。

(a) yarn.nodemanager.aux-services

此参数用以指定Reducer获取数据的方式。这里设置为默认使用mapreduce_shuffle混洗算法。关于shuffle算法在《第二篇:Hadoop基础知识及部署模式》的第2.3章中有详细介绍,而且这个是MapReduce的重要知识点,之后还会深入研究学习。

添加以下内容修改此参数值,配置YARN的默认混洗方式:

代码语言:javascript复制
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>

(b) yarn.resourcemanager.hostname

此参数用以指定YARN的ResourceManager运行在哪个节点上。由于伪分布式模式下只有一台机器,因此直接设置为本机的hostname即可。

添加以下内容修改此参数值,配置YARN的ResourceManager运行地址:

代码语言:javascript复制
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop100</value>
</property>

图2-1-13:配置yarn-site.xml文件

(2) 配置mapred-site.xml

缺省情况下,Hadoop的 /etc/hadoop 目录下的mapred-site.xml中的参数使用默认值(各参数默认值及描述可在官网检索:https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapred-default.xml),这里我们需要修改此配置文件其中一个参数的值。

(a) mapreduce.framework.name

此参数用以指定MapReduce运行在哪种框架上。通过官网检索,可以看到其默认值为:local,即在本地运行。若不作修改则无法使用YARN框架运行MapReduce. 该参数有三个值可选:local, classic, yarn. 其中classic是专门为Hadoop1.x版本设置的。 重命名配置模板文件进行修改:

代码语言:javascript复制
mv mapred-site.xml.template mapred-site.xml

添加以下内容修改此参数值,配置MapReduce运行的框架:

代码语言:javascript复制
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>

图2-1-14:配置mapred-site.xml文件

(3) 启动YARN

在启动YARN集群之前必须确保HDFS的NameNode和DataNode已经启动,可使用jps命令进行查看。

(a) 启动ResourceManager

代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager

(b) 启动NodeManager

代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager

(c) 查看YARN是否启动成功

  • 使用jps命令查看进程

图2-1-15:查看YARN是否成功启动

  • 在浏览器中输入地址:http://hadoop100:8088/(这里需要替换成你设置的节点hostname或IP,端口为8088), 通过Web页面查看YARN的资源调度信息,检查是否正常工作。由于目前没有运行任何程序,因此显示"No data available".

图2-1-16:YARN的资源调度管理Web页面

二、运行调试

我们这里使用本地模式下介绍过的WordCount官方案例来进行伪分布式模式部署下使用HDFS运行MapReduce程序的调试测试。还会介绍如何使用YARN的Web页面查看Job的运行情况,如何配置历史服务器和日志聚集用以查看运行Job的详细信息。

1. 使用HDFS及YARN运行调试程序

(1) 在HDFS上准备目录及文件

我们使用之前在HDFS上创建的 /user/hadoop/input 目录存放需要读取的输入文件,并把在本地模式下调试中创建的wc.input文件复制到此目录中:

代码语言:javascript复制
hdfs dfs -put /opt/data/wc.input /user/hadoop/input

在HDFS的Web页面查看文件是否成功上传:

图2-2-1:通过HDFS的Web页面查看文件是否成功上传

(2) 运行WordCount官方案例

运行下面的hadoop命令,使用HDFS中的文件在YARN上执行程序,并查看程序的运行情况:

代码语言:javascript复制
hadoop jar /opt/modules/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/hadoop/input/wc.input /user/hadoop/output

图2-2-2:后台查看程序运行情况

(3) 在YARN页面中查看Job的运行情况

图2-2-3:YARN页面查看Job运行情况

(4) 查看输出到HDFS的output目录下的结果文件

可在HDFS的Web页面中查看输出结果文件:

图2-2-4:在HDFS的Web页面查看输出结果文件

2. 配置并启动历史服务

点击YARN页面Job运行记录中的History链接,可以发现是无法访问的,这是因为没有开启Hadoop的历史服务。

Hadoop开启历史服务后,可以在YARN的Web页面上查看执行Job的详细信息。可以通过历史服务器查看已经运行完的MapReduce作业记录,比如Map的使用数、Reduce的使用数、Counter计数器、Shuffle情况、配置信息、Map任务情况、Reduce任务情况等信息。

(1) 配置mapred-site.xml

在Hadoop的 /etc/hadoop 目录下的mapred-site.xml配置文件中增加修改其中两个参数的值。

(a) mapreduce.jobhistory.address

此参数用以指定Hadoop历史服务器端的地址。由于伪分布式模式下只有一台机器,因此直接设置为本机的hostname或IP地址即可,端口为10020.

添加以下内容修改此参数值,配置历史服务器端地址:

代码语言:javascript复制
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop100:10020</value>
</property>

(b) mapreduce.jobhistory.webapp.address

此参数用以指定Hadoop历史服务器Web端的地址。由于伪分布式模式下只有一台机器,因此直接设置为本机的hostname或IP地址即可,端口为19888.

添加以下内容修改此参数值,配置历史服务器Web端地址:

代码语言:javascript复制
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop100:19888</value>
</property>

图2-2-5:配置历史服务器地址

(2) 启动历史服务

代码语言:javascript复制
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver

使用jps命令查看历史服务是否成功启动:

图2-2-6:查看历史服务是否成功启动

(3) 查看历史服务

打开YARN的Web页面:http://hadoop100:8088/,点击Job运行记录中的History链接进入历史服务,可看到以下页面,即可查看Job的各种详细信息:

图2-2-7:通过历史服务查看Job的详细信息

3. 配置并启动日志聚集

进入Job历史服务Overview页面,Map和Reduce个数的链接上,点击进入Map的详细信息页面,再点击task name的链接,查看某一个Map或者Reduce的详细日志logs是看不到的,会显示以下信息,这是因为没有开启日志聚集服务。

图2-2-8:无法查看日志logs信息

MapReduce是在各个机器上运行的,在运行过程中产生的日志会存储于各个机器节点上,为了能够统一查看各个机器的运行日志,将日志集中存放在HDFS上,这个过程就是日志聚集。其优势是可以方便地查看到程序的运行详情,便于开发调试。但在默认情况下,Hadoop是不启用日志聚集的。

(1) 配置yarn-site.xml

在Hadoop的 /etc/hadoop 目录下的yarn-site.xml配置文件中增加修改其中两个参数的值。

(a) yarn.log-aggregation-enable

此参数用以指定Hadoop是否启用日志聚集功能。通过官网检索,可以看到其默认值为:false, 即默认不开启日志聚集功能,若要启用则需要修改此参数为true.

添加以下内容修改此参数值,配置Hadoop启用日志聚集功能:

代码语言:javascript复制
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>

(b) yarn.log-aggregation.retain-seconds

此参数用以指定日志聚集保留的时间。通过官网检索,可以看到其默认值为:-1, 即默认不开启此保留时间,若要启用则需要修改此参数为保留时长值(单位为秒),这里设置保留7天,即604800秒。

添加以下内容修改此参数值,配置日志聚集保留时间:

代码语言:javascript复制
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604800</value>
</property>

图2-2-9:配置日志聚集功能

(2) 重启历史服务及YARN进程

配置开启日志聚集功能后,需要重启历史服务及YARN的ResourceManager及NodeManager进程,使日志聚集功能生效。

  • 关闭历史服务
代码语言:javascript复制
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh stop historyserver
  • 停止NodeManager
代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh stop nodemanager
  • 停止ResourceManager
代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh stop resourcemanager
  • 使用jps命令查看是否停止成功

图2-2-10:查看历史服务及YARN是否停止成功

  • 启动ResourceManager
代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
  • 启动NodeManager
代码语言:javascript复制
${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
  • 启动历史服务
代码语言:javascript复制
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver
  • 使用jps命令查看是否启动成功

图2-2-11:查看历史服务及YARN是否重启成功

  • 另外,重启YARN可以使用另一种更快捷的方法:
代码语言:javascript复制
${HADOOP_HOME}/sbin/stop-yarn.sh
${HADOOP_HOME}/sbin/start-yarn.sh
  • 注意:每次停止和启动都要使用jps命令查看是否成功!

(3) 查看日志聚集

  • 删除HDFS的 /user/hadoop 下的 output 目录:
代码语言:javascript复制
hdfs dfs -rm -r /user/hadoop/output
  • 重新运行WordCount案例程序:
代码语言:javascript复制
hadoop jar /opt/modules/hadoop-2.10.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar wordcount /user/hadoop/input/wc.input /user/hadoop/output
  • 打开YARN的Web页面:http://hadoop100:8088/,点击Job运行记录中的History链接进入历史服务,点击Map个数的链接,进入Map的详细信息页面,再点击task name的链接,进入后点击logs链接,即可看到日志信息:

图2-2-12:在YARN的Web页面查看日志信息

上一篇:Hadoop基础知识及部署模式

下一篇:Hadoop部署配置及运行调试(下),敬请期待!

0 人点赞