本节书摘来异步社区《Hadoop实战手册》一书中的第1章,第1.11节,作者: 【美】Jonathan R. Owens , Jon Lentz , Brian Femiano 译者: 傅杰 , 赵磊 , 卢学裕 责编: 杨海玲

1.11 利用Flume加载数据到HDFS中

Apache Flume是Hadoop社区的一个项目,由多个相关项目组成,用于从不同的数据源可靠有效地加载数据流到HDFS中。Flume最常见的一个场景是加载多个数据源的网站日志数据。本节将介绍如何使用Flume加载数据到HDFS中。

准备工作
在本节中假定你已经安装和配置好Flume。

Flume可以从Apache网页(http://incubator.apache.org/flume/)下载。

如果你使用的是CDH3,那么默认已经安装了Flume 0.9.4+25.43的版本。

操作步骤
完成下面的步骤,实现将weblogs数据导入HDFS。

1.使用dump命令测试Flume是否配置正确:

flume dump 'text("/path/to/weblog_entries.txt")'

2.通过Flume shell执行一个配置:

flume shell -c<MASTER_HOST>:<MASTER_PORT> -e 'exec config text("/path/to/   
weblog_entries.txt") | collectorSink("hdfs://<NAMENODE_HOST>:<NAMENODE_PORT>/   
data/weblogs/flume")'

工作原理
Flume包含Sources8和Sinks9两个抽象概念,并通过管状的数据流将它们合并在一起。在这个例子中,数据来源是text方式,将文件路径作为参数,并将该文件中的内容发送到配置的数据输出端。dump命令使用控制台为数据输出端。按照这样的配置,weblog_entries.txt文件的内容以text的方式被读取,同时被写到控制台。

在步骤2中,使用了Flume shell配置并执行一个作业。-c参数告诉了Flume Master节点的连接地址。Flume将会执行–e参数后面的命令。如前所述,text是一种读取所传文件中所有内容的数据源。collectorSink是一个数据去向,可以传给本地文件系统路径或者HDFS文件系统路径。在前面这个例子中,我们传递的是一个HDFS的路径。这个命令执行的效果会将weblog_entries.txt导入HDFS中。

更多参考
Flume提供了几个预定义的Source和Sink。下面是一些基本的数据源。

  • null:不读取任何数据。
  • stdin:读入一个标准的输入流。
  • rpcSource:读取Thrift或者Avro RPC。
  • text:读取一个文件中的内容。
  • tail:读取一个文件,并保持文件打开状态用于持续读取追加到文件中的数据

下面是一些基本的Sink。

  • null:将数据丢弃,不进行写操作。
  • collectorSink:写到一个本地文件系统或者HDFS上。
  • console:写到控制台。
  • formatDfs:写到HDFS并带一定的格式,如序列化文件、Avro、Thrift等。
  • rpcSink:写给Thrift或者Avro RPC。

1即席查询是用户根据自己的需求,灵活地选择查询条件,系统能够根据用户的选择生成相应的统计报表。

2原文是针对Hadoop 0.20.0 的版本,对目前来说该版本已经很老,Hadoop 1.0 以上的版本put已经可以对文件夹进行复制。
3 Hadoop 0.20.2以上已经支持不同版本间的distcp复制了。——译者注
4“只有map”表示一个作业只启动map阶段没有启动reduce阶段。
5Hadoop ftp文件系统。
6保证MySQL与Hadoop集群中的每个节点间网络是相通的。
7$SQOOP_HOME为SQOOP的安装目录。
8数据来源。
9数据去向。