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

请验证,中文正常显示,问题解决。

时间: 2024-08-03 23:06:58

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

Struts2中文乱码问题源码分析___转

前几天在论坛上看到一篇帖子,是关于Struts2.0中文乱码的,楼主采用的是spring的字符编码过滤器 (CharacterEncodingFilter)统一编码为GBK,前台提交表单数据到Action,但是在Action中得到的中文全部是乱码,前 台的页面编码都是GBK没有问题.这是为什么呢?下面我们就通过阅读FilterDispatcher和CharacterEncodingFilter 这两个过滤器的源代码,了解其实现细节,最终得出为什么中文还是乱码! web.xml配置: 1     

redis源码修改之zincrby,hincrby命令

在项目中大量使用zincrby命令,原因就是要统计日志中某个指标的计数值,且需要按顺序返回topn. 正常来说,一个指标调用一次zincrby(zincrby default:type 1 typeA) 就可以正常工作. 实际情况是由于日志生成的太快,redis cpu利用率经常100%,而且还丢数据. 是否可以一次性增加多次指标的累计值,比如zincrby default:type 1 typeA 1 typeB 1 typeC ...,这样将多次通信压缩到一次通信中,肯定能提高处理能力. 无

python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 >>> a="hello world" >>> a[:-1] 'hello worl' 转义符 转义字符 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n

[hadoop]Windows下eclipse导入hadoop源码,编译WordCount

hadoop版本为hadoop1.2.1 eclipse版本为eclipse-standard-kepler-SR2-win32-x86_64 WordCount.java为hadoop-1.2.1\src\examples\org\apache\hadoop\examples\WordCount.java 1 /** 2 * Licensed under the Apache License, Version 2.0 (the "License"); 3 * you may not

Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展,并重新打包文件,替换原有的 jar 文件,满足测试开发自身的需求. 下面以修改 eclipse 默认注释中的 ${date} 和 ${time} 对应的返回样式(如下图所示),进行实例说明. 整个二次开发的过程如下所示: 0.未修改之前,生成注释的日期.时间显示格式如下所示: 1.获取对应的 jar

Oracle导入中文乱码解决办法

Oracle导入中文乱码解决办法 一.确保各个客户端字符集的编码同服务器字符集编码一致 1-       确定sqlplus字符集编码,如果是windows设置环境变量. 2-       确保SecureCRT客户端的字符集为简体中文即可,不要设置为UTF-8,否则在连接oralce数据库时,中文都显示乱码,以免产生不必要的麻烦. 二.设置带中文的sql脚本的字符集

MyEclipse导入Tomcat7.0.X源码

1.tomcat的代码托管在svn上,地址是:http://svn.apache.org/repos/asf.可以再apache网站上直接下载src. 2.直接利用Myeclipse没有能试成功.按照http://blog.csdn.net/kingzuo/article/details/6955478,成功启动Tomcat. 1.需要安装ant,我使用的是1.9.4版的,下载路径:http://pan.baidu.com/s/14H4n0.在win7上安装之后配置了ant_home.path路

Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮

前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求完全去掉导航栏,那么当用户点进一些系统自带的应用界面如设置.联系人等,就没法退出了,虽然可以在actionBar中添加back按钮,但总不能每一个app都去添加吧.所以灵机一动我们就给系统添加一个全屏可拖拽的浮窗按钮,点击的时候处理返回键的逻辑.它大概长这样(审美可能丑了点,你们可以自由发挥) 图1

postgresql密码加强-passwordcheck源码修改三种以上字符

目录 1.使用方式 2.效果 3.源码修改 1.参考pg_cron的源码在配置文件内增加一个参数 2.修改源码配置校验数字 因数据库入网检测须修改密码级别,在源有的passwordcheck插件上进行二次修改 1.使用方式 替换目录 ../postgresql-11.4/contrib/passwordcheck 下的 passwordcheck.c 编译安装 make && make install postgresql配置文件内修改 (postgresql.conf) shared_p