在服务器上运行的Flink独立群集上,我正在Scala中开发Flink流式传输作业。该作业使用来自超过1个Kafka主题的数据(进行一些格式化)并将结果写入HDFS。
Kafka主题和HDFS之一,它们都需要单独的Kerberos身份验证(因为它们属于完全不同的群集)。
我的问题是:
security.kerberos.login.keytab
security.kerberos.login.principal
和flink-conf.yaml
可以在两个主体之间手动切换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...]
感谢您的关注和反馈!
答案 0 :(得分:0)
基于对this very similar question的回答和评论
似乎没有明确的方法可以在单个 Flink 作业中使用两个凭据。
有希望的方法或解决方法:
最后一点的一个例子:
您可以使用 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'
...
sasl.jaas.config
。
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\";")