2

私は現在、JDK1.7 を使用してコンパイルし、Cascading 1.2 (まもなく 2.1 にアップグレード予定) を使用して Hadoop ジョブを作成および実行し、Hadoop の Cloudera ディストリビューション (0.20.2-cdh3u3) を使用するプロジェクトに取り組んでいます。

カスケード/Hadoop ジョブを変更して、MySQL データベースとの間ですべてのデータを読み書きする方法を検討しています。SQOOPはそれを処理できるようです。

ただし、これまで見てきたことから、Java でこれを行う方法に関する情報やドキュメントはほとんどありません (SQOOP は主に、シェル内から呼び出されるバッチ ジョブに使用されることになっていることを理解しています)。私のために働いた。SQOOP 1.4 を使用して、JDK1.6 を使用するようにプロジェクトを切り替えてみましたが、これが必要であると思われます (ただし、プロジェクトの他の部分が壊れます) が、それでも機能しませんでした。

私が達成しようとしていることが可能かどうかは誰にもわかりますか? 他の人々はこの問題にどのように対処していますか? SQOOP2 のリリースは役に立ちますか?

org.apache.sqoop.tool.ExportTool を実行して CSV をテーブルにエクスポートしようとしたときに表示されるエラーの種類は次のとおりです。

(ほとんどの場合) クラス ローダーの問題が原因で、javac プロセッサを初期化できません: java.lang.NoClassDefFoundError: com/sun/tools/javac/processing/JavacProcessingEnvironment

注: \tmp\sqoop-my.name\compile\9031edc8e43167c10f9f895b64aa79d5\MyTableName.java は、非推奨の API を使用またはオーバーライドします。

エクスポート ジョブの実行中に IOException が発生しました: java.io.IOException: jar \tmp\sqoop-my.name\compile\9031edc8e43167c10f9f895b64aa79d5\MyTableName.jar を JVM にロードできませんでした。(クラス MyTableName が見つかりませんでした。)

4

3 に答える 3

2

Sqoop は、MySQL/その他のリレーショナル データベースと Hadoop/HBase の間でデータをエクスポート/インポートするために設計されています。sqoop のさまざまな機能を説明する非常に優れたチュートリアルがここにあります。これがあなたのやりたいことかどうかわかりません。

MapReduce ジョブで MySQL との間でデータを読み書きする必要がある場合は、DBInputFormat/DBOutput@Charles の提案に従って Hadoop クラスを使用できます。

于 2013-06-06T15:41:00.757 に答える
1

ジョブの出力を MySQL に書き込むだけの場合は、次のように呼ばれる別の出力形式を使用することをお勧めDBOutputFormatます

コンパニオン クラス DBOutputFormat を使用すると、結果をデータベースに書き戻すことができます。ジョブを設定するときは、conf.setOutputFormat(DBOutputFormat.class); を呼び出します。そして、前と同じように DBConfiguration.configureDB() を呼び出します。

DBOutputFormat.setOutput() メソッドは、結果をデータベースに書き戻す方法を定義します。その 3 つの引数は、ジョブの JobConf オブジェクト、書き込み先のテーブルの名前を定義する文字列、および入力するテーブルのフィールドを定義する文字列の配列です。例: DBOutputFormat.setOutput(job, "employees", "employee_id", "name");.

前に作成したものと同じ DBWritable 実装で、データベースにレコードを挿入して戻すことができます。write(PreparedStatement stmt) メソッドは、Reducer から OutputCollector に渡す DBWritable の各インスタンスで呼び出されます。削減の最後に、これらの PreparedStatement オブジェクトは INSERT ステートメントに変換され、SQL データベースに対して実行されます。

「以前と同じ」は、この指示を指します。

DBConfiguration.configureDB(conf, “com.mysql.jdbc.Driver”, “jdbc:mysql://localhost/mydatabase”);

MySQL から読み取るには、すべて同じDBInputFormatです。

于 2013-06-06T15:23:28.280 に答える
1

チャールズとヴィカスに感謝します。これは確かに私を正しい軌道に乗せました。最終的に、Hadoop クラスを使用するhttps://github.com/cwensel/cascading.jdbcDBInputFormat/DBOutputを使用して、db を読み書きするカスケーディング ジョブを簡単に設定できるようにしました。

書くために、タップの出力フローを次のように変更しました。

String url = "jdbc:mysql://localhost:3306/mydb?user=myusername&password=mypassword";
String driver = "com.mysql.jdbc.Driver";
String tableName = "mytable";   
String[] columnNames = {'col1', 'col2', 'col3'}; //Columns I want to write to 
TableDesc tableDesc = new TableDesc( tableName );

JDBCScheme dbScheme = new JDBCScheme( columnNames );
Tap dbOutputTap = new JDBCTap( url, driver, tableDesc, dbScheme );

そして、データベースから読み取るために、次のようなタップを作成しました。

String url = "jdbc:mysql://localhost:3306/mydb?user=myusername&password=mypassword";
String driver = "com.mysql.jdbc.Driver";
String tableName = "mytable";      
String[] columnNames = {'col1', 'col2', 'col3'}; //Columns I want to read from 
TableDesc tableDesc = new TableDesc( tableName );

JDBCScheme dbScheme = new JDBCScheme( columnNames, "col1<40" );
Tap dbInputTap = new JDBCTap( url, driver, tableDesc, dbScheme );

Cascading-DBMigrate にも出くわしましたが、これは db からの読み取り専用であり、書き込み用ではないようです。

于 2013-06-17T12:22:54.770 に答える