在 YARN 上使用 Ignite 确保本地缓存
Posted
技术标签:
【中文标题】在 YARN 上使用 Ignite 确保本地缓存【英文标题】:Ensuring local caching with Ignite on YARN 【发布时间】:2016-02-08 15:45:08 【问题描述】:我有一个用 Flink 编写的流处理应用程序,我想使用来自状态后端的内部键值存储来计算流聚合。因为我要处理大量的聚合,所以我想避免像当前提供的内存支持和文件支持的实现那样在 Flink 应用程序中在堆上维护它们。相反,我想在 Apache Ignite 中维护状态缓存,这反过来可以使用直写和直读功能在 HBase 中提供更可靠的备份。
理想情况下,我会在每个物理节点上都有一个本地 Ignite 缓存,用于处理该节点上所有长时间运行的 Flink 操作符的状态。例如。每个节点在可用的 8 GB 容器中都有一个 Ignite 节点,无论它运行的是 1 个还是 10 个 Flink 操作符。
问题是我希望 Flink 和 Ignite 都在 YARN 上运行。通过一致性分区,我可以确保一般的数据被发送到正确的缓存中,并且在出现故障等情况下,可以从 HBase 重新填充。我面临的问题是 Ignite 似乎随机从 YARN 请求容器,这意味着我不能保证实际上有可用的本地缓存,即使我将 Ignite 节点的数量设置为与物理节点的数量完全相同节点。
关于如何为每个物理节点设置一个 Ignite 节点有什么建议吗?
【问题讨论】:
只是出于好奇:您是否已经为 Ignite 实现了状态后端? 还没有。 Flink 中的快照逻辑和 Ignite 中的直写之间有些不匹配。直写使快照成为无操作,因为所有内容都会立即自动同步,但这会打破恰好一次语义的障碍逻辑。另一方面,Ignite 中的 write-behind 也没有为我提供对刷新过程的足够控制来进行正确的快照。 为什么不能使用单个分区的 Ignite 缓存来代替?它应该简化您的实现,因为 Ignite 会注意在哪里放置和从哪里获取数据。如果任何节点离开,您不会丢失任何数据,以防缓存有备份,因为所有数据都会自动为您重新平衡。 因为我想在每个节点上本地访问数据,而 Ignite 的分区将数据分布在它认为合适的节点上,而不考虑 Flink 如何在其运营商之间对数据进行分区。每个节点上的本地缓存意味着只要没有故障,就会尊重 Flink 的分区。我面临的问题是我无法强制在每个物理节点上都存在一个 Ignite 节点,因此我无法保证在 Flink 可能启动操作符的每个节点上都存在缓存。我正在研究 Slider 上的 Ignite 来解决这个问题。 激发立场的动力如何开始?你可以简单地启动一个作为 Flink TaskManager 或 StateBackend 的一部分,它会加入其他实例的网格吗? 【参考方案1】:创建了一个票据以使用 YARN 增强资源分配:https://issues.apache.org/jira/browse/IGNITE-3214。社区中的某个人会收集并修复它。
【讨论】:
以上是关于在 YARN 上使用 Ignite 确保本地缓存的主要内容,如果未能解决你的问题,请参考以下文章