2017-11-16 9 views
1

Cloudera環境に新しく、Sqoopを使用してRDBMSからデータをインポートしようとしています。インポート中にデータにいくつかの変換を適用する必要があります。具体的には、Hadoop DFSに格納する前にいくつかのフィールドを暗号化する必要があります。これを達成するために、私が変更できるORM javaクラスを生成するcodegenコマンドを使用しようとしています。Cloudera - Sqoop codegenカスタムORMクラス(インポート時)

MySQLデータベースに 'products'テーブルがあり、それをSqoopを使用してHDFS上にインポートし、 'brand'フィールドを暗号化したいとします。 まず私は、このコマンドを実行してきました:

sqoop codegen \ 
--connect jdbc:mysql://localhost/test \ 
--username username --password password \ 
--table products 

これはフォルダを/ tmp/sqoopトレーニング/コンパイル/ fc8868dda33ef703ad126583cf77477f内のファイルのproducts.java、products.jarをとproducts.classを生成します。

今、私はそうのようなproducts.javaのメソッドreadFields変更した:どのように私はの更新バージョンを取得するためにproducts.javaを再コンパイルすることができます)
1:私は2つの質問がある

// WARNING: This class is AUTO-GENERATED. Modify at your own risk. 
// 
// Debug information: 
// Generated date: Thu Nov 16 06:55:13 PST 2017 
// For connector: org.apache.sqoop.manager.MySQLManager 
import org.apache.hadoop.io.BytesWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.io.Writable; 
import org.apache.hadoop.mapred.lib.db.DBWritable; 
import com.cloudera.sqoop.lib.JdbcWritableBridge; 
import com.cloudera.sqoop.lib.DelimiterSet; 
import com.cloudera.sqoop.lib.FieldFormatter; 
import com.cloudera.sqoop.lib.RecordParser; 
import com.cloudera.sqoop.lib.BooleanParser; 
import com.cloudera.sqoop.lib.BlobRef; 
import com.cloudera.sqoop.lib.ClobRef; 
import com.cloudera.sqoop.lib.LargeObjectLoader; 
import com.cloudera.sqoop.lib.SqoopRecord; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.io.DataInput; 
import java.io.DataOutput; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.sql.Date; 
import java.sql.Time; 
import java.sql.Timestamp; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeMap; 

public class products extends SqoopRecord implements DBWritable, Writable { 

    // [...] 

    public void readFields(ResultSet __dbResults) throws SQLException { 
     this.__cur_result_set = __dbResults; 
     this.prod_id = JdbcWritableBridge.readInteger(1, __dbResults); 
     this.brand = encrypt(JdbcWritableBridge.readString(2, __dbResults)); 
     this.name = JdbcWritableBridge.readString(3, __dbResults); 
     this.price = JdbcWritableBridge.readInteger(4, __dbResults); 
     this.cost = JdbcWritableBridge.readInteger(5, __dbResults); 
     this.shipping_wt = JdbcWritableBridge.readInteger(6, __dbResults); 
    } 

    // [...] 

} 

をproducts.classとproducts.jar?私は

javac products.java 

で試してみたが、JVMは、82個のエラーを与える、HadoopのとClouderaの名前空間からパッケージを見つけることができないようだ。

error: package org.apache.hadoop.io does not exist 
import org.apache.hadoop.io.BytesWritable; 
         ^
products.java:8: error: package org.apache.hadoop.io does not exist 
import org.apache.hadoop.io.Text; 
         ^
products.java:9: error: package org.apache.hadoop.io does not exist 
import org.apache.hadoop.io.Writable; 
         ^
products.java:10: error: package org.apache.hadoop.mapred.lib.db does not exist 
import org.apache.hadoop.mapred.lib.db.DBWritable; 
            ^
products.java:11: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.JdbcWritableBridge; 
          ^
products.java:12: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.DelimiterSet; 
          ^
products.java:13: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.FieldFormatter; 
          ^
products.java:14: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.RecordParser; 
          ^
products.java:15: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.BooleanParser; 
          ^
products.java:16: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.BlobRef; 
          ^
products.java:17: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.ClobRef; 
          ^
products.java:18: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.LargeObjectLoader; 
          ^
products.java:19: error: package com.cloudera.sqoop.lib does not exist 
import com.cloudera.sqoop.lib.SqoopRecord; 


2)私は成功していたら、コンパイルされたproducts.javaでは、カスタムORMクラスを使用してHDFS上のデータをインポートするためにSqoopを使用するにはどうしたらいいですか?



ありがとうございます!最初の質問で

答えて

1

export CLASSPATH=`hadoop classpath`:/opt/cloudera/parcels/CDH/lib/sqoop/lib 

を追加してから、もう一度お試しください。

ps。一般的にはアーキテクチャ上、「具体的には、Hadoop DFSに格納する前にいくつかのフィールドを暗号化する必要があります」というマイナーコメントがあります。なぜHDFS透過暗号化を使用しないのですか? https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_hdfs_encryption.htmlコーディングなしで同じことができます。

+0

ありがとうございます!残念ながら、フォルダ/ opt/cloudera/parcels/CDH/lib/sqoopは存在しません。/opt/cloudera/parcels/CDH/lib/hueフォルダのみが表示されます。ターミナルでコマンド 'hadoop version'を実行すると、CDHのバージョンがcdh5.8.0であることがわかります。 – revy

+0

sqoop 1またはsqoop 2がインストールされていますか?それは小包またはパッケージとしてインストールされましたか? CMを通じてsqoop 1サービスを追加しましたか? – Tagar

関連する問題