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

时间:2018-05-02 07:08:51

标签: hadoop apache-kafka hdfs apache-flink flink-streaming

问题

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

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

我的问题是:

  1. 是否可以(如果是,如何?)在服务器上运行的Flink群集上的Flink作业中使用两个Kerberos密钥记录(一个用于Kafka,另一个用于HDFS)? (因此Flink作业可以使用Kafka主题并同时写入HDFS)
  2. 如果不可能,那么当Kafka和HDFS都受到Kerberos保护时Kafka-Flink-HDFS数据流的合理解决方法是什么?
  3. 注意

    • 我对这里提到的大多数技术都很陌生。
    • 如果Flink作业不需要使用需要Kerberos的主题,则可以写入HDFS。在这种情况下,我在security.kerberos.login.keytab
    • 中将HDFS的信息指定为security.kerberos.login.principalflink-conf.yaml
    • 我正在使用HDFS Connector provided from Flink写入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...]

    环境

    感谢您的关注和反馈!

2 个答案:

答案 0 :(得分:0)

基于对this very similar question的回答和评论

似乎没有明确的方法可以在单个 Flink 作业中使用两个凭据。

有希望的方法或解决方法:

  • 建立信任
  • 在同一平台上共同安装 Kafka 和 HDFS
  • 用别的东西来弥补差距

最后一点的一个例子:

您可以使用 NiFi 或 Streams Replication Manager 之类的工具将数据从源 Kafka 传送到集群中的 Kafka。 NiFi 更加模块化,并且可以为每个步骤配置 kerberos 凭据。之后,您将处于 Flink 可以处理的单一上下文中。

完全披露:我是 Cloudera 的一名员工,是 NiFi、Kafka、HDFS、Streams Replication Manager 以及最近的 Flink 背后的推动力

答案 1 :(得分:0)

从我最初的帖子开始三年后,我们的架构已经从独立的裸机服务器转移到 Mesos 上的 Docker 容器,但让我总结一下解决方法(对于 Flink 1.8):

  • krb5.conf 与所有领域定义和域-领域映射放在一起(例如在容器的 /etc/ 下)

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

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

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

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

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