🌟

EmbulkでBad character (ASCII 0) encountered.

2021/07/21に公開

状況

MySQL(RDS)からBigQyeryへデータを定期的に移行していた。
EmbulkはECSで実行。
CloudWatchで以下のエラーを観測。

Error: org.jruby.exceptions.RaiseException: (Error) failed during waiting a Load job, get_job(hogehoge-1111, embulk_load_job_947d2dfd-7507-4337-bc5f-0275847f791d), errors:[{:reason=>"invalid", :message=>"Error while reading data, error message: Error detected while parsing row starting at position: 328164. Error: Bad character (ASCII 0) encountered."}, {:reason=>"invalid", :message=>"Error while reading data, error message: CSV processing encountered too many errors, giving up. Rows: 1916; errors: 1; max bad: 0; error percent: 0"}]

使用していたプラグインは以下。
embulk-input-mysql
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql

embulk-output-bigquery
https://github.com/embulk/embulk-output-bigquery

embulk-filter-ruby_proc
https://github.com/joker1007/embulk-filter-ruby_proc

jruby-openssl
https://github.com/jruby/jruby-openssl

原因

該当レコードに\u0000が含まれていた。
おそらくこのNULL文字が原因かと。
その他のユニコード文字(\u0001\u007F)が含まれていた場合はエラーが発生しなかったのでそう判断。

対処

\u0000が含まれていたら\u0000を削除するように。
embulk-filter-ruby_proc(レコードの値をRubyで変換できるプラグイン)を使っていたので、embulk-filter-ruby_procで対処することにしました。

filters:
  - type: ruby_proc
    columns:
      - name: body
        proc: |
          ->(body) do
            body.gsub(/\u0000/, '')
          end

Discussion