我正在开发一个带有kafka和spark的集成渠道,它将处理批次和流式传输。
对于批处理,我输入了巨大的CSV文件(4 GB)。
我正在考虑两种解决方案:
您认为最佳解决方案是什么?
由于
答案 0 :(得分:0)
如果您正在编写代码以将文件放在文件系统上,则可以使用相同的代码将Spark作业提交给作业跟踪器。作业跟踪器成为任务队列,并将提交的文件作为Spark作业处理。
这是实现#1的一种更简单的方式,但它有缺点。主要缺点是您必须调整资源分配以确保在数据集非常大的情况下不要分配案例。如果您为作业重新分配资源,那么在任务等待资源时,您的任务队列可能会增长。优点是没有很多移动部件需要维护和排除故障。
使用nifi剪切大文件并使用火花处理片段作为流可能会更容易更有效地利用群集资源。如果您的群集在此数据摄取之上为随机作业提供服务,那么这可能是更好的方法。这里的缺点可能是你需要做一些额外的工作来处理一个事务上下文中单个文件的所有部分,你可能需要做一些额外的事情来确保你不会丢失所传递的数据。卡夫卡等。
如果这是批处理操作,方法2可能会被视为过度杀伤。对于读取CSV文件,设置似乎相当复杂,即使它是一个可能非常大的文件。如果您对CSV文件的速度有问题,那么CSV的一些不断变化的来源,或者NiFi的高错误率将会很有意义。
很难提出最佳解决方案。如果是我,我会先从#1的变化开始,让它先发挥作用。然后,通过引入更多系统部件,使其更好地工作,具体取决于您的方法在处理输入文件中的异常时以可接受的准确度执行的方式。您可能会发现,最大的问题是在大规模摄取过程中尝试识别输入文件中的错误。