Apache flink Flink batch:HDFS上的数据本地规划?

Apache flink Flink batch:HDFS上的数据本地规划?,apache-flink,Apache Flink,我们一直在和弗林克玩。到目前为止,我们一直在Hadoop2.x/Thread上使用Spark和标准M/R 除了纱线上的Flink执行模型外,AFAIK不像spark那样是动态的,执行器会动态地获取和释放纱线中的虚拟芯,问题的要点如下 Flink看起来很神奇:对于流式API的,我只能说它非常出色,而且非常出色 批处理API:处理图功能强大,以独特的方式优化并并行运行,比Spark和其他产品更能利用集群的可扩展性,完美地优化共享公共处理步骤的非常复杂的DAG 我发现的唯一缺点,我希望是我的误解和缺乏

我们一直在和弗林克玩。到目前为止,我们一直在Hadoop2.x/Thread上使用Spark和标准M/R

除了纱线上的Flink执行模型外,AFAIK不像spark那样是动态的,执行器会动态地获取和释放纱线中的虚拟芯,问题的要点如下

Flink看起来很神奇:对于流式API的,我只能说它非常出色,而且非常出色

批处理API:处理图功能强大,以独特的方式优化并并行运行,比Spark和其他产品更能利用集群的可扩展性,完美地优化共享公共处理步骤的非常复杂的DAG

我发现的唯一缺点,我希望是我的误解和缺乏知识,就是在规划使用HDFS输入的批处理作业时,它似乎不喜欢数据本地处理

不幸的是,这并不是一个小问题,因为在90%的使用案例中,您在HDFS上有一个大数据分区存储,通常您会执行以下操作:

  • 读取并筛选(例如,仅接受失败或成功)
  • 聚合、减少、使用它
第一部分在简单的M/R或spark中完成时,始终使用“首选本地处理”的习惯用法进行规划,以便数据由保持数据块更快的同一节点处理,以避免通过网络传输数据

在我们对3个节点组成的集群进行的测试中,为了专门测试此功能和行为,Flink似乎能够完美地处理HDFS块,因此,例如,如果文件由3个块组成,Flink能够完美地处理3个输入拆分并并行调度它们。 但是没有数据局部性模式

请分享你的意见,我希望我只是错过了一些东西,或者可能它已经在一个新的版本。
提前感谢所有花时间回答这个问题的人。

Flink使用不同于Hadoop和Spark的本地输入分割处理方法。Hadoop为每个输入拆分创建一个映射任务,该任务最好调度到承载拆分所引用数据的节点

相比之下,Flink使用固定数量的数据源任务,即数据源任务的数量取决于操作员配置的并行性,而不是输入拆分的数量。这些数据源任务在群集中的某个节点上启动,并开始从主节点(JobManager)请求输入拆分。如果HDFS中的文件存在输入拆分,JobManager会使用Location首选项分配输入拆分。因此,可以从HDFS中进行位置感知读取。但是,如果并行任务的数量远低于HDFS节点的数量,则许多拆分将被远程读取,因为源任务保留在启动它们的节点上,并依次获取一个拆分(先本地拆分,后远程拆分)。此外,如果您的拆分非常小,可能会发生争用情况,因为第一个数据源任务可能会在其他源任务执行其第一个请求之前快速请求并处理所有拆分


IIRC,本地和远程输入拆分分配的数量会写入JobManager日志文件,也可能会显示在web仪表板中。这可能有助于进一步调试该问题。如果您发现了一个与我上面解释的不匹配的问题,如果您可以通过用户邮件列表与Flink社区联系,找出问题所在,那就太好了。

感谢Fabian提供了非常详细的答案!期待着在我们的大数据分析工作中越来越多地利用它,而不仅仅是像前面所说的那样在流媒体上,它只是规则!