如何在 Flink 独立集群上的 Flink 作业中使用两个 Kerberos 密钥表(用于 Kafka 和 Hadoop HDFS)?

sun*_*ize 5 hadoop hdfs apache-kafka apache-flink flink-streaming

在服务器上运行的 Flink 独立集群上,我正在 Scala 中开发 Flink 流作业。该作业使用来自 1 个以上 Kafka 主题的数据(进行一些格式化)并将结果写入 HDFS。

Kafka 主题之一和 HDFS,它们都需要单独的 Kerberos 身份验证(因为它们属于完全不同的集群)。

我的问题是:

  1. 是否有可能(如果是,如何?)从服务器上运行的 Flink 集群上的 Flink 作业中使用两个 Kerberos 密钥表(一个用于 Kafka,另一个用于 HDFS)?(所以 Flink 作业可以从 Kafka topic 消费并同时写入 HDFS)
  2. 如果不可能,当 Kafka 和 HDFS 都受 Kerberos 保护时,对于 Kafka-Flink-HDFS 数据流,什么是合理的解决方法?

笔记

  • 我对这里提到的大多数技术都很陌生。
  • 如果 Flink 作业不需要使用需要 Kerberos 的主题,则它可以写入 HDFS。在这种情况下,我指定HDFS的信息,security.kerberos.login.keytabsecurity.kerberos.login.principalflink-conf.yaml
  • 我正在使用Flink 提供的 HDFS 连接器写入 HDFS。
  • 可以在两个主体之间手动切换 Kerberos 身份验证。在krb5.conf文件的[realm] 部分,我指定了两个领域,一个用于 Kafka,另一个用于 HDFS。

    kinit -kt path/to/hdfs.keytab [principal: xxx@XXX.XXX...]

    kinit -kt path/to/kafka.keytab [principal: yyy@YYY.YYY...]

环境

感谢您的关注和反馈!

sun*_*ize 0

距离我最初发表文章三年后,我们的架构已从独立的裸机服务器转移到 Mesos 上的 Docker 容器,但让我总结一下解决方法(针对 Flink 1.8):

\n
    \n
  • 放置krb5.conf所有领域定义和域领域映射(例如/etc/容器下方)

    \n
  • \n
  • 放置 Hadoop krb5.keytab(例如在 下/kerberos/HADOOP_CLUSTER.ORG.EXAMPLE.COM/

    \n
  • \n
  • 配置Flink的security.kerberos.login.*属性在flink-conf.yaml

    \n
      \n
    • security.kerberos.login.use-ticket-cache: true
    • \n
    • security.kerberos.login.principal: username@HADOOP_CLUSTER.ORG.EXAMPLE.COM
    • \n
    • security.kerberos.login.contexts不应配置。这可确保 Flink 不会将 Hadoop\xe2\x80\x99s 凭证用于 Kafka 和 Zookeeper。
    • \n
    \n
  • \n
  • 将 Kafka 的密钥表复制到容器内的单独目录中(例如在 下/kerberos/KAFKA_CLUSTER.ORG.EXAMPLE.COM/

    \n
  • \n
  • 定期运行自定义脚本以更新票证缓存

    \n
  • \n
\n
KINIT_COMMAND_1='kinit -kt /kerberos/HADOOP_CLUSTER.ORG.EXAMPLE.COM/krb5.keytab username@HADOOP_CLUSTER.ORG.EXAMPLE.COM'\nKINIT_COMMAND_2='kinit -kt /kerberos/KAFKA_CLUSTER.ORG.EXAMPLE.COM/krb5.keytab username@KAFKA_CLUSTER.ORG.EXAMPLE.COM -c /tmp/krb5cc_kafka'\n...\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 将每个 FlinkKafkaConsumer 实例化时的属性设置sasl.jaas.config为实际的 JAAS 配置字符串。\n
      \n
    • 绕过全局 JAAS 配置。如果我们在全局范围内进行设置,我们就可以\xe2\x80\x99t使用具有不同凭证的不同Kafka实例,或者将不安全的Kafka与安全的Kafka一起使用。
    • \n
    \n
  • \n
\n
props.setProperty("sasl.jaas.config", \n    "com.sun.security.auth.module.Krb5LoginModule required " +\n    "refreshKrb5Config=true " +\n    "useKeyTab=true " +\n    "storeKey=true " +\n    "debug=true " +\n    "keyTab=\\"/kerberos/KAFKA_CLUSTER.ORG.EXAMPLE.COM/krb5.keytab\\" " +\n    "principal=\\"username@KAFKA_CLUSTER.ORG.EXAMPLE.COM\\";")\n
Run Code Online (Sandbox Code Playgroud)\n