MapReduce에서 MySQL로 내보내기 오류 해결

검색엔진 로그의 결과를 mapreduce로 통계한 후 mysql에 입력하는 과정에서 다음과 같은 오류가 발생했습니다.
16/01/15 16:25:57 INFO mapreduce.Job: Task Id : attempt_1452318091100_0022_r_000000_0, Status : FAILEDError: java.io.IOException: Incorrect string value: '\xF0\x9F\x98\x82*' for column 'KEYWORD' at row 1        at org.apache.hadoop.mapreduce.lib.db.DBOutputFormat$DBRecordWriter.close(DBOutputFormat.java:103)        at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.close(ReduceTask.java:550)        at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:629)        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389)        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)        at java.security.AccessController.doPrivileged(Native Method)        at javax.security.auth.Subject.doAs(Subject.java:415)        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
mysql 서버 인코딩은utf-8,mapreduce의 데이터베이스 연결은:jdbc:mysql://host:port/database?useUnicode=true&characterEncoding=UTF- 8, mysql 드라이브: mysql-connector-java-5.1.38
조사에 의하면 전통적인 UTF-8은 모두 3자가 인코딩한 것이고 여기서 틀린 것은 4자의 유니코드(웃는 얼굴과 같은 문자:
   

), 현재 데이터베이스는 UTF-8로 정의되어 있으며, 저장할 때 3바이트로 4바이트를 수용하려고 시도하면 당연히 오류가 발생한다.
데이터베이스를utf8mb4 인코딩으로 수정해야만 이 네 개의 문자를 수용할 수 있습니다.(MysQL 버전 5.5.3 이상 및 jdbc 드라이브 5.1.13 이상 요구)
서버에 데이터베이스가 한 개만 있는 것이 아니기 때문에, 현재 사용하고 있는 데이터베이스의table 인코딩을utf8mb4로 수정하려고 시도했는데, 결과는 같다.
마침내 수정하다.cnf:
         [mysqld]
         character_set_server=utf8mb4
         collation_server=utf8mb4_bin    , 。    mysql, , 。    , 。

좋은 웹페이지 즐겨찾기