【云计算】用 Hadoop 进行分布式数据处理(进阶)
小标 2018-11-09 来源 : 阅读 671 评论 0

摘要:本文主要向大家介绍了【云计算】用 Hadoop 进行分布式数据处理(进阶),通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】用 Hadoop 进行分布式数据处理(进阶),通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


Hadoop 分布式计算架构的真正实力在于其分布性。换句话说,向工作并行分布多个节点的能力使 Hadoop 能够应用于大型基础设施以及大量数据的处理。本文首先对一个分布式 Hadoop 架构进行分解,然后探讨分布式配置和使用。


分布式 Hadoop 架构


根据 用 Hadoop 进行分布式数据处理,第 1 部分:入门,所有 Hadoop 守护进程都在同一个主机上运行。尽管不运用 Hadoop  的并行性,这个伪分布式配置提供一种简单的方式来以最少的设置测试 Hadoop 的功能。现在,让我们使用机器集群探讨一下 Hadoop  的并行性。


根据第 1 部分,Hadoop 配置定义了让所有 Hadoop 守护进程在一个节点上运行。因此,让我们首先看一下如何自然分布 Hadoop 来执行并行操作。在一个分布式 Hadoop 设置中,您有一个主节点和一些从节点(见图 1)。



图 1. Hadoop 主从节点分解


如图 1 所示,主节点包括名称节点、从属名称节点和 jobtracker  守护进程(即所谓的主守护进程)。此外,这是您为本演示管理集群所用的节点(使用 Hadoop 实用程序和浏览器)。从节点包括  tasktracker 和数据节点(从属守护进程)。两种设置的不同之处在于,主节点包括提供 Hadoop  集群管理和协调的守护进程,而从节点包括实现 Hadoop 文件系统(HDFS)存储功能和 MapReduce 功能(数据处理功能)的守护进程。


对于该演示,在一个 LAN 上创建一个主节点和两个从节点。设置如图 2 所示。现在,我们来探讨用于多节点分布的 Hadoop 的安装和配置。



图 2. Hadoop 集群配置


为简化部署,要运用虚拟化技术,该技术有几个好处。尽管在该设置中使用虚拟化技术看不出性能优势,但是它可以创建一个 Hadoop  安装,然后为其他节点克隆该安装。为此,您的 Hadoop  集群应显示如下:在一个主机上的虚拟机监控程序上下文中将主从节点作为虚拟机(VM)运行(见图 3)。



图 3. 虚拟环境中的 Hadoop 集群配置


升级 Hadoop


在 用 Hadoop 进行分布式数据处理,第 1 部分:入门 中,我们安装了在一个节点上运行的 Hadoop  的一个特殊分布(伪配置)。在本文中,我们要更新分布式配置。如果您没有看过本系列的第 1 部分,那么请阅读第 1 部分,了解如何首先安装  Hadoop 伪配置。


在伪配置中,您没有进行任何配置,因为单个节点已经过预先配置。现在,您需要更新配置。首先,使用 update-alternatives 命令检查当前配置,如清单 1 所示。该命令告诉您,配置在使用 conf.pseudo(最高优先级)。


清单 1. 检查当前 Hadoop 配置



    
        
            
        
    


            

$ update-alternatives --display


            

Hadoop-0.20-conf


            

Hadoop-0.20-conf - status is auto.


            

link currently points to /etc/Hadoop-0.20/conf.pseudo


            

/etc/Hadoop-0.20/conf.empty - priority 10


            

/etc/Hadoop-0.20/conf.pseudo - priority 30


            

Current `best' version is /etc/Hadoop-0.20/conf.pseudo.


            

$


                


下一步,通过复制现有配置(本例中为 conf.empty,如清单 1 所示)创建一个新配置:



    
        
            
        
    


            

$ sudo cp -r /etc/Hadoop-0.20/


            

conf.empty /etc/Hadoop-0.20/conf.dist


            

$


                


最后,激活并检查新配置:


清单 2. 激活并检查 Hadoop 配置



    
        
            
        
    


            

$ sudo update-alternatives --install


            

/etc/Hadoop-0.20/conf Hadoop-0.20-conf 


            

/etc/Hadoop-0.20/conf.dist 40


            

$ update-alternatives --display Hadoop-0.20-conf


            

Hadoop-0.20-conf - status is auto.


            

link currently points to /etc/Hadoop-0.20/conf.dist


            

/etc/Hadoop-0.20/conf.empty - priority 10


            

/etc/Hadoop-0.20/conf.pseudo - priority 30


            

/etc/Hadoop-0.20/conf.dist - priority 40


            

Current `best' version is /etc/Hadoop-0.20/conf.dist.


            

$


                


现在,您有一个名为 conf.dist 的新配置,您要将其用于您的新分布式配置。此时该节点运行于一个虚拟环境中,将该节点克隆到另外两个要充当数据节点的节点中。


配置 Hadoop 以实现分布式操作


下一步是要使所有节点互联互通。这可以 /etc/Hadoop-0.20/conf.dist/ 中的两个名为 masters 和 slaves 的文件中实现。本例中的三个节点的 IP 地址是静态分配的,如清单 3 所示(来自 /etc/hosts):


清单 3. 该设置的 Hadoop 节点(/etc/hosts)



    
        
            
        
    


            

master 192.168.108.133


            

slave1 192.168.108.134


            

slave2 192.168.108.135


                


因此,在主节点上,更新 /etc/Hadoop-0.20/conf.dist/masters 来确定主节点,如下所示:



    
        
            
        
    

master    


然后在 /etc/Hadoop-0.20/conf.dist/slaves 中确定从节点, 其中包括以下两行:



    
        
            
        
    

slave1
            

slave2


                


接下来,从每个节点上,将 Secure Shell (ssh) 连接到所有其他节点,确保 pass-phraseless ssh 在运行。所有这些文件(masters,slaves)都由本系列第 1 部分中使用过的 Hadoop 启动和停止工具使用。


下一步,在 /etc/Hadoop-0.20/conf.dist 子目录中继续进行 Hadoop  配置。以下变更需要应用于所有节点(主节点和从节点),如同 Hadoop 文档中所定义的。首先,在 core-site.xml 文件(清单  4)中确定 HDFS 主节点,它定义名称节点的主机和端口(注意主节点的 IP 地址的使用)。core-site.xml 文件定义 Hadoop  的核心属性。


清单 4. 在 core-site.xml 中定义 HDFS 主节点



    
        
            
        
    


            

<configuration>


            

<property>


            

<name>fs.default.name<name>


            

<value>hdfs://master:54310<value>


            

<description>The name and URI of the default FS.</description>


            

<property>


            

<configuration>


                


下一步,确认 MapReduce jobtracker。jobtracker 位于其自己的节点上,但对于本配置,将其放在主节点上,如清单 5 所示。mapred-site.xml 文件包含 MapReduce 属性。


清单 5. 在 mapred-site.xml 中定义 MapReduce jobtracker



    
        
            
        
    


            

<configuration>


            

<property>


            

<name>mapred.job.tracker<name>


            

<value>master:54311<value>


            

<description>Map Reduce jobtracker<description>


            

<property>


            

<configuration>


                


最后,定义默认复制因子(清单 6)。该值定义将创建的副本数,一般小于 3。在本例中,将其定义为 2(数据节点的数量)。该值在包含 HDFS 属性的 hdfs-site.xml 中定义。


清单 6. 在 hdfs-site.xml 中定义默认数据副本



    
        
            
        
    


            

<configuration>


            

<property>


            

<name>dfs.replication<name>


            

<value>2<value>


            

<description>Default block replication<description>


            

<property>


            

<configuration>


                


配置项如 清单 4 所示,分布式设置所需的元素见 清单 5 和 清单 6。Hadoop 在这里提供大量配置选项,支持您按需定制整个环境。参考资料 部分含有关于这些选项的更多信息。


完成配置之后,下一步是要格式化名称节点(HDFS 主节点)。对于该操作,使用 Hadoop-0.20 实用程序指定名称节点和操作(-format):


清单 7. 格式化名称节点



    
        
            
        
    


            

user@master:~# sudo su -


            

root@master:~# Hadoop-0.20 namenode -format


            

10/05/11 18:39:58 INFO namenode.NameNode: STARTUP_MSG:


            

/************************************************************


            

STARTUP_MSG: Starting NameNode


            

STARTUP_MSG:   host = master/127.0.1.1


            

STARTUP_MSG:   args = [-format]


            

STARTUP_MSG:   version = 0.20.2+228


            

STARTUP_MSG:   build =  -r cfc3233ece0769b11af9add328261295aaf4d1ad;


            

************************************************************/


            

10/05/11 18:39:59 INFO namenode.FSNamesystem: fsOwner=root,root


            

10/05/11 18:39:59 INFO namenode.FSNamesystem: supergroup=supergroup


            

10/05/11 18:39:59 INFO namenode.FSNamesystem: isPermissionEnabled=true


            

10/05/11 18:39:59 INFO common.Storage: Image file of size 94 saved in 0 seconds.


            

10/05/11 18:39:59 INFO common.Storage:


            

Storage directory /tmp/Hadoop-root/dfs/name has been successfully formatted.


            

10/05/11 18:39:59 INFO namenode.NameNode: SHUTDOWN_MSG:


            

/************************************************************


            

SHUTDOWN_MSG: Shutting down NameNode at master/127.0.1.1


            

************************************************************/


            

root@master:~#


                


格式化名称节点之后,就可以启动 Hadoop 守护进程了。可以对第 1 部分中的伪分布式配置执行同样的操作,但进程为分布式配置完成同样的工作。注意,这里的代码启动名称节点和从属名称节点(正如 jps 命令所指示):


清单 8. 启动名称节点



    
        
            
        
    


            

root@master:~# /usr/lib/Hadoop-0.20


            

/bin/start-dfs.sh


            

starting namenode, logging to


            

/usr/lib/Hadoop-0.20/bin/../logs/Hadoop-root-namenode-mtj-desktop.out


            

192.168.108.135: starting datanode, logging to


            

/usr/lib/Hadoop-0.20/bin/../logs/Hadoop-root-datanode-mtj-desktop.out


            

192.168.108.134: starting datanode, logging to


            

/usr/lib/Hadoop-0.20/bin/../logs/Hadoop-root-datanode-mtj-desktop.out


            

192.168.108.133: starting secondarynamenode,


            

logging to /usr/lib/Hadoop-0.20/logs/Hadoop-root-secondarynamenode-mtj-desktop.out


            

root@master:~# jps


            

7367 NameNode


            

7618 Jps


            

7522 SecondaryNameNode


            

root@master:~#


                


现在,如果使用 jps 节点检测其中一个从节点(数据节点),您会看到每个节点上都有一个数据节点守护进程:


清单 9. 检测其中一个从节点上的数据节点



    
        
            
        
    


            

root@slave1:~# jps


            

10562 Jps


            

10451 DataNode


            

root@slave1:~#


                


下一步是要启动 MapReduce 守护进程(jobtracker 和 tasktracker)。如 清单 10  所示执行该操作。注意,脚本启动主节点上的 jobtracker(正如配置所定义的;参见 清单 5)和每个从节点上的  tasktrackers。主节点上的一个 jps 命令显示 jobtracker 正在运行。


清单 10. 启动 MapReduce 守护进程



    
        
            
        
    


            

root@master:~# /usr/lib/Hadoop-0.20


            

/bin/start-mapred.sh


            

starting jobtracker, logging to


            

/usr/lib/Hadoop-0.20/logs/Hadoop-root-jobtracker-mtj-desktop.out


            

192.168.108.134: starting tasktracker, logging to


            

/usr/lib/Hadoop-0.20/bin/../logs/Hadoop-root-tasktracker-mtj-desktop.out


            

192.168.108.135: starting tasktracker, logging to


            

/usr/lib/Hadoop-0.20/bin/../logs/Hadoop-root-tasktracker-mtj-desktop.out


            

root@master:~# jps


            

7367 NameNode


            

7842 JobTracker


            

7938 Jps


            

7522 SecondaryNameNode


            

root@master:~#


                


最后,使用 jps 检查一个从节点。这里您可以看到,一个 tasktracker 守护进程将数据节点守护进程联接到每个从数据节点上:


清单 11. 检测其中一个从节点上的数据节点



    
        
            
        
    


            

root@slave1:~# jps


            

7785 DataNode


            

8114 Jps


            

7991 TaskTracker


            

root@slave1:~#


                


启动脚本、节点和启动的守护进程之间的关系如图 4 所示。如您所见,start-dfs 脚本启动名称节点和数据节点,而 start-mapred 脚本启动 jobtracker 和 tasktrackers。



图 4. 每个节点的启动脚本和守护进程的关系


测试 HDFS


既然 Hadoop 已经开始在整个集群中运行了,您可以运行一些测试来确保其正常运作(见清单 12)。首先,通过 Hadoop-0.20  实用程序发出一个文件系统命令(fs),并请求一个 df(disk free)操作。与在 Linux®  中一样,该命令仅确定特定设备的已用空间和可用空间。因此,对于新格式化的文件系统,就没有已用空间。下一步,在 HDFS 的根上执行一个 ls  操作,创建一个子目录,列出其内容,并删除它。最后,在 Hadoop-0.20 实用程序内,您可以使用 fsck 命令在 HDFS 上执行一个  fsck(文件系统检查)。这一切 — 以及各种其他信息(比如检测到两个数据节点)— 都告诉您文件系统是正常的。


清单 12. 检查 HDFS



    
        
            
        
    


            

root@master:~# Hadoop-0.20


            

fs -df


            

File system        Size    Used    Avail        Use%


            

/        16078839808    73728    3490967552    0%


            

root@master:~# Hadoop-0.20 fs -ls /


            

Found 1 items


            

drwxr-xr-x   - root supergroup          0 2010-05-12 12:16 /tmp


            

root@master:~# Hadoop-0.20 fs -mkdir test


            

root@master:~# Hadoop-0.20 fs -ls test


            

root@master:~# Hadoop-0.20 fs -rmr test


            

Deleted hdfs://192.168.108.133:54310/user/root/test


            

root@master:~# Hadoop-0.20 fsck /


            

.Status: HEALTHY


            

Total size:    4 B


            

Total dirs:    6


            

Total files:    1


            

Total blocks (validated):    1 (avg. block size 4 B)


            

Minimally replicated blocks:    1 (100.0 %)


            

Over-replicated blocks:    0 (0.0 %)


            

Under-replicated blocks:    0 (0.0 %)


            

Mis-replicated blocks:        0 (0.0 %)


            

Default replication factor:    2


            

Average block replication:    2.0


            

Corrupt blocks:        0


            

Missing replicas:        0 (0.0 %)


            

Number of data-nodes:        2


            

Number of racks:        1


            

The filesystem under path '/' is HEALTHY


            

root@master:~#


                


执行一个 MapReduce 作业


下一步是执行一个 MapReduce 作业,以验证整个设置运作正常(见清单  13)。该进程的第一步是要引入一些数据。因此,首先创建一个目录来容纳您的输入数据(称为 input),创建方式是使用 Hadoop-0.20  实用程序的 mkdir 命令。然后,使用 Hadoop-0.20 的 put 命令将两个文件放到 HDFS 中。您可以使用 Hadoop  实用程序的 ls 命令检查输入目录的内容。


清单 13. 生成输入数据



    
        
            
        
    


            

root@master:~# Hadoop-0.20 fs


            

-mkdir input


            

root@master:~# Hadoop-0.20 fs -put 


            

/usr/src/linux-source-2.6.27/Doc*/memory-barriers.txt input


            

root@master:~# Hadoop-0.20 fs -put 


            

/usr/src/linux-source-2.6.27/Doc*/rt-mutex-design.txt input


            

root@master:~# Hadoop-0.20 fs -ls input


            

Found 2 items


            

-rw-r--r--  2 root supergroup  78031 2010-05-12 14:16 /user/root/input/memory-barriers.txt


            

-rw-r--r--  2 root supergroup  33567 2010-05-12 14:16 /user/root/input/rt-mutex-design.txt


            

root@master:~#


                


下一步,启动 wordcount MapReduce 作业。与在伪分布式模型中一样,指定输入子目录(包含输入文件)和输出目录(不存在,但会由名称节点创建并用结果数据填充):


清单 14. 在集群上运行 MapReduce wordcount 作业



    
        
            
        
    


            

root@master:~# Hadoop-0.20


            

jar 


            

/usr/lib/Hadoop-0.20/Hadoop-0.20.2+228-examples.jar wordcount input output


            

10/05/12 19:04:37 INFO input.FileInputFormat: Total input paths to process : 2


            

10/05/12 19:04:38 INFO mapred.JobClient: Running job: job_201005121900_0001


            

10/05/12 19:04:39 INFO mapred.JobClient:  map 0% reduce 0%


            

10/05/12 19:04:59 INFO mapred.JobClient:  map 50% reduce 0%


            

10/05/12 19:05:08 INFO mapred.JobClient:  map 100% reduce 16%


            

10/05/12 19:05:17 INFO mapred.JobClient:  map 100% reduce 100%


            

10/05/12 19:05:19 INFO mapred.JobClient: Job complete: job_201005121900_0001


            

10/05/12 19:05:19 INFO mapred.JobClient: Counters: 17


            

10/05/12 19:05:19 INFO mapred.JobClient:   Job Counters


            

10/05/12 19:05:19 INFO mapred.JobClient:     Launched reduce tasks=1


            

10/05/12 19:05:19 INFO mapred.JobClient:     Launched map tasks=2


            

10/05/12 19:05:19 INFO mapred.JobClient:     Data-local map tasks=2


            

10/05/12 19:05:19 INFO mapred.JobClient:   FileSystemCounters


            

10/05/12 19:05:19 INFO mapred.JobClient:     FILE_BYTES_READ=47556


            

10/05/12 19:05:19 INFO mapred.JobClient:     HDFS_BYTES_READ=111598


            

10/05/12 19:05:19 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=95182


            

10/05/12 19:05:19 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=30949


            

10/05/12 19:05:19 INFO mapred.JobClient:   Map-Reduce Framework


            

10/05/12 19:05:19 INFO mapred.JobClient:     Reduce input groups=2974


            

10/05/12 19:05:19 INFO mapred.JobClient:     Combine output records=3381


            

10/05/12 19:05:19 INFO mapred.JobClient:     Map input records=2937


            

10/05/12 19:05:19 INFO mapred.JobClient:     Reduce shuffle bytes=47562


            

10/05/12 19:05:19 INFO mapred.JobClient:     Reduce output records=2974


            

10/05/12 19:05:19 INFO mapred.JobClient:     Spilled Records=6762


            

10/05/12 19:05:19 INFO mapred.JobClient:     Map output bytes=168718


            

10/05/12 19:05:19 INFO mapred.JobClient:     Combine input records=17457


            

10/05/12 19:05:19 INFO mapred.JobClient:     Map output records=17457


            

10/05/12 19:05:19 INFO mapred.JobClient:     Reduce input records=3381


            

root@master:~#


                


最后一步是探索输出数据。由于您运行了 wordcount MapReduce 作业,结果是一个文件(从已处理映射文件缩减而来)。该文件包含一个元组列表,表示输入文件中找到的单词和它们在所有输入文件中出现的次数:


清单 15. 检测 MapReduce 作业的输出



    
        
            
        
    


            

root@master:~# Hadoop-0.20


            

fs -ls output


            

Found 2 items


            

drwxr-xr-x   - root supergroup          0 2010-05-12 19:04 /user/root/output/_logs


            

-rw-r--r--   2 root supergroup      30949 2010-05-12 19:05 /user/root/output/part-r-00000


            

root@master:~# Hadoop-0.20 fs -cat output/part-r-00000 | head -13


            

!=    1


            

"Atomic    2


            

"Cache    2


            

"Control    1


            

"Examples    1


            

"Has    7


            

"Inter-CPU    1


            

"LOAD    1


            

"LOCK"    1


            

"Locking    1


            

"Locks    1


            

"MMIO    1


            

"Pending    5


            

root@master:~#


                


Web 管理界面


尽管 Hadoop-0.20 实用程序的功能极其丰富,但有时使用一个 GUI 会更方便。在执行文件系统检测时,您可以通过  //master:50070 链接到名称节点,通过 //master:50030 连接到 jobtracker  。您可以通过名称节点检测 HDFS,如图 5 所示,在这里您检测输入目录(包含输入数据 — 见上面 清单 13)。



图 5. 通过名称节点检测 HDFS


通过 jobtracker,您可以检测运行中或已完成的作业。在图 6 中,您可以看到对最后一个作业的检测(来自 清单  14)。该图展示了作为 Java  存档(JAR)请求的输出发出的各种数据,以及任务的状态和数量。注意,这里执行了两个映射任务(每个输入文件一个映射)和一个缩减任务(用于缩减两个映 射输入)。



图 6. 检查一个已完成作业的状态


最后,您可以通过名称节点检查数据节点的状态。名称节点主页确定活动节点和死节点(作为链接)的数量,且允许您进一步检测它们。图 7 所示的页面显示了活动数据节点以及每个节点的统计数据。



图 7. 检查活动数据节点的状态


通过名称节点和 jobtracker Web 界面,可以查看许多其他视图,但出于简洁,只显示该样例集。在名称节点和 jobtracker Web 页面内,您会找到大量链接,从而引导您获取有关 Hadoop 配置和操作的其他信息(包括运行时日志)。


更进一步


在本期中,您了解了如何将一个伪分布式配置从 Cloudera 转化为一个完全分布式配置。寥寥无几的步骤以及 MapReduce  应用程序的一个相同接口,就使 Hadoop 成为一个能实现分布式处理的有用工具。另一个有趣的部分就是 Hadoop  的可伸缩性探讨。通过添加新数据节点(并更新其 XML 文件和 master 中的 slave 文件),您可以轻松伸缩 Hadoop  来进行更高级别的平行处理。第 3 部分,也就是本 Hadoop 系列的最后一期,将探讨如何为 Hadoop 开发一个 MapReduce  应用程序。
   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程