我正在编写一个程序,将kafka
的时间序列数据保存到hadoop中。我设计了这样的目录结构:
event_data
|-2016
|-01
|-data01
|-data02
|-data03
|-2017
|-01
|-data01
因为这是一个守护进程任务,我编写一个基于LRU的管理器来管理打开的文件并及时关闭非活动文件以避免资源泄漏,但收入数据流没有按时间排序,这是很常见的打开再次存在文件以附加新数据。
我尝试使用FileSystem#append()
方法在文件存在时打开OutputStream
,但它在我的hdfs群集上运行错误(抱歉,我不能在这里提供具体的错误,因为它是在几个月前和现在我尝试了另一种解决方案)。
然后我用另一种方法来实现我的目标: 当存在相同的名称文件时,将序列后缀添加到文件名。现在我的hdfs中有很多文件。它看起来很脏。
我的问题是:对于这种情况,最佳做法是什么?
答案 0 :(得分:0)
很抱歉,这不是您的编程问题的直接答案,但是如果您对所有选项持开放而不是自己实施,我想与您分享我们使用fluentd的经验,并且{ {3}}
Fluentd是一个开源的,可插拔的数据收集器,您可以通过它轻松构建数据管道,它将从输入读取数据,处理它然后将其写入指定的输出,在您的方案中,输入为{ {1}}输出为SELECT
`main_table`.`entity_id`,
`main_table`.`name`,
`main_table`.`path`,
`main_table`.`is_active`,
`main_table`.`is_anchor`,
`url_rewrite`.`request_path`
FROM
`catalog_category_flat_store_1` AS `main_table`
LEFT JOIN
`core_url_rewrite` AS `url_rewrite` ON
`url_rewrite`.`category_id` = `main_table`.`entity_id` AND
`url_rewrite`.`is_system` = 1 AND
`url_rewrite`.`store_id` = 1 AND
`url_rewrite`.`id_path` LIKE 'category/%'
WHERE
(`main_table`.`include_in_menu` = '1') AND
(`main_table`.`is_active` = '1') AND
(`main_table`.`path` like '1/2/%')
ORDER BY
`main_table`.`position` ASC;
。你需要做的是:
kafka
,您将使用您的kafka /主题信息配置HDFS
部分input
和source
操作,您可以在fluentd kafka plugin 将webhdfs
部分配置为将您的数据写入append
,插件文档页面上有示例。要按月和日对数据进行分区,可以使用时间片占位符配置match
参数,例如:
HDFS
使用此选项收集数据,然后您可以编写mapreduce作业来执行ETL或任何您喜欢的操作。
我不知道这是否适合您的问题,只需在此提供一个选项。