从单个大型文件的行创建Kafka事件流

时间:2019-01-24 03:29:47

标签: apache-kafka spark-streaming

在DNA信息学中,文件很大(每个文件300GB,生物库有数十万个文件),它们需要经过6条左右的漫长的下游管道(几小时到几周)。因为我不在制造测序仪的公司工作,所以我无法访问正在生成的数据...也无法编写汇编语言。

我想做的就是将300GB文件中的文本行转换为流事件。然后将这些消息通过6个管道传递,Kafka代理将在每个管道之间切换到SparkStreaming。

这可能吗?这是错误的用例吗?相对于整个失败的批次,重新运行单个事件会很好。

Desired Workflow:
------pipe1------
_------pipe2------
__------pipe3------
___------pipe4------


Current Workflow:
------pipe1------
_________________------pipe2------
__________________________________------pipe3------
___________________________________________________------pipe4------

1 个答案:

答案 0 :(得分:2)

Kafka并不用于发送文件,仅用于较小的事件。即使确实逐行发送文件,您也需要知道如何将文件放回一起进行处理,因此,您实际上在做与通过原始TCP套接字流式传输文件相同的操作。

Kafka的默认消息队列最大为1MB,虽然您可以增加它的大小,但我不建议将其增加到两位数的MB大小。

How can I send large messages with Kafka (over 15MB)?

如果您确实需要通过Kafka获取类似的数据,建议的模式是将大文件放在外部存储设备(HDFS,S3等)中,然后将URI放入Kafka事件中的文件中,消费者负责读取该数据源。

如果文件具有任何结构(例如页面),则可以使用Spark和自定义Hadoop InputFormat序列化文件,并以这种方式并行处理数据。不过,不一定必须通过Kafka。您可以尝试Apache NiFi,我听说它可以更好地处理较大的文件(不过可能不是GB)。