Accumulo高速摄取选项

时间:2014-02-11 22:52:30

标签: performance hadoop accumulo

简而言之,我的客户希望将一系列ASCII文本文件(a.k.a和#34;输入文件")中包含的数据包含在Accumulo中。

这些文件从不同的数据馈送设备输出,并将在非Hadoop /非Accumulo节点(a.k.a和#34;馈送节点")上连续生成。预计所有Feed的总体数据吞吐率非常高。

为简单起见,假设所有数据都将在Accumulo中的一个正向索引表和一个反向[反向]索引表中结束。

我已经使用pyaccumulo编写了一个Accumulo客户端模块,可以通过Thrift Proxy建立与Accumulo的连接,从本地文件系统(而不是HDFS)读取和解析输入文件,创建适当的正向和反向索引代码中的突变,并使用BatchWriter将突变写入正向和反向索引表。到现在为止还挺好。但还有更多。

从各种渠道来看,我已经了解至少有一些标准方法可以应用于我的场景中的Accumulo高速摄取,并且我要求就哪些选项最有效提出一些建议在资源使用方面的意义,以及易于实施和保养。以下是一些选项:

  1. Feed节点上的BatchWriter客户端:在Feed节点上运行我的Accumulo客户端。该选项具有在网络上发送正向和反向索引突变的缺点。此外,需要在feed节点上提供Accumulo / Thrift库以支持Accumulo客户端。但是,此选项的优势在于它可以并行化解析输入文件和创建突变的工作,并且与以下选项相比,似乎可以最大限度地减少Hadoop集群上的磁盘I / O.
  2. Accumulo主节点上的BatchWriter客户端:scp / sftp从feed节点到Accumulo主节点的输入文件,进入本地文件系统的某个目录。然后仅在Accumulo主节点上运行我的Accumulo客户端。该选项的优点是它不会在网络中从馈送节点向Accumulo主节点发送正向和反向索引突变,并且它不需要Accumulo / Thrift库可用于馈送节点。但是,它的缺点是它使得Accumulo主节点完成解析输入文件和创建突变的所有工作,并且它使用Accumulo master的本地磁盘作为输入文件的路径点。
  3. 使用AccumuloOutputFormat的MapReduce:scp / sftp从feed节点到Accumulo主节点的输入文件。然后定期将它们复制到HDFS并运行MapReduce作业,该作业从HDFS读取和解析输入文件,创建突变,并使用AccumuloOutputFormat编写它们。此选项具有上述#2的优点,另外它还可以并行化解析输入文件和创建突变的工作。但是,它的缺点是它会不断地启动并分解MapReduce作业,并调用这些进程所涉及的所有开销。它还有一个缺点,即它使用两个磁盘路点(本地和HDFS)和相关的磁盘I / O.实施和维护连续摄取听起来有些痛苦。
  4. MapReduce with AccumuloOutput * File * Format(rfiles):scp / sftp从feed节点到Accumulo主节点的输入文件。然后定期将它们复制到HDFS并运行MapReduce作业,该作业从HDFS读取和解析输入文件,创建突变,并使用AccumuloOutputFileFormat编写rfiles。然后使用Accumulo shell来“摄取”#34; rfiles。此选项具有上述#3的所有优点,但我不知道它是否具有其他优势(是吗?Accumulo手册说明了批量摄取:"在某些情况下,加载数据可能更快)这种方式而不是通过使用BatchWriters通过客户端摄取。"什么情况?)。它还具有上述#3的所有缺点,除了它使用三个磁盘路点(本地,HDFSx2)和相关的磁盘I / O.实施和维护连续摄取听起来很痛苦。
  5. 就个人而言,我最喜欢选项#2,只要Accumulo主节点可以处理自己涉及的处理负载(非并行输入文件解析)。 #2的变体,我可以在每个Accumulo节点上运行我的Accumulo客户端,并将不同的feed节点的输出发送到不同的Accumulo节点或循环,仍然具有在云端发送正向和反向索引突变的缺点网络到Accumulo master,但确实具有更多并行执行输入文件解析的优势。

    我需要知道的是:我错过了任何可行的选择吗?我错过了每个选项的优点/缺点吗?无论我的问题背景如何,特别是网络带宽/ CPU周期/磁盘I / O权衡,是否有任何优点/缺点是微不足道或非常重要的?与BatchWriter相比,使用或不使用rfiles的MapReduce值得麻烦吗?有没有人有#34;战争故事"?

    谢谢!

1 个答案:

答案 0 :(得分:1)

即使对于每个用例,人们都会对如何为特定用例实施解决方案有个人偏好。我实际上会在feed节点上运行flume代理并在HDFS中收集数据,并定期对使用RFile方法到达HDFS的新数据运行MapReduce。