前面咱们讲到了hadoop拥有3种运行模式,搭建了最简答的本地运行模式并在其上运行了两个简单案例。本章节咱们学习伪分布模式。顾名思义,该模式外在看起来像是分布式,实际上只有一个节点。java
伪分布模式的有不一样的搭建方式,具体取决于咱们须要用到什么样的功能。前面提到过,Hadoop主要有3大模块:HDFS、YARN以及MapReduce。接下来咱们经过该模式搭建hadoop不一样的模块。node
从本章节你能够学习到:web
本小节咱们将搭建HDFS组件,并在其上运行一个案例。shell
安装jdk以及hadoop,安装方式参考本系列第二章节。如今咱们已经准备好了和本地模式如出一辙的环境,接下来开始建立DFS须要的namenode以及datanode。apache
注意:在此以前最好配置好本身所搭建环境的主机名关系,例如我搭建的环境共有5台机器,他们的/etc/hosts文件以下:分布式
192.168.102.131 h131 192.168.102.132 h132 192.168.102.133 h133 192.168.102.134 h134 192.168.102.135 h135
同时主机名也最好设置一下,经过命令hostname h131
进行设置。oop
注意,伪分布模式只需一台机器就能够,上面的列表只是为了后面的集群模式准备的,因此提早准备这样的环境也不是不行,不过本教程暂时用不到。学习
配置文件的位置都位于/opt/module/hadoop-2.7.2/etc/hadoop下。配置内容放在<configuration>
配置节中,其中h131是个人这台主机的主机名,记住写本身的主机名便可。测试
一、配置hadoop-env.sh
,修改JAVA_HOME 路径,若是您已经参考了本系列教程的第2章内容,此处能够不作。网站
二、配置core-site.xml,添加配置
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://h132:8020</value> </property>
fs.defaultFS使用本地文件协议,查看官方文档可知其默认值为
file:///
;
三、配置hdfs-site.xml
<!-- 指定HDFS副本的数量 --> <property> <name>dfs.replication</name> <value>1</value> </property>
dfs.replication默认值为3。
经过2咱们已经完成了基本的hdfs配置。咱们如今配置了数据节点的信息,同时指定了文件的副本数,接下来咱们启动集群。
一、格式化namenode(第一次启动时须要格式化)
# hdfs namenode -format
hdfs位于bin下,因为咱们配置了环境变量,能够在任何地方直接调用。
二、启动namenode
# hadoop-daemon.sh start namenode
hadoop-daemon.sh
位于hadoop/sbin下,因为咱们一样配置的环境变量,能够直接调用。
三、启动datanode
# hadoop-daemon.sh start datanode
四、查看结果:经过命令jps查看当前启动的java进行,能够看出,两个节点都已经启动。
9731 NameNode 9893 Jps 9822 DataNode
前面咱们成功的启动了两个节点:HDFS的namenode和datanode。接下来咱们查看该集群的具体状况。
一、经过命令:查看当前启动的节点信息
# jps
二、经过日志:当咱们启动一个节点服务以后,在hadoop的文件夹下就会生成一个logs文件,在该文件中每个节点都有对应的日志信息,咱们能够经过该文件获取本身想要获取的信息,例如 hadoop-root-datanode-h132.log
;
三、经过可视化web:咱们也能够经过namenode开放的50070查看hadoop的管理网站——IP:50070.
若是没法正常访问该网站,尝试关闭50070端口的防火墙限制。另外,hadoop须要开放的端口目前没有仔细统计,既然是用做本身练习,最好仍是直接关闭防火墙好些。(
systemctl stop firewalld
)。到了生产环境中,这些端口的开放仍是须要具体的文档规范的,如今不必去纠结这些。
接下来咱们往DFS文件系统中进行文件操做并运行一个简单案例。
一、在HDFS上建立一个user/zhaoyi文件夹
# hadoop fs -mkdir -p /user/zhaoyi
经过该命令咱们在HDFS文件系统中建立了
/user/zhaoyi
想要学习更多的命令,请参考官方文档。
二、查看文件夹信息
# hadoop fs -ls -R /
获得以下的输出
drwxr-xr-x - root supergroup 0 2018-04-25 23:41 /user drwxr-xr-x - root supergroup 0 2018-04-25 23:41 /user/zhaoyi
即咱们已经在根目录下建立了一个文件夹user以及其子文件夹zhaoyi.
你也能够经过前面提到的web访问进行查看,在最后一个菜单项
utilities
的下拉菜单项Browse the file system
获取HDFS文件系统可视化信息。
三、删除文件夹 接下来咱们测试一下如何删除文件夹,即将user下的zhaoyi文件夹删掉
# hadoop fs -rm -r /user/zhaoyi
以前咱们都是用本地文件来进行mapreduce的,此次咱们经过HDFS文件系统来帮咱们完成文件的输入与计算输出,测试案例选用wordcount。
一、在HDFS中建立一个input文件夹
# hadoop fs -mkdir /user/input
二、建立一个文件something,并往里面写入一些内容,例如
this is a beautiful flower? yes, but I love FGO better.
三、将该文件上传到HDFS的input文件夹下
# hadoop fs -put something /user/input
你也能够多建立几个文件,并上传到input文件夹下面进行计算。
四、调用wordcount案例,输入为咱们HDFS的input文件夹,输出也在该目录下。
# hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/input /user/output
该命令前面咱们已经解释过各个参数的含义,不一样的是input的output指代的路径再也不是本地路径,而是HDFS协议的路径。
五、查看输出的结果
# hadoop fs -cat /user/output/part-r-00000
能够获得以下的输出:
FGO 1 I 1 a 1 beautiful 1 better. 1 but 1 flower? 1 is 1 love 1 this 1 yes, 1
一样,你也能够经过web管理网站查看这些文件的信息。
获得本身想要的结果以后,记得删除output文件夹,避免指定相同输出环境的计算用例会由于有同名文件夹而失败:
hadoop fs -rf -r /user/output
。
前面咱们提到过,YARN是Hadoop中负责资源调度的模块,1.x版本中甚至没有他的踪迹,可见这是2.x新增的组件。他包含了4个模块,接下来,咱们将准备在以前的基础上搭建YARN环境,建立资源管理节点(1)ResourceManager RM)以及节点管理节点(NodeManager NM)。
注意这是基于咱们1建立的HDFS环境之上的。
注:Hadoop的配置文件都是位于/opt/module/hadoop-2.7.2/etc/hadoop下。
一、配置yarn的环境配置文件:yarn-env.sh,添加JAVA_HOME的具体路径信息
export JAVA_HOME=/opt/module/jdk1.8.0_131
/opt/module/jdk1.8.0_131
是echo $JAVA_HOME
输出的值,根据的您的环境进行设置。
二、配置yarn的配置文件:yarn-site.xml,添加以下内容
<!-- reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>h132</value> </property>
h132是我本台主机的主机名,请按您本身的主机名进行填写。一样是放在
<configuration>
配置节中。
三、配置mapreduce的环境配置文件,一样加入JAVA_HOME的具体信息
export JAVA_HOME=/opt/module/jdk1.8.0_131
四、配置mapreduce的配置文件:mapred-site.xml,你会发现这个文件不存在。其实他有一个模板文件的:mapred-site.xml.template,将其从新命名为mapred-site.xml,而后在进行配置便可:
# mv mapred-site.xml.template mapred-site.xml
指定mapreduce从默认的local运行变为yarn上运行,往mapred-site.xml中添加:
<!-- 指定mr运行在yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
查看官方文档可知mapreduce.framework.name的默认值为local,咱们如今将其修改成yarn.
至此,咱们的配置就完成了。以上步骤看起来不少,其实很简单,无非就是配置yarn以及mapreduce的相关参数。
以前咱们已经启动了HDFS的datanode和namenode,接下来咱们启动yarn的RM(ResourceManager)以及NM(NodeManager)。
一、启动yarn的resourcemanager
# yarn-daemon.sh start resourcemanager
查看是否启动成功
# jps 9731 NameNode 10629 ResourceManager 9822 DataNode 10782 Jps
二、启动yarn的nodemanager
# yarn-daemon.sh start nodemanager
查看是否启动成功
# jps 9731 NameNode 10629 ResourceManager 10971 Jps 10877 NodeManager 9822 DataNode
以上过程完成后,咱们的单台机器中就已经添加了yarn组件,接下来咱们查看添加yarn以后的变化,一样的,咱们能够经过jps命令查看,也能够经过web可视化界面查看。
前面咱们已经经过IP:50070查看HDFS的管理信息,接下来咱们能够经过8088端口查看集群的监控信息,包括mapreduce执行任务的具体记录等等,均可以从这个web服务中查看到。
接下来咱们运行wordcount案例,咱们和使用hdfs同样的操做方式便可。使用yarn处理的不一样在于其内部的处理,咱们之后会学到具体的内容,如今咱们看看运行过程当中的特色。
一、运行计算
# hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/input /user/output
和以前的没有任何区别。
二、查看网站的输出结果,咱们在任务开始的时候,不一样的刷新网站,能够看到以下的界面
如今咱们看到,任务开始了,刚执行了一段。
如今处理了一部份内容。
任务完成。
相比较以前的HDFS处理方式,这个稍微慢了些。是由于任务调度的问题,并且目前咱们处理的东西也不多,当任务量大了以后,就能够获得其带来的实惠了。
另外,咱们也能够经过日志查看整个执行过程,好比下面这段比较有意思
FO mapreduce.Job: map 0% reduce 0% 18/04/26 01:32:45 INFO mapreduce.Job: map 100% reduce 0% 18/04/26 01:32:56 INFO mapreduce.Job: map 100% reduce 100% 18/04/26 01:32:56 INFO mapreduce.Job: Job job_1524676888858_0001 completed successfully 18/04/26 01:32:56 INFO mapreduce.Job: Counters: 49
咱们能够看到mapreduce的过程。
前面咱们提到,数据节点以及名称节点的数据都是存储在/tmp/下,查看/tmp下的目录能够发现,目录为tmp/hadoop-xxx(xxx为使用者用户名)。这显然不便于管理,咱们接下来学习一下如何修改此路径,将其放在咱们的/opt/module/hadoop-2.7.2路径下,方便统一管理。
一、查看官方文档,咱们能够了解到,配置存储目录的配置项位于core-site.xml中的hadoop.tmp.dir
配置项,其默认值为/tmp/hadoop-${user.name}
,如今咱们来修改这个配置项,编辑core-site.xml,添加此配置项
<property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property>
能够看到,咱们将临时存储目录修改成/opt/module/hadoop-2.7.2/data/tmp
了,接下来为了使这个配置生效,咱们须要重启集群,让集群从新读取配置文件。重启过程分为中止和启动两个步骤。
二、中止集群,按顺序依次中止各个节点:
# yarn-daemon.sh stop resourcemanager # yarn-daemon.sh stop nodemanager # hadoop-daemon.sh stop namenode # hadoop-daemon.sh stop datanode
yarn-daemon.sh
与hadoop-daemon.sh
shell脚本都位于/opt/module/hadoop-2.7.2/sbin目录下。
三、删除旧集群的临时目录,避免启动新集群的时候发生错误
# cd /tmp # rm -rf hadoop-{your-user-name}
hadoop-{your-user-name}文件夹根据当前用户名命名,若是你使用root用户操做,这个文件夹会形如hadoop-root.若是你是aqua用户,该文件夹形如hadoop-aqua.
四、格式化名称节点。而后启动集群,按顺序依次启动各个节点:
# hadoop namenode -format # hadoop-daemon.sh start namenode # hadoop-daemon.sh start datanode # yarn-daemon.sh start resourcemanager # yarn-daemon.sh start nodemanager
操做的过程当中,每执行一步都不要忘了使用jps等命令查看是否达到预期的效果
如今,咱们就能够看到,临时文件夹在/opt/module/hadoop-2.7.2
下面生成了,命名方式也受咱们的配置所制约。咱们查看一下当前的data的目录结构
# ls -R data data: tmp data/tmp: dfs nm-local-dir data/tmp/dfs: data name data/tmp/dfs/data: current in_use.lock data/tmp/dfs/data/current: BP-191797622-192.168.102.132-1524740656851 VERSION ...
比较多默认生成的文件,让人眼花缭乱,具体每一个文件的用途,随着咱们学习的推动能够慢慢了解到,如今知道有这么一些文件就能够了。
接下来,咱们能够测试一下建立文件夹以及上传文件等操做是否正常便可。
五、测试集群是否正常
# hadoop fs -mkdir -p /user/zhaoyi # touch test.txt # hadoop fs -put text.txt /user/zhaoyi
咱们递归建立了/user/zhaoyi文件夹,并往其中上传了一个/user/zhaoyi文件,下面咱们查看这些文件的信息便可:
# hadoop fs -ls -R /user drwxr-xr-x - root supergroup 0 2018-04-26 19:13 /user/zhaoyi -rw-r--r-- 1 root supergroup 0 2018-04-26 19:13 /user/zhaoyi/test.txt
能够看到,集群运行正常。