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. Python实战:美女图片下载器,海量图片任你下载

    Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...

  2. C# 事件的理解

    说实话,事件弄得还是很晕,有待于以后的强化吧,下面是我对事件的一点理解 首先,参见大牛的帖子:网上大牛事件讲解 下面我来说一说事件的大致流程: 事件委托事件概述事件就是当对象或类状态发生改变时,对象或 ...

  3. jquery 提示信息显示后自动消失的具体实现

    方法一: 复制代码 代码如下: $("#errormsg").html("您的信息输入错误,请重试!").show(300).delay(3000).hide( ...

  4. Java SE (5)之 线程使用

    JAVA有两种线程的方法Thread 和Runnable 能够使用,这是为了弥补不能多继承的缺陷 首先是 Thread package com.sunzhiyan03; /* * 演示线程 * */ ...

  5. Object To Enum

    public static T ObjectToEnum<T>(object o) { try { return (T)Enum.Parse(typeof(T), o.ToString() ...

  6. Js--AJAX的小知识(一):ajax的五种状态

    一.ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已 ...

  7. C++Primer学习笔记(二、基础)

    1.两种初始化方式,直接初始化语法更灵活,且效率更高. ); // 直接初始化 direct-initialization ; // 赋值初始化 copy-initialization 2.const ...

  8. swift 赋值判断

    . var name:String? = "Wing" var geting = "Hello!" if let thisname = name{ geting ...

  9. Graphics类绘制图形

    1. 画直线 void drawLine(int startX,int startY,int endX,int endY); 四个参数分别为:起始点的x坐标和y坐标以及终点的x坐标和y坐标,该方法用于 ...

  10. 校省选赛第一场D题TwoDecks题解

    今天晚上第二场比赛,现在还是赛后刷上次的题目,越刷越伤心,发现我赛后一次AC的功力很强大啊!!!(希望今晚变成是赛中一次AC啊!!) 好啦,回归正题. 看题目 D. Merging Two Decks ...