Camus导入中文乱码问题(源码修改、编译、部署、任务启动)

Camus使用过程当中业务方反映从Kafka导入至HDFS中的数据有中文乱码问题,且业务方确认写入的数据编码为UTF-8,开始跟进。
 
问题重现:
 
(1)编写代码将带有中文的字符串以编码UTF-8写入Kafka的某个Topic;
(2)将该Topic的数据经过Camus导入HDFS;
(3)查看HDFS中导入的文件数据;
 
确认有中文乱码问题存在,与业务方无关。
 
(1)写入
 
 
 
这是一个写入的代码片断,ProducerRecord是以字符串的形式设置的,而ProducerRecord中的key和value会经过“key.serializer”和“value.serializer”被序列化,这其中就会有字符编码问题,查看org.apache.kafka.common.serialization.StringSerializer的源码:
 
 
而“encoding”的值来源于下面的代码片断:
 
 
也就是说“encoding”在没有显示设置的状况下,默认就是“UTF8”。
 
(2)导入
 
经过查看Camus的相关配置文件,有两个属性须要注意:
 
 
 
从属性名称以及注释能够推断出,这两个属性值均与数据的编码、解码相关,查看它们的源代码。
 
com.linkedin.camus.etl.kafka.common.StringRecordWriterProvider
 
 
能够看出,StringRecordWriterProvider使用的是系统的默认编码,可能存在隐患。
 
com.linkedin.camus.etl.kafka.coders.KafkaStringMessageDecoder(DIP自主开发)
 
 
能够看出,KafkaStringMessageDecoder使用的是系统的默认编码,可能存在隐患。
 
综上所述,业务方写入时(默认)使用UTF-8编码进行导入,若是咱们Hadoop集群的某些节点编码不是UTF-8就能够出现中文乱码问题(之前出现过相似的问题)。
 
解决方案:显示设置上述两个操做的编码。
 
com.linkedin.camus.etl.kafka.common.StringRecordWriterProvider
 
 
com.linkedin.camus.etl.kafka.coders.KafkaStringMessageDecoder
 
 
编译代码以前,须要修改如下两个地方:
 
./camus-schema-registry-avro/pom.xml
 
 
./pom.xml
 
 
不然编译过程当中会出现如下异常:
 
 
编译命令以下:
 
mvn clean package -Dmaven.test.skip=true
 
最终生成的部署包位于:dip_camus/camus-example/target/camus-example-0.1.0-SNAPSHOT-shaded.jar
 
测试命令以下:
 
sudo -u hdfs hadoop jar camus-example-0.1.0-SNAPSHOT-shaded.jar com.linkedin.camus.etl.kafka.CamusJob -P k1001_camus.properties
 
请验证,中文正常显示,问题解决。
相关文章
相关标签/搜索