尽管Hadoop是某些大型搜索引擎的数据精简核心,但最好将其描述为数据分布式处理的框架。 不仅是数据,还有海量数据,这对于搜索引擎及其收集的爬网数据是必需的。 作为一个分布式框架,Hadoop支持许多受益于数据处理并行化的应用程序。
本文并不是为了向您介绍Hadoop及其架构,而是为了演示一个简单的Hadoop设置。 在“ 相关主题”部分中,您可以找到有关Hadoop体系结构,组件和操作原理的更多详细信息。 有了该免责声明之后,让我们直接研究Hadoop的安装和配置。
最初设定
对于此演示,我们将使用Cloudera Hadoop发行版。 您会在此处找到对各种不同Linux®发行版的支持,因此非常适合入门。
本文首先假定您的系统已安装Java™技术(最低版本1.6)和cURL。 如果不是,则需要首先添加它们(有关此安装的更多信息,请参阅“ 参考资料”部分)。
因为我在Ubuntu(Intrepid版本)上运行,所以我使用apt
实用程序来获取Hadoop发行版。 这个过程非常简单,使我无需下载和构建源代码的其他细节即可获取二进制包。 首先,我告诉apt
对Cloudera的网站。 然后,我在/etc/apt/sources.list.d/cloudera.list中创建一个新文件,并添加以下文本:
deb http://archive.cloudera.com/debian intrepid-cdh3 contrib
deb-src http://archive.cloudera.com/debian intrepid-cdh3 contrib
如果你正在运行的Jaunty或其他版本,只需用具体的发布名称替换勇敢的 (目前支持包括哈代,无畏,轻松活泼,业报和莱尼)。
接下来,我从Cloudera获取apt-key来验证下载的软件包:
$ curl -s http://archive.cloudera.com/debian/archive.key | \
sudo apt-key add - sudo apt-get update
然后安装Hadoop以进行伪分布式配置(所有Hadoop守护程序都在单个主机上运行):
$ sudo apt-get install hadoop-0.20-conf-pseudo
$
请注意,此配置约为23MB(不包括可能不存在的任何其他apt
软件包)。 该安装非常适合与Hadoop一起玩并了解其元素和接口。
最后,我设置了无密码短语SSH。 如果您尝试使用ssh localhost
并要求输入密码,则需要执行以下步骤。 我假设这是一个专用的Hadoop盒子,因为此步骤确实会带来一些安全隐患(请参见清单1)。
清单1.设置无密码短语的SSH
$ sudo su -
# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
最后一点是,您需要确保主机具有足够的存储空间供数据节点(缓存)使用。 存储不足会以奇怪的方式表现出来(例如指示无法复制到节点的错误)。
启动Hadoop
现在,您已经准备好启动Hadoop,您可以通过启动每个Hadoop守护程序来有效地做到这一点。 但是首先,使用hadoop
命令格式化Hadoop文件系统(HDFS)。 hadoop
命令有许多用途,我们将在短期内探讨其中一些用途。
首先,请求namenode格式化DFS文件系统。 您可以在安装过程中执行此操作,但是了解是否需要生成干净的文件系统很有用。
# hadoop-0.20 namenode -format
确认请求后,将格式化文件系统并返回一些信息。 接下来,启动Hadoop守护程序。 Hadoop在此伪分布式配置中启动五个守护程序:namenode,secondarynamenode,datanode,jobtracker和tasktracker。 启动每个守护程序后,您将看到为每个守护程序发出的少量文本(标识其日志的存储位置)。 每个守护程序都开始在后台运行(作为守护程序)。 图1说明了启动完成后伪分布式节点的外观。
图1.伪分布式Hadoop配置
![伪分布式Hadoop配置的框图](https://i-blog.csdnimg.cn/blog_migrate/0a9f78474d410ebff9c6278c064223d8.png)
Hadoop提供了一些帮助工具来简化其启动。 这些工具分为start(例如start-dfs
)和stop(例如stop-dfs
)两类。 以下简短脚本说明了如何启动Hadoop节点:
# /usr/lib/hadoop-0.20/bin/start-dfs.sh
# /usr/lib/hadoop-0.20/bin/start-mapred.sh
#
要验证守护程序是否正在运行,可以使用jps
命令(这是JVM进程的ps
实用程序)。 该命令列出了五个守护程序及其进程标识符。
现在,Hadoop守护程序正在运行,让我们回头看看它们,以介绍它们在Hadoop框架中所完成的工作。 namenode是Hadoop中的主服务器,它管理文件系统名称空间以及对集群中存储的文件的访问。 还有一个辅助namenode ,它不是namenode的冗余守护程序,而是提供了定期检查点和内务处理任务。 您会在Hadoop群集中找到一个namenode和一个secondary namenode。
数据管理部管理连接到一个节点,其中,有可能在集群中的多个节点的存储。 每个存储数据的节点都将运行一个datanode守护程序。
最后,每个集群将具有单一的JobTracker,其负责在数据节点调度的工作和数据管理部每一个的TaskTracker执行实际工作。 作业跟踪器和任务跟踪器以主从配置进行工作,其中作业跟踪器跨数据节点分配工作,而任务跟踪器执行任务。 作业跟踪程序还会验证请求的工作,如果数据节点由于某种原因失败,则重新计划上一个任务。
在这种简单的配置中,所有节点仅位于同一节点上(请参见图1 )。 但是从前面的讨论中,很容易看出Hadoop如何提供并行处理工作。 尽管架构很简单,但是Hadoop提供了一种轻松的方式来分发数据,负载平衡以及以容错方式并行处理大量数据。
检查HDFS
您可以执行一些测试以确保Hadoop正常运行(至少是namenode)。 知道所有进程都可用之后,就可以使用hadoop
命令检查本地名称空间(请参见清单2)。
清单2.检查对HDFS的访问
# hadoop-0.20 fs -ls /
Found 2 items
drwxr-xr-x - root supergroup 0 2010-04-29 16:38 /user
drwxr-xr-x - root supergroup 0 2010-04-29 16:28 /var
#
由此可见,名称节点已启动并能够为本地名称空间提供服务。 请注意,您正在使用名为hadoop-0.20
的命令来检查文件系统。 从检查文件系统到在集群中运行作业,此实用程序是您与Hadoop集群进行交互的方式。 请在此处注意命令结构:在指定hadoop-0.20
实用程序后,定义命令(在本例中为通用文件系统shell)和一个或多个选项(在本例中,使用ls
请求文件列表)。 由于hadoop-0.20
是您到Hadoop集群的主要接口之一,因此您会在本文中看到该实用程序已被大量使用。 清单3提供了一些其他文件系统操作,您可以使用它们进一步探索该接口(创建一个名为test的新子目录,列出其内容,然后将其删除)。
清单3.探索Hadoop中的文件系统操作
# hadoop-0.20 fs -mkdir test
# hadoop-0.20 fs -ls test
# hadoop-0.20 fs -rmr test
Deleted hdfs://localhost/user/root/test
#
测试Hadoop
现在您已经安装了Hadoop并测试了其文件系统的基本接口,是时候在实际应用程序中测试Hadoop了。 在此示例中,您将看到一小组数据上的MapReduce流程。 Map和reduce以函数式编程中的函数命名,但提供了数据缩减的核心功能。 映射是指将输入切分成较小的子问题集进行处理的过程(这些子问题分配给并行工作程序)。 精简是指将子问题的答案组合成单个输出。 请注意,这里没有定义处理的含义,因为该框架允许您自己定义。 规范MapReduce是一组文档中单词频率的计算。
根据前面的讨论,您将拥有一组输入和一组结果输出。 第一步是在文件系统中创建一个输入子目录,您将在其中放置工作。 您可以使用以下方法执行此操作:
# hadoop-0.20 fs -mkdir input
接下来,将一些工作放在输入子目录中。 在这种情况下,请使用put
命令,该命令会将文件从本地文件系统移至HDFS(请参见清单4)。 请注意以下格式,该格式将源文件移动到HDFS子目录(输入)。 完成后,您将在HDFS中准备好两个文本文件以进行处理。
清单4.将文件移入HDFS
# hadoop-0.20 fs -put /usr/src/linux-source-2.6.27/Doc*/memory-barriers.txt input
# hadoop-0.20 fs -put /usr/src/linux-source-2.6.27/Doc*/rt-mutex-design.txt input
#
接下来,您可以使用ls
命令检查文件是否存在(请参见清单5)。
清单5.检查HDFS中的文件
# hadoop-0.20 fs -ls input
Found 2 items
-rw-r--r-- 1 root supergroup 78031 2010-04-29 17:35 /user/root/input/memory-barriers.txt
-rw-r--r-- 1 root supergroup 33567 2010-04-29 17:36 /user/root/input/rt-mutex-design.txt
#
在HDFS中安全地工作时,您可以执行MapReduce功能。 该函数需要一个命令但需要一个长请求,如清单6所示。该命令请求执行JAR。 它实际上实现了许多功能,但是本示例着重于wordcount
。 jobtracker守护程序请求datanode执行MapReduce作业,这将导致大量输出(此处较小,因为您仅处理两个文件)。 它显示了map和reduce函数的进度,然后提供了一些有关文件系统和记录处理的I / O的有用统计信息。
清单6.为单词频率(wordcount)执行MapReduce作业
# hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-0.20.2+228-examples.jar \
wordcount input output
10/04/29 17:36:49 INFO input.FileInputFormat: Total input paths to process : 2
10/04/29 17:36:49 INFO mapred.JobClient: Running job: job_201004291628_0009
10/04/29 17:36:50 INFO mapred.JobClient: map 0% reduce 0%
10/04/29 17:37:00 INFO mapred.JobClient: map 100% reduce 0%
10/04/29 17:37:06 INFO mapred.JobClient: map 100% reduce 100%
10/04/29 17:37:08 INFO mapred.JobClient: Job complete: job_201004291628_0009
10/04/29 17:37:08 INFO mapred.JobClient: Counters: 17
10/04/29 17:37:08 INFO mapred.JobClient: Job Counters
10/04/29 17:37:08 INFO mapred.JobClient: Launched reduce tasks=1
10/04/29 17:37:08 INFO mapred.JobClient: Launched map tasks=2
10/04/29 17:37:08 INFO mapred.JobClient: Data-local map tasks=2
10/04/29 17:37:08 INFO mapred.JobClient: FileSystemCounters
10/04/29 17:37:08 INFO mapred.JobClient: FILE_BYTES_READ=47556
10/04/29 17:37:08 INFO mapred.JobClient: HDFS_BYTES_READ=111598
10/04/29 17:37:08 INFO mapred.JobClient: FILE_BYTES_WRITTEN=95182
10/04/29 17:37:08 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=30949
10/04/29 17:37:08 INFO mapred.JobClient: Map-Reduce Framework
10/04/29 17:37:08 INFO mapred.JobClient: Reduce input groups=2974
10/04/29 17:37:08 INFO mapred.JobClient: Combine output records=3381
10/04/29 17:37:08 INFO mapred.JobClient: Map input records=2937
10/04/29 17:37:08 INFO mapred.JobClient: Reduce shuffle bytes=47562
10/04/29 17:37:08 INFO mapred.JobClient: Reduce output records=2974
10/04/29 17:37:08 INFO mapred.JobClient: Spilled Records=6762
10/04/29 17:37:08 INFO mapred.JobClient: Map output bytes=168718
10/04/29 17:37:08 INFO mapred.JobClient: Combine input records=17457
10/04/29 17:37:08 INFO mapred.JobClient: Map output records=17457
10/04/29 17:37:08 INFO mapred.JobClient: Reduce input records=3381
处理完成后,检查结果。 回想一下,工作的重点是计算单词在输入文件中出现的次数。 此输出作为元组文件发出,表示该单词及其在输入中出现的次数。 您可以通过hadoop-0.20
实用程序使用cat
命令(找到特定的输出文件之后)来发出此数据(请参见清单7)。
清单7.查看MapReduce wordcount操作的输出
# hadoop-0.20 fs -ls /user/root/output
Found 2 items
drwxr-xr-x - root supergroup 0 2010-04-29 17:36 /user/root/output/_logs
-rw-r--r-- 1 root supergroup 30949 2010-04-29 17:37 /user/root/output/part-r-00000
#
# 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
#
您还可以使用hadoop-0.20
实用程序从HDFS中提取文件(请参见清单8)。 您可以使用get
实用程序轻松地做到这一点(类似于您之前执行的将文件写入HDFS的put
)。 对于get
操作,在HDFS中指定要提取的文件(从输出子目录中提取),并在本地文件系统中写入文件名(output.txt)。
清单8.从HDFS提取输出
# hadoop-0.20 fs -get output/part-r-00000 output.txt
# cat output.txt | head -5
!= 1
"Atomic 2
"Cache 2
"Control 1
"Examples 1
#
让我们来看另一个使用相同JAR但使用不同的示例(在这里,您将探索并行grep
)。 对于此测试,请使用现有的输入文件,但删除输出子目录以为此测试重新创建它:
# hadoop-0.20 fs -rmr output
Deleted hdfs://localhost/user/root/output
接下来,为grep
请求MapReduce作业。 在这种情况下,并行执行grep
(映射),然后将grep
结果合并(reduce)。 清单9提供了该使用模型的输出(但在这种情况下,为简洁起见,其中一些输出已被修剪)。 请注意这里的命令请求,其中您的请求是一个grep
它从名为input的子目录中获取输入 ,并将结果放入名为output的子目录中。 最后一个参数是您要搜索的字符串(在本例中为'kernel'
)。
清单9.执行MapReduce作业以获取单词搜索计数(grep)
# hadoop-0.20 jar /usr/lib/hadoop/hadoop-0.20.2+228-examples.jar \
grep input output 'kernel'
10/04/30 09:22:29 INFO mapred.FileInputFormat: Total input paths to process : 2
10/04/30 09:22:30 INFO mapred.JobClient: Running job: job_201004291628_0010
10/04/30 09:22:31 INFO mapred.JobClient: map 0% reduce 0%
10/04/30 09:22:42 INFO mapred.JobClient: map 66% reduce 0%
10/04/30 09:22:45 INFO mapred.JobClient: map 100% reduce 0%
10/04/30 09:22:54 INFO mapred.JobClient: map 100% reduce 100%
10/04/30 09:22:56 INFO mapred.JobClient: Job complete: job_201004291628_0010
10/04/30 09:22:56 INFO mapred.JobClient: Counters: 18
10/04/30 09:22:56 INFO mapred.JobClient: Job Counters
10/04/30 09:22:56 INFO mapred.JobClient: Launched reduce tasks=1
10/04/30 09:22:56 INFO mapred.JobClient: Launched map tasks=3
10/04/30 09:22:56 INFO mapred.JobClient: Data-local map tasks=3
10/04/30 09:22:56 INFO mapred.JobClient: FileSystemCounters
10/04/30 09:22:56 INFO mapred.JobClient: FILE_BYTES_READ=57
10/04/30 09:22:56 INFO mapred.JobClient: HDFS_BYTES_READ=113144
10/04/30 09:22:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=222
10/04/30 09:22:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=109
...
10/04/30 09:23:14 INFO mapred.JobClient: Map output bytes=15
10/04/30 09:23:14 INFO mapred.JobClient: Map input bytes=23
10/04/30 09:23:14 INFO mapred.JobClient: Combine input records=0
10/04/30 09:23:14 INFO mapred.JobClient: Map output records=1
10/04/30 09:23:14 INFO mapred.JobClient: Reduce input records=1
#
完成作业后,检查输出目录(以标识结果文件),然后执行文件系统cat
操作以查看其内容(请参见清单10)。
清单10.检查MapReduce作业的输出
# hadoop-0.20 fs -ls output
Found 2 items
drwxr-xr-x - root supergroup 0 2010-04-30 09:22 /user/root/output/_logs
-rw-r--r-- 1 root supergroup 10 2010-04-30 09:23 /user/root/output/part-00000
# hadoop-0.20 fs -cat output/part-00000
17 kernel
#
基于Web的界面
您已经了解了如何检查HDFS,但是,如果要查找有关Hadoop操作的信息,则会发现Web界面很有用。 回想一下,Hadoop群集的顶部是namenode,它管理HDFS。 您可以通过http:// localhost:50070探索文件系统的高级详细信息(例如可用空间和已用空间以及可用的数据节点)以及正在运行的作业。 您可以通过http:// localhost:50030深入研究jobtracker(职位状态)。 请注意,在这两种情况下,您都引用localhost,因为所有守护程序都在同一主机上运行。
走得更远
本文探讨了简单(伪分布式)Hadoop集群的安装和初始配置(在这种情况下,使用Cloudera的Hadoop发行版)。 我选择此特定发行版是因为它简化了Hadoop的安装和初始配置。 您可以在apache.org上找到许多Hadoop发行版(包括源代码)。 有关更多信息,请参见“ 相关主题”部分。
但是,如果您缺乏硬件资源来满足特定需求来扩展Hadoop集群,该怎么办? 事实证明,Hadoop非常流行,您可以使用预先构建的Hadoop VM和租用服务器在云计算基础架构中轻松运行它。 Amazon在Amazon Elastic Compute Cloud(Amazon EC2)内提供Amazon Machine Images(AMI)以及计算资源。 此外,微软最近宣布即将在其Windows®Azure服务平台中为Hadoop提供支持。
从本文很容易看出Hadoop如何使分布式计算更易于处理大型数据集。 本系列的下一篇文章将通过其他示例探讨如何在多节点集群中配置Hadoop。 回头见!
翻译自: https://www.ibm.com/developerworks/linux/library/l-hadoop-1/index.html