线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的。由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算数据的随机性,每次执行的结果都不一样(由于Map任务执分配的随机性)。

(注:此文章大部分都参考了同事查找到的问题解决方法。)

在执行Java进程的过程中,通过命令:jinfo+Java进程号 可以查看java进程运行的一些环境信息,其中也包括-D设置的相关参数。

截取的所有信息中,我们比较感兴趣的是下面两行配置:

file.encoding = ANSI_X3.4-1968

sun.jnu.encoding = ANSI_X3.4-1968

而其他DataNode上MR进程的相关配置,按照常理来说,这个错误是不应该发生的。

sun.jnu.encoding = UTF-8

file.encoding = UTF-8

考虑到出问题的那台机器在某天重启过,定位在某次重启时执行的环境问题。执行

如果将这台服务器下线,任务执行成功;

如果将任务全部加上对于这里面的两个属性,就会肯定成功,因为此时已经被改变:

java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 ${mainClass}

参考了下面一篇文章协助解决这个问题:

临时的解决方案,或者将这台服务器执行下线操作,或者将整个集群的mapreduce.admin.map(reduce).child.java.opts设置上加入这两个参数,保证后续所有的MR任务都使用这两个参数。

那么问题始终是要找到原因的,于是马上补充一下关于locale的相关知识,下面ubuntu wiki上的内容算是说的比较全面的:

执行locale命令,可以得出所有的locale信息(本机的环境并没有问题,ssh到服务器上执行出来的结果也正确):

LANG="zh_CN.UTF-8"

LC_COLLATE="zh_CN.UTF-8"

LC_CTYPE="zh_CN.UTF-8"

LC_MESSAGES="zh_CN.UTF-8"

LC_MONETARY="zh_CN.UTF-8"

LC_NUMERIC="zh_CN.UTF-8"

LC_TIME="zh_CN.UTF-8"

LC_ALL=

按照wiki的说明,总共分为12个大类:

语言符号及其分类(LC_CTYPE)

数字(LC_NUMERIC)

比较和排序习惯(LC_COLLATE)

时间显示格式(LC_TIME)

货币单位(LC_MONETARY)

信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)

姓名书写方式(LC_NAME)

地址书写方式(LC_ADDRESS)

电话号码书写方式(LC_TELEPHONE)

度量衡表达方式(LC_MEASUREMENT)

默认纸张尺寸大小(LC_PAPER)

对locale自身包含信息的概述(LC_IDENTIFICATION)。

其中的设置又分为相应的优先级,LC_ALL>LC_*>LANG,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值,当前集群中的所有服务器都没有进行这些参数的手动设置。

经过检查,发现mac的字符集确实与其他的有所不同,具体可以参考下面这篇文章:

其中说到了:

“Mac OSX uses a special kind of decomposed UTF-8 to store filenames. If you need to read in filenames and write them to a ‘normal’ UTF-8 file, you must normalize them. My understanding of this is that when you pass a name with an accented character like é, it will decompose this into e plus ’ before saving it to the filesystem (this behavior is defined by the Unicode standard).”

我们的远程服务器并没有显示地指定LC_*参数,那么就会出现本机登陆的相关locale信息被带到远程服务器上。由于Mac中如果没有设置默认则为:

LC_CTYPE=UTF-8

这个参数会被带到相关的服务器节点中,服务器的操作系统为CentOS,而在CentOS中并没有UTF-8这个值,可以被设置为zh_CN.UTF-8或者en_US.UTF-8这两种类型,而Mac上的UTF-8是无效的。

而Java虚拟机在启动的时候,会根据LC_CTYPE来决定sun.jnu.encoding和file.encoding的设置,由于Mac带过来的设置是非法的,导致这两个值被设置成:ANSI_X3.4-1968,这也是其他两个mac用户亲身实践得到的经验(Mac用户的优越感造就了一个大坑…),哈哈。

最后,通过手动改变服务器启动加载的配置文件/etc/profile,强制显示地设置locale参数来Fix这个问题,这也是比较推荐的方式(相对于改变java参数来说)。

export LANG=en_US.UTF-8

export LC_CTYPE=en_US.UTF-8

export LC_NUMERIC=en_US.UTF-8

export LC_TIME=en_US.UTF-8

export LC_COLLATE=en_US.UTF-8

export LC_MONETARY=en_US.UTF-8

export LC_MESSAGES=en_US.UTF-8

export LC_PAPER=en_US.UTF-8

export LC_NAME=en_US.UTF-8

export LC_ADDRESS=en_US.UTF-8

export LC_TELEPHONE=en_US.UTF-8

export LC_MEASUREMENT=en_US.UTF-8

export LC_IDENTIFICATION=en_US.UTF-8

export LC_ALL=en_US.UTF-8

java locale中文_locale错误导致Java中文乱码错误的总结相关推荐

  1. java libjli.so_解决setcap导致Java加载libjli.so 失败问题

    背景 最近碰到一个问题,有个应用在启动的时候一直报错,错误信息如下: java: error while loading shared libraries: libjli.so: cannot ope ...

  2. java长时间_什么导致Java中长时间的旋转和同步时间?

    在 Java 8 Update 45中,将这些选项添加到java调用中: -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistic ...

  3. java textarea append_JavaFX TextArea.append()导致java.lang.NullPointerException

    我正在读取一个串口并将其写入文本区域作为滚动值.我创建了SerialPortReader类,它运行良好.我的主代码只是调用"updateTextArea()"来告诉类textare ...

  4. java 链接占用太多_Java程序链接数过多导致java.net.SocketException: No buffer space available问题...

    发布时间: Aug 29, 2020 更新时间: Aug 29, 2020 总字数:482 阅读时间:1m 作者: 谢先斌 Java程序链接数过多导致java.net.SocketException: ...

  5. java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...

    解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没 ...

  6. ubuntu mysql支持中文_ubuntu (16.04) server 英文原版 添加中文语言支持 消除java 程序、mysql 数据库不能处理中文的错误...

    ubuntu 16.04 对于腾讯云主机要添加源,因为腾讯云主机(CVM)的源库中包很少 文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器 ...

  7. java生成html 控制编码方式_JAVA中文字符编码问题详解 控制台输出

    JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用中.网上的分析文章和解决方案都很多,但总是针对某些特定情况的.很多次遇到乱码问题后, 经过极为辛苦的调试和搜索资料后终于解决,满以为自己已经 ...

  8. java零碎要点---Tesseract 3.0,Java OCR 图像智能字符识别技术,可识别中文

    2.Java OCR 图像智能字符识别技术,可识别中文  几天一直在研究OCR技术,据我了解的情况,国内最专业的OCR软件只有2家,清华TH-OCR和汉王OCR,看了很多的OCR 技术发现好多对英文与 ...

  9. java 使用itext导出PDF文件,中文不显示问题解决

    之前写的java 使用itext 导出pdf 发现有个问题,在今天使用的时候,发现一个问题,就是当单元格中写中文的时候,导出来的pdf中文不显示. java 使用itext导出PDF文件,图片文字左右 ...

最新文章

  1. ubuntu 系统下安装 xlwt
  2. 记一次简单的 JVM 调优经历
  3. C#线程系列讲座(3):线程池和文件下载服务器
  4. 可持久化线段树——主席树
  5. 【算法导论】学习笔记——第16章 贪心算法
  6. 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)
  7. 如何为Kafka挑选合适的分区数
  8. Adobe Audition 基本使用
  9. Delphi读写UTF-8、Unicode格式文本文件
  10. 神经网络 demo(斯坦福)
  11. Linux下SVN客户端使用教程(全)
  12. Win10_x86_x64PE维护光盘——我用过最好用的PE
  13. 如何无损把mp4视频格式转换成mp3音频格式
  14. 如何查询SCI检索号?
  15. k8s环境之cicd部署+远程触发
  16. Android全面屏导航栏高度,Android10全面屏开启底部手势横条,弹窗留白问题
  17. 互联网时代,怎么做到真正的信息安全?
  18. 关于自由移站法及坐标转换模型的综述
  19. MultiDex 不得不说的用法与源码解析
  20. windows下批量删除指定类型文件

热门文章

  1. docker安装(一)
  2. 威胁情报基础:爬取、行走、分析
  3. WORDPRESS”丢失计划任务”
  4. 【转】Android-Input 按键字符映射文件输入设备配置文件
  5. CF540 B 贪心
  6. 关于DevExpress的心得
  7. 有用的正则表达式或JS方法
  8. oracle更新视图。
  9. dwr 登录实现 (入门知识)
  10. Python-字符串的常用方法