Dataprocのsqoopでavro保存しようとしたらハマって困った


この記事について

Dataproc で sqoop を実行し、oracleからデータを引っこ抜こうとしたらエラーが出た。
そのトラブルシューティングの記録。

環境

  • Dataprocイメージ: 1.3.16-deb9
  • sqoopパッケージ: sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
  • 連携テーブルにClobタイプのカラムあり
  • ファイルは avro 形式で保存したい

Dataprocでのsqoop方法

この記事を読めば大体書いてある。
https://medium.com/google-cloud/moving-data-with-apache-sqoop-in-google-cloud-dataproc-4056b8fa2600

記事はMysqlだが、これをOracleでやる場合は以下の違いがある。

  • --jars に上記sqoopパッケージを解凍して得たsqoop-1.4.7.jar と lib 配下の全ての jar を指定する
  • --conect 部分をoracleドライバに変更する

しかし、タイトルの通りこれでは avro 形式での sqoop に失敗する。

解決方法

以下の2つのオプションを付与したところ成功した。

  1. -Dmapreduce.job.classloader=true
    "-Dmapreduce.job.user.classpath.first=true" をつけろ!という記事はたくさんあるが、それだと以下のエラーが出て上手くいかなかった。

    Error: org.apache.avro.reflect.ReflectData.addLogicalTypeConversion(Lorg/apache/avro/Conversion;)
    
  2. -map-column-java Clobカラム=String
    Clobタイプのカラムはこれを指定しないと怒られた。

参考