读书人

用 Hadoop 开展分布式数据处理(入门)

发布时间: 2012-07-24 17:47:57 作者: rapoo

用 Hadoop 进行分布式数据处理(入门)
deb http://archive.cloudera.com/debian intrepid-cdh3 contrib

deb-src http://archive.cloudera.com/debian intrepid-cdh3 contrib

如果您运行 Jaunty 或其他版本,只需把 intrepid 替换为您的版本名(当前支持 Hardy、Intrepid、Jaunty、Karmic 和 Lenny)。

接下来,从 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

最后,需要确保主机上有供 datanode使用的足够存储空间(缓存)。存储空间不足会导致系统表现异常(比如出现无法把数据复制到节点的错误)。

启动?Hadoop

现在可以启动?Hadoop?了,这实际上要启动每个?Hadoop?守护进程。但是,首先使用?Hadoop?命令对Hadoop?File System (HDFS) 进行格式化。Hadoop?命令有许多用途,稍后讨论其中一部分。

首先,请求 namenode 对 DFS 文件系统进行格式化。在安装过程中完成了这个步骤,但是了解是否需要生成干净的文件系统是有用的。

#?Hadoop-0.20 namenode -format

在确认请求之后,文件系统进行格式化并返回一些信息。接下来,启动?Hadoop?守护进程。Hadoop?在这个伪分布式配置中启动 5 个守护进程:namenode、secondarynamenode、datanode、jobtracker 和 tasktracker。在启动每个守护进程时,会看到一些相关信息(指出存储日志的位置)。每个守护进程都在后台运行。图 1 说明完成启动之后伪分布式配置的架构。

用 Hadoop 开展分布式数据处理(入门)

"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 子目录)和在本地文件系统中要写的文件 (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)。对于这个测试,仍然使用现有的输入文件,但是要删除 output 子目录以便在测试时重新创建它:

#?Hadoop-0.20 fs -rmr output

Deleted hdfs://localhost/user/root/output

接下来,请求用于执行 grep 的 MapReduce 作业。在这种情况下,并行执行 grep(映射),然后组合 grep 的结果(缩减)。清单 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

#

作业完成之后,检查 output 目录,找到结果文件,然后通过执行文件系统 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 查看文件系统的高层信息(比如可用空间、已用空间和可用的 datanode)以及正在运行的作业。可以通过 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 Image (AMI) 和计算资源。另外,Microsoft 最近宣布将在它的 Windows? Azure Services Platform 中支持?Hadoop

更多信息请查看?java进阶网?http://www.javady.com

读书人网 >开源软件

热点推荐