apache-kafka - 在大量读取期间 kafka 磁盘 hault 写入并导致 kafka 生产者中的 "queue full"错误

标签 apache-kafka spark-streaming raid sched-deadline

我们有 6 个 kafka 代理,具有 256GB RAM、24c/48T,它们托管在 raid10 中配置的 20 个 1.8TB SAS 10K rpm 磁盘。

有两个 Spark 流应用程序

  • 每 10 分钟开始他们的批次
  • 一旦他们开始,他们的第一份工作就是阅读同一个 kafka 主题。
  • 该主题有 200 个分区,均匀分布在 6 个代理上(每个代理上有 33 个分区)。
  • 流媒体应用程序使用 kafka 客户端 0.8.2.1 从 kafka 消费

  • 有 21 个注入(inject)器实例以 6K 事件/秒的速率连续写入该主题。他们使用 librdkafka poroducer 来向 kafka 生成事件。

    当流媒体应用程序醒来时,他们的第一份工作是阅读主题。
    一旦他们这样做,kafka 磁盘中的 %util 会在 30 秒到 60 秒内变为 90-100%,同时所有注入(inject)器实例都从他们的 kafka 生产者那里得到“队列已满”错误。
    这是生产者配置:
  • queue.buffering.max.kbytes:2097151
  • linger.ms: 0.5

  • enter image description here

    从该图中看不到,但是在 util% 高的时候,有一段时间写入为 0,我们假设在这些时间注入(inject)器的生产者的队列已满,因此抛出“队列已满”错误。

    值得一提的是,我们在kafka机器中使用deadline IO调度器,它优先考虑读取操作。

    关于如何释放写的压力,我们有几个想法:
  • 减少不必要的 iops - 将 kafka 磁盘配置从 raid10 更改为非raid(“jbod”)
  • 传播阅读 - 使 Spark 应用程序在不同时间从 kafka 读取而不是同时唤醒
  • 更改写入和读取的优先级 - 将 IO 调度程序更改为 CFQ

  • 我写这个问题是为了验证我们是否在正确的轨道上,并且由于 raid10、截止时间 IO 调度程序和同时读取过多,操作系统 hault 在读取期间确实写入。

    你怎么看?

    最佳答案

    当你问这是否朝着正确的方向发展时:
    我认为你提到的步骤是有道理的。
    一般来说,我总是建议不要让任何东西占用 100% 的磁盘容量,如果它必须与其他假设它们有一些 IO 可用的东西共享这些磁盘。

    关于apache-kafka - 在大量读取期间 kafka 磁盘 hault 写入并导致 kafka 生产者中的 "queue full"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60431967/

    相关文章:

    apache-spark - Spark 流式传输示例对我不起作用 : Network word count (maybe Data not getting streamed)

    winapi - 在 Windows 上获取卷的大小

    linux - 如何在RHEL LVM2上调整剥离的LV的大小?

    python - 可以与 Zookeeper 交谈,但不能与消息代理交谈

    apache-spark - kafka kafka-consumer-groups.sh --describe 不返回消费者组的输出

    apache-spark - 如何停止 Spark 流作业?

    apache-spark - Spark 结构化流在追加模式下显示结果太迟

    apache-kafka - 无效的配置,从Kafka教程启动Zookeper时异常退出

    java - 不同acks下的生产者吞吐量=0,1,-1