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
 
请验证,中文正常显示,问题解决。

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

  1. windows下在idea用maven导入spark2.3.1源码并编译并运行示例

    一.前提 1.配置好maven:intellij idea maven配置及maven项目创建 2.下载好spark源码: 二.导入源码: 1.将下载的源码包spark-2.3.1.tgz解压(E:\ ...

  2. 02.LNMP架构-MySQL源码包编译部署详细步骤

    操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:Cmake+Boost+MySQL 操作步骤: 一.安装依赖组件 [root@localhost ~]# yum -y ...

  3. 01.LNMP架构-Nginx源码包编译部署详细步骤

    操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:Pcre+Zlib+Openssl+Nginx 操作步骤: 一.创建目录 [root@localhost ~]# mk ...

  4. 03.LNMP架构-PHP源码包编译部署详细步骤

    一.环境准备 操作系统:CentOS_Server_7.5_x64_1804.iso 部署组件:yasm+libmcrypt+libvpx+tiff+libpng+freetype+jpeg+libg ...

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

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  6. 使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码

    前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. 准备工作 1.sca ...

  7. 使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码(博主强烈推荐)

    前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. 准备工作 1.sca ...

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

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  9. Oracle导入中文乱码解决办法

    Oracle导入中文乱码解决办法 一.确保各个客户端字符集的编码同服务器字符集编码一致 1-       确定sqlplus字符集编码,如果是windows设置环境变量. 2-       确保Sec ...

随机推荐

  1. PHP 支持的协议/封装协议列表

    附录 L. 支持的协议/封装协议列表 目录 文件系统 Socket HTTP 和 HTTPS FTP 和 FTPS PHP 输入/输出流 压缩流 Secure Shell 2 音频流  以下是 PHP ...

  2. 用Markdown优雅的渲染我们的网页

    认识 Markdown Markdown 是一种用来写作的轻量级「标记语言」,它用简洁的语法代替排版,而不像一般我们用的字处理软件 Word 或 Pages 有大量的排版.字体设置.它使我们专心于码字 ...

  3. AngularJs的UI组件ui-Bootstrap-Tooltip

    完整案例,参考http://www.cnblogs.com/pilixiami/p/5661600.html <!DOCTYPE html> <html ng-app="u ...

  4. css sprites精灵技术:Html将所有图片放在一张图片上

    使用最近做的某项目常见页面作为联系素材: 分析:1.切图:步骤条可以切成四种图,即黄灰.红黄.红.灰. 2.html:需要五个li标签,每个包含一个图片及文字. 将要取得图片放到同一张图片上,从左到右 ...

  5. __unset()魔术方法 删除类内私有属性

    __unset()魔术方法 删除私有属性 unset()对共有属性进行删除 可通过__unset()魔术方法对私有属性进行操作 当在类外部执行unset()函数时,自动执行类内__unset()魔术方 ...

  6. MyEclipse使用经验总结

    0.快捷键 ================================================================================ 编辑: Ctrl+Shif ...

  7. 用Python实现的一个简单的爬取省市乡镇的行政区划信息的脚本

    # coding=utf-8 # Creeper import os import bs4 import time import MySQLdb import urllib2 import datet ...

  8. C# 数据结构 栈 Stack

    栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队 ...

  9. Xcode-01ARC / Block

    1.nonatomic 2.assign 3.strong 4.weak 5.instancetype 6.@class @property 使部分类在编译时不使用ARC -(可以让这们支持 reta ...

  10. Makefile的简单例子

    1.生成test可执行文件,源文件有prog.c prog.h cord.h test:prog.o code.o gcc -o test prog.o code.o prog.o:prog.c pr ...