将数据存储在hdfs而不是消息队列中

时间:2015-07-06 02:43:26

标签: hadoop mapreduce hdfs

我正在尝试更改在应用程序中处理的方法数据。首先从数据库接收数据并将其存储在消息队列中。我希望数据直接放在hdfs中。我不希望数据写入文件并移动到hdfs。从HDFS我将处理数据并将结果放入hdfs。我可以从Java程序中将数据写入HDFS吗?而不是给hdfs提供copy命令?

2 个答案:

答案 0 :(得分:0)

为什么你的方法不可行,有几个原因。

  1. 将每条消息写入hdfs将是一项代价高昂的操作。

  2. 您无法直接向hdfs写入消息,必须先将其写入文件,然后将其放入hdfs。

  3. 方法2,会在hdfs中生成大量小型文件,增加了名称节点的负担,以跟踪该文件的每个块。

  4. 我建议,设置一个消息队列的阈值,一旦达到该阈值,将所有消息移动到文件然后移动到hdfs。

答案 1 :(得分:0)

根据您当前的设置,您有几个选项。

  1. Sqoop - http://sqoop.apache.org/ - 专为结构化数据存储(关系数据库)和HDFS之间的批量传输而设计。在不了解您的设置的情况下,这可能适用于您,也可能不适合您。
  2. Apache Spark - https://spark.apache.org/ - 可以从各种来源读取,包括ZeroMQ,Kafka,HDFS等。它还支持自定义输入(源)。您也许可以从队列中以流方式处理所需的数据,并直接输出到HDFS。同样,这取决于您的设置。
  3. Apache Kafka / MapReduce - http://kafka.apache.org/ - 这可能不是一个选项,但使用Apache Kafka作为你的“队列”将允许你对它运行MapReduce,直接输出到HDFS。
  4. WebHDFS / HTTPfs - https://hadoop.apache.org/docs/r1.0.4/webhdfs.html - HDFS的REST接口。您可以将从数据库中提取的任何内容与POST数据直接组合到HDFS。这确实有一些警告,我不建议不小心。
  5. 选项2和3似乎不是您正在寻找的,但可能是妥协。