2013-07-29 74 views
0

我想频繁地将文件从文件服务器加载到HDFS。较小的文件(2 MB到20 MB)经常加载到文件服务器。这些文件必须加载到HDFS进行MR处理。 在将这些文件提供给Map-Reduce作业之前,我发现有两个问题。Flume - 将文件从文件服务器加载到HDFS

  1. 如果这些文件在运行MR作业的时间挑选并加载到HDFS,则需要很长的这些加载到HDFS本身。

  2. 这些较小的文件必须合并MR作业。

问题

  1. 可水槽用来读取更频繁的文件服务器,这些较小的文件,并存储在HDFS?

  2. 我知道有CombineFileInputFormat和SequenceFiles来组合这些文件进行处理,但是这些小文件可以连在它存储在HDFS之前吗?

回答

1

问题的可能答案。

这是一段时间以来,我使用了水槽。仍然希望他们帮助。

  1. 可水槽用来读取更频繁的文件服务器,这些较小的文件,并存储在HDFS?

由于数据源是可定制的,水槽可用于传输事件的数据包括大量的数量,但不限于网络流量数据,社交媒体产生的数据,电子邮件和几乎任何数据源可能。

注意:Flume不支持tail作为源。可以将tail命令包装在一个可执行源中以流式传输该文件。

对于尾矿库文件,您可以check this out

目录为多个文件源的实现可以tracked here

你可以阅读有关HDFS sink here,可以写信给HDFS

。我知道有CombineFileInputFormat和SequenceFiles 将这些文件合并处理,但是这些较小的文件是否可以在存储在HDFS中之前连接成 ?

Flume基本上在Event机制上工作。可以根据所用时间或数据大小或事件数量定期滚动文件(关闭当前文件并创建一个新文件)。检查HDFS接收器的相同链接。

如果文件数量很大,可以使用CombineFileINputFormat。在写入HDFS之前,我不知道如何做到这一点。

注:

正如我已经说过水槽工作在基于事件的机制,据我知道这不是传输文件。如果你看看这个interface for Event,你会注意到下面的方法

byte[] getBody():返回此事件中包含的数据的原始字节数组。

void setBody(byte[] body):设置此事件中包含的数据的原始字节数组。

因此,一个事件的最大大小是byte []可以采用的大小。我不知道你的文件可以放在那里。你必须自己测试它。此外,还有其他的条件,我现在不记得,可能会阻碍你将文件传输到HDFS。

+0

谢谢JtheRocker。实际上,我没有对文件服务器目录的任何控制,并且文件中不需要尾部。我需要flume在网络位置将文件传输到HDFS,并在到达时或间隔时传输。这些文件的平均速度可能是每小时1000个文件,最高文件可能达到3000个。 – learninghuman

+0

@ManikandanKannan:请检查 - 我已经更新了答案。 –

+0

谢谢。如果不是flume,还有其他方式将数据摄入HDFS吗?一种选择是将文件加载到hadoop namenode的本地文件系统中,然后使用HDFS put命令加载到HDFS中。 – learninghuman

相关问题