Hadoop 使用hdfs接收器连接器的kafka connect-ExtractTopic转换引发NullPointerException

Hadoop 使用hdfs接收器连接器的kafka connect-ExtractTopic转换引发NullPointerException,hadoop,nullpointerexception,apache-kafka,apache-kafka-connect,Hadoop,Nullpointerexception,Apache Kafka,Apache Kafka Connect,我在kafka 2.0.0中使用confluent hdfs接收器连接器5.0.0,我需要使用ExtractTopic转换()。我的连接器工作得很好,但是当我添加这个转换时,我得到了NullPointerException,即使在只有2个属性的简单数据样本上也是如此 ERROR Task hive-table-test-0 threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerS

我在kafka 2.0.0中使用confluent hdfs接收器连接器5.0.0,我需要使用ExtractTopic转换()。我的连接器工作得很好,但是当我添加这个转换时,我得到了NullPointerException,即使在只有2个属性的简单数据样本上也是如此

ERROR Task hive-table-test-0 threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerSinkTask:482)
java.lang.NullPointerException
    at io.confluent.connect.hdfs.DataWriter.write(DataWriter.java:352)
    at io.confluent.connect.hdfs.HdfsSinkTask.put(HdfsSinkTask.java:109)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:464)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:265)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:182)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:150)
    at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:146)
    at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:190)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748) 
以下是连接器的配置:

name=配置单元表测试
connector.class=io.confluent.connect.hdfs.HdfsSinkConnector
tasks.max=1
主题=配置单元\u表\u测试
key.converter=io.confluent.connect.avro.AvroConverter
value.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=${env.schema\u registry\u url}
value.converter.schema.registry.url=${env.schema\u registry\u url}
schema.compatibility=向后
#HDFS配置
#在更高版本中使用store.url而不是hdfs.url(已弃用)。Property store.url还不起作用
hdfs.url=${env.hdfs_url}
hadoop.conf.dir=/etc/hadoop/conf
home=/opt/cloudera/parcels/CDH/lib/hadoop
topics.dir=${env.HDFS\u topics\u dir}
#连接器配置
format.class=io.confluent.connect.hdfs.avro.AvroFormat
齐平。尺寸=100
旋转。间隔。毫秒=60000
#蜂巢集成
hive.integration=true
hive.metastore.uris=${env.hive\u metastore\u uris}
hive.conf.dir=/etc/hive/conf
home=/opt/cloudera/parcels/CDH/lib/hive
hive.database=kafka\u connect
#转变
transforms=InsertMetadata,ExtractTopic
transforms.InsertMetadata.type=org.apache.kafka.connect.transforms.InsertField$Value
transforms.InsertMetadata.partition.field=分区
transforms.InsertMetadata.offset.field=offset
transforms.ExtractTopic.type=io.confluent.connect.transforms.ExtractTopic$Value
transforms.ExtractTopic.field=名称
transforms.ExtractTopic.skip.missing.or.null=true
我使用的是schema registry,数据是avro格式的,我确信给定的属性
name
不为空。有什么建议吗?我需要的基本上是提取给定字段的内容,并将其用作主题名

编辑:

即使在avro格式的简单json上也会发生这种情况:

{
“attr”:“tmp”,
“名称”:“主题1”
}

简短的回答是,您在转换中更改了主题的名称

每个主题分区的Hdfs连接器都有单独的
TopicPartitionWriter
。当在
open(…)
方法中为每个分区创建负责处理消息的SinkTask时,将创建
TopicPartitionWriter

处理SinkRecords时,它根据主题名和分区号查找
TopicPartitionWriter
,并尝试将记录附加到其缓冲区。在您的情况下,它找不到任何write for消息。通过转换更改了主题名称,并且没有为该对(主题、分区)创建任何
TopicPartitionWriter

传递给
HdfsSinkTask::put(集合记录)
的SinkRecords已经设置了分区和主题,因此您不必应用任何转换


我认为
io.confluent.connect.transforms.ExtractTopic
应该用于
SourceConnector

查看您发送和转换的实际数据会很有用。我添加了一个示例-即使在带有两个字段的简单json上也会发生这种情况(参见上文)。连接器配置的输入主题的名称是什么?你能包括整个连接器配置吗?是的,我添加了整个配置。输入主题的名称是
hive\u table\u test