用Hadoop收集数据(HDFS)
本文解释了如何使用Fluentd的WebHDFS输出插件将半结构化日志聚合到Hadoop HDFS中。
背景
Fluent是一个高级的开源日志收集器,最初是由Treasure Data公司开发的。Fluent是专门为解决大数据日志收集问题而设计的。许多用户正在使用Fluentd和MongoDB,并发现它目前无法很好地扩展。 HDFS (Hadoop)是存储和处理大量数据的自然选择。除了Java库之外,它还支持一个名为WebHDFS的HTTP接口。 本文将向您展示如何使用Fluentd从HTTP接收数据并将其流式传输到HDFS。
架构
下图展示了高层架构:
安装
为简单起见,本文将描述如何设置单节点配置。请在同一节点上安装以下软件:
-
Fluentd
-
webhdfs输出插件 (out_webhdfs)
-
Apache HDFS
WebHDFS 插件包含在Fluentd的deb/rpm包的最新版本(1.1.10或更高版本)中。如果你想用RubyGems安装插件,请用
gem install fluent-plugin-webhdfs
Fluentd配置
让我们开始配置Fluentd。如果您使用deb/rpm包,Fluentd的配置文件位于
/etc/td-agent/td-agent.conf
否则,配置文件位于:
/etc/fluentd/fluentd.conf
HTTP输入
对于输入源,我们将设置Fluentd接受来自HTTP的记录。Fluentd配置文件应该如下所示:
<source>
@type http
port 8888
</source>
WebHDFS输出
输出目的地将是WebHDFS。输出配置应该如下所示:
<match hdfs.*.*>
@type webhdfs
host namenode.your.cluster.local
port 50070
path "/log/%Y%m%d_%H/access.log.#{Socket.gethostname}"
<buffer>
flush_interval 10s
</buffer>
</match>
<match>
部分指定了用于查找匹配标签的正则表达式。如果日志中的标签匹配,则使用相应的匹配配置(即相应地路由日志)。
flush_interval
参数指定数据写入HDFS的频率。追加操作用于将传入数据追加到path
参数指定的文件中。 时间和主机名的占位符可以与path
参数一起使用。这可以防止多个Fluentd实例将数据追加到同一个文件中,而追加操作必须避免这种情况。
其他选项指定HDFS的NameNode 的主机和端口。
HDFS配置
默认情况下不启用追加操作。请将这些配置放入您的hdfs-site.xml
文件,然后重新启动整个群集:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>dfs.support.broken.append</name>
<value>true</value>
</property>
请确认HDFS用户对指定为网络文件系统输出的路径具有写权限。
测试
为了测试配置,只需将JSON发布到Fluentd(我们在这个例子中使用了curl命令)。发送USR1信号会将Fluentd的缓冲区刷新到WebHDFS中
$ curl -X POST -d 'json={"action":"login","user":2}' \
http://localhost:8888/hdfs.access.test
$ kill -USR1 `cat /var/run/td-agent/td-agent.pid`
然后我们可以访问HDFS查看存储的数据:
$ sudo -u hdfs hadoop fs -lsr /log/
drwxr-xr-x - 1 supergroup 0 2012-10-22 09:40 /log/20121022_14/access.log.dev
总结
与WebHDFS的融合使实时日志收集简单、健壮且可扩展!@tagomoris已经使用这个插件收集了20,000 msgs/sec,1.5 TB/天,几个月来没有出现任何大问题。