启用kerberos后,producer,consumer 的java API

漂泊的美好 发表于: 2016-09-10   最后更新时间: 2016-09-12 10:27:38   4,537 游览

现在想调用新producer和consumer的java API,但是一直都不成功,这是我参考网上的生产者

public static KafkaProducer<String, String> getProducer() throws IOException {
        if (kp == null) {
            Properties props = new Properties();
            props.put("sasl.kerberos.service.name", "kafka");
            props.put("sasl.mechanism", "GSSAPI");
            props.put("security.protocol", "SASL_PLAINTEXT");
            props.put("bootstrap.servers", "172.16.18.201:9092");
            props.put("acks", "1");
            props.put("retries", 0);
            props.put("batch.size", 16384);
            props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            kp = new KafkaProducer<String, String>(props);
        }
        return kp;
    }

消费者
public static KafkaConsumer<String, String> getConsumer() {
        if(kc == null) {
            Properties props = new Properties();
            props.put("bootstrap.servers", "172.16.18.201:9092");
            props.put("sasl.kerberos.service.name", "kafka");
            props.put("sasl.mechanism", "GSSAPI");
            props.put("security.protocol", "SASL_PLAINTEXT");
            props.put("group.id", "1");
            props.put("enable.auto.commit", "true");
            props.put("auto.commit.interval.ms", "1000");
            props.put("session.timeout.ms", "30000");
            props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            kc = new KafkaConsumer<String, String>(props);
        }
        return kc;
    }

以上生产者消费者在不启用kerberos和kafka acl时可以用,但在启动认证和权限之后就不能使用,我怀疑这个配置文件还是不太对,请前辈不吝赐教。

发表于 2016-09-10
添加评论

你的客户端的jvm环境里面,引入类似的kafka_server_jaas.conf了吗?

漂泊的美好 -> 無名 8年前

引入了,而且producer和consumer的命令行工具已经可以用了。

漂泊的美好 -> 無名 8年前

kafka_client_jaas.conf这个我引入到了kafka-run-class.sh的JVM performance options的参数里面了,不知道正确吗?

無名 -> 漂泊的美好 8年前

1、和client配置的一致说明是正确的
2、命令的consumer和producer都成功,说明kerberos环境是正确的,并且已搭建成功。
缺少 sasl.kerberos.service.name=kafka。

java客户端发送不成功,有错误提示么。同时也观察下kerberos的日志,看看是否注册成功。

無名 -> 漂泊的美好 8年前

sorry,看到你已经加了,还有,确认下你的地址是9092么? 一般kerberos的端口都不是这个。

漂泊的美好 -> 無名 8年前

因为之前,采用命令行的方式进行生产消费时,就是写得9092

漂泊的美好 -> 無名 8年前

要不要在java代码中加入

// Authenticating Kerberos principal
System.out.println("Principal Authentication: ");
final String user = "kafka-client-1@HADOOP.COM";
final String keyPath = "/etc/kafka/conf/kafka_client.keytab";
UserGroupInformation.loginUserFromKeytab(user, keyPath);
你的答案

查看kafka相关的其他问题或提一个您自己的问题