文章大纲:
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
${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode
- 启动DataNode
${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode
- 启动SecondaryNameNode
${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上创建目录
hdfs dfs -mkdir -p /user/hadoop/input
- 上传本地文件到HDFS上
hdfs dfs -put ${HADOOP_HOME}/etc/hadoop/core-site.xml /user/hadoop/input
- 读取HDFS上的文件内容
hdfs dfs -cat /user/hadoop/input/core-site.xml
图2-1-10:读取HDFS上的文件内容
- 下载HDFS上的文件到本地
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进程,使日志聚集功能生效。
- 关闭历史服务
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh stop historyserver
- 停止NodeManager
${HADOOP_HOME}/sbin/yarn-daemon.sh stop nodemanager
- 停止ResourceManager
${HADOOP_HOME}/sbin/yarn-daemon.sh stop resourcemanager
- 使用jps命令查看是否停止成功
图2-2-10:查看历史服务及YARN是否停止成功
- 启动ResourceManager
${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager
- 启动NodeManager
${HADOOP_HOME}/sbin/yarn-daemon.sh start nodemanager
- 启动历史服务
${HADOOP_HOME}/sbin/mr-jobhistory-daemon.sh start historyserver
- 使用jps命令查看是否启动成功
图2-2-11:查看历史服务及YARN是否重启成功
- 另外,重启YARN可以使用另一种更快捷的方法:
${HADOOP_HOME}/sbin/stop-yarn.sh
${HADOOP_HOME}/sbin/start-yarn.sh
- 注意:每次停止和启动都要使用jps命令查看是否成功!
(3) 查看日志聚集
- 删除HDFS的 /user/hadoop 下的 output 目录:
hdfs dfs -rm -r /user/hadoop/output
- 重新运行WordCount案例程序:
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部署配置及运行调试(下),敬请期待!