将时间序列数据写入按月和日分区的hdfs?

时间:2017-04-05 03:10:32

标签: hadoop hdfs

我正在编写一个程序,将kafka的时间序列数据保存到hadoop中。我设计了这样的目录结构:

event_data
|-2016
  |-01
    |-data01
    |-data02
    |-data03
|-2017
  |-01
    |-data01

因为这是一个守护进程任务,我编写一个基于LRU的管理器来管理打开的文件并及时关闭非活动文件以避免资源泄漏,但收入数据流没有按时间排序,这是很常见的打开再次存在文件以附加新数据。

我尝试使用FileSystem#append()方法在文件存在时打开OutputStream,但它在我的hdfs群集上运行错误(抱歉,我不能在这里提供具体的错误,因为它是在几个月前和现在我尝试了另一种解决方案)。

然后我用另一种方法来实现我的目标: 当存在相同的名称文件时,将序列后缀添加到文件名。现在我的hdfs中有很多文件。它看起来很脏。

我的问题是:对于这种情况,最佳做法是什么?

1 个答案:

答案 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; 。你需要做的是:

  • HDFS (WebHDFS) Output Plugin之后配置精通kafka,您将使用您的kafka /主题信息配置HDFS部分
  • 为您的HDFS群集启用inputsource操作,您可以在fluentd kafka plugin
  • 后找到如何操作
  • webhdfs部分配置为将您的数据写入append,插件文档页面上有示例。要按月和日对数据进行分区,可以使用时间片占位符配置match参数,例如:

    HDFS

使用此选项收集数据,然后您可以编写mapreduce作业来执行ETL或任何您喜欢的操作。

我不知道这是否适合您的问题,只需在此提供一个选项。