更进一步

    技术2024-04-21  129

    与蒂姆联系

    蒂姆是我们最受欢迎和最多产的作家之一。 在developerWorks上浏览Tim的所有文章 。 查看Tim的个人资料,并与他,其他作者以及My developerWorks中的其他读者建立联系。

    Hadoop分布式计算体系结构的真正力量在于其分布。 换句话说,将工作并行分配到许多节点的能力允许Hadoop扩展到大型基础架构,并类似地处理大量数据。 本文从分布式Hadoop架构的分解开始,然后探讨分布式配置和使用。

    分布式Hadoop架构

    回想一下本系列的第1部分 ,所有Hadoop守护程序都在同一主机上运行。 尽管没有利用Hadoop的并行特性,但这种伪分布式配置允许使用简单的方法以最少的设置测试Hadoop的功能。 现在,让我们使用机器集群探索Hadoop的并行特性。

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

    图1. Hadoop主节点和从节点的分解

    如图1所示,主节点由namenode,secondary namenode和jobtracker守护程序(所谓的master守护程序 )组成。 此外,这是您为进行演示(使用Hadoop实用程序和浏览器)从中管理集群的节点。 从节点由任务跟踪器和数据节点(从守护程序)组成。 此设置的区别在于,主节点包含提供Hadoop群集管理和协调的守护程序,从节点包含实现Hadoop文件系统(HDFS)和MapReduce功能(数据处理)存储功能的守护程序。功能)。

    在本演示中,您将创建一个主节点和两个从属节点,它们位于一个LAN上。 此设置如图2所示。现在,让我们探索用于多节点分发的Hadoop安装及其配置。

    图2. Hadoop集群配置

    为了简化部署,您使用虚拟化,它提供了一些优势。 尽管在这种情况下性能可能并不有利,但是使用虚拟化可以创建Hadoop安装,然后将其克隆到其他节点。 因此,您的Hadoop群集应如下所示,在单个主机上的虚拟机管理程序的上下文中将主节点和从节点作为虚拟机(VM)运行。

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

    升级Hadoop

    在第1部分中 ,您为Hadoop安装了一个特殊的发行版,该发行版在单个节点上运行(伪配置)。 在本文中,您将更新为分布式配置。 如果您从此处开始了本系列文章,请通读第1部分,首先安装Hadoop伪配置。

    在伪配置中,您没有执行任何配置,因为所有内容都已针对单个节点进行了预配置。 现在,您需要更新配置。 首先,使用清单1所示的update-alternatives命令检查当前配置。此命令告诉您该配置正在使用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以进行分布式操作

    下一步是使所有节点彼此熟悉。 您可以在名为master和slaves的/etc/hadoop-0.20/conf.dist文件中执行此操作。 本示例中的三个节点是静态分配的IP地址,如下所示(来自/ 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)连接到其他每个节点,以确保无密码ssh正常运行。 您在本系列的第1部分中使用的Hadoop启动和停止实用程序将使用每个文件(主文件,从文件)。

    接下来,继续在/etc/hadoop-0.20/conf.dist子目录中进行特定于Hadoop的配置。 根据Hadoop文档的定义,所有节点(主节点和两个从节点)都需要进行以下更改。 首先,在文件core-site.xml(清单4)中标识HDFS主节点,该文件定义了namenode的主机和端口(注意主节点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可以存在于其自己的节点上,但是对于这种配置,请将其放置在主节点上,如清单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)。 此值定义将创建的副本数,通常不大于三个。 在这种情况下,将其定义为2(数据节点的数量)。 该值在hdfs-site.xml中定义,其中包含HDFS属性。

    清单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实用程序,并指定namenode和操作( -format ):

    清单7.格式化namenode
    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:~#

    格式化您的namenode之后,就该启动Hadoop守护程序了。 您可以执行与第1部分中以前的伪分布式配置相同的操作,但是该过程对于分布式配置可以完成相同的操作。 请注意,此代码将启动namenode和secondary namenode(如jps命令所示):

    清单8.启动namenode
    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检查一个从属节点(数据节点),您将看到每个节点上现在都存在一个datanode守护程序:

    清单9.检查一个从属节点上的datanode
    root@slave1:~# jps 10562 Jps 10451 DataNode root@slave1:~#

    下一步是启动MapReduce守护程序(jobtracker和tasktracker)。 如清单10所示进行操作。 注意,该脚本在主节点(由配置定义;请参见清单5 )上启动jobtracker,并在每个从节点上启动tasktracker。 主节点上的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守护程序已将datanode守护程序加入到每个从属数据节点:

    清单11.检查一个从属节点上的datanode
    root@slave1:~# jps 7785 DataNode 8114 Jps 7991 TaskTracker root@slave1:~#

    启动脚本,节点和启动的守护程序之间的关系如图4所示。您可以看到, start-dfs脚本启动了namenodes和datanodes,其中start-mapred脚本启动了jobtracker和tasktracker。

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

    测试HDFS

    现在,Hadoop已在整个集群中启动并运行,您可以运行一些测试以确保其正常运行(请参见清单12)。 首先,通过hadoop-0.20实用程序发出文件系统命令( fs ),并请求df (无磁盘)操作。 与Linux®一样,此命令仅标识特定设备消耗的空间和可用的空间。 因此,对于新格式化的文件系统,您没有使用空间。 接下来,在HDFS的根目录上执行ls操作,创建一个子目录,列出其内容,然后将其删除。 最后,您可以使用hadoop-0.20实用程序中的fsck命令在HDFS上执行fsck (文件系统检查)。 所有这些都告诉您-连同各种其他信息(例如,检测到2个数据节点)-文件系统运行状况良好。

    清单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作业。 与在伪分布式模型中一样,您可以指定输入子目录(包含输入文件)和输出目录(不存在,但将由namenode创建并填充结果数据):

    清单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更为方便。 您可以通过http:// master:50070附加到namenode进行文件系统检查,并通过http:// master:50030附加到jobtracker。 通过namenode,您可以检查HDFS,如图5所示,在其中检查输入目录(其中包含输入数据,如清单13所示 )。

    图5.通过namenode检查HDFS

    通过Jobtracker,您可以检查正在运行或已完成的作业。 在图6中,您可以看到对上一份工作的检查(来自清单14 )。 该图显示了作为输出输出到Java归档(JAR)请求的各种数据,以及任务的状态和数量。 请注意,这里执行了两个映射任务(每个输入文件一个)和一个缩减任务(减少两个映射输入)。

    图6.检查完成的状态

    最后,您可以通过namenode检查数据节点的状态。 namenode主页识别活动节点和死亡节点的数量(作为链接),并允许您进一步检查它们。 图7中显示的页面显示了实时数据节点以及每个节点的统计信息。

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

    通过namenode和jobtracker Web界面可以有许多其他视图,但是为了简洁起见,显示了此样本集。 在namenode和jobtracker网页中,您会找到许多链接,这些链接将带您到有关Hadoop配置和操作的其他信息(包括运行时日志)。

    更进一步

    在本期中,您已经了解了如何将Cloudera中的伪分布式配置转换为完全分布式配置。 令人惊讶的是,很少的步骤以及用于MapReduce应用程序的相同接口使Hadoop成为用于分布式处理的独特有用的工具。 探索Hadoop的可扩展性也很有趣。 通过添加新的数据节点(以及在主节点中更新其XML文件和从属文件),您可以轻松扩展Hadoop以实现更高级别的并行处理。 第3部分,这是Hadoop系列的最后一部分,将探讨如何为Hadoop开发MapReduce应用程序。


    翻译自: https://www.ibm.com/developerworks/linux/library/l-hadoop-2/index.html

    Processed: 0.103, SQL: 9