HiveからMongoDBにデータを移動するためのエレガントで簡単かつ高速な方法はありますか?HiveからMongoDBにデータを移動する最も効率的な方法は何ですか?
答えて
Hadoop-MongoDBコネクタを使用してエクスポートを実行できます。あなたの仕事のmainメソッドでHiveクエリを実行するだけです。この出力は、MongoDB
にデータを挿入するためにMapperによって使用されます。
例:
ここで私は、セミコロン区切りのテキストファイル(ID姓; FIRSTNAME)を挿入していますシンプルなハイブのクエリを使用してMongoDBの コレクションに:
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import com.mongodb.hadoop.MongoOutputFormat;
import com.mongodb.hadoop.io.BSONWritable;
import com.mongodb.hadoop.util.MongoConfigUtil;
public class HiveToMongo extends Configured implements Tool {
private static class HiveToMongoMapper extends
Mapper<LongWritable, Text, IntWritable, BSONWritable> {
//See: https://issues.apache.org/jira/browse/HIVE-634
private static final String HIVE_EXPORT_DELIMETER = '\001' + "";
private IntWritable k = new IntWritable();
private BSONWritable v = null;
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String [] split = value.toString().split(HIVE_EXPORT_DELIMETER);
k.set(Integer.parseInt(split[0]));
v = new BSONWritable();
v.put("firstname", split[1]);
v.put("lastname", split[2]);
context.write(k, v);
}
}
public static void main(String[] args) throws Exception {
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
}
catch (ClassNotFoundException e) {
System.out.println("Unable to load Hive Driver");
System.exit(1);
}
try {
Connection con = DriverManager.getConnection(
"jdbc:hive://localhost:10000/default");
Statement stmt = con.createStatement();
String sql = "INSERT OVERWRITE DIRECTORY " +
"'hdfs://localhost:8020/user/hive/tmp' select * from users";
stmt.executeQuery(sql);
}
catch (SQLException e) {
System.exit(1);
}
int res = ToolRunner.run(new Configuration(), new HiveToMongo(), args);
System.exit(res);
}
@Override
public int run(String[] args) throws Exception {
Configuration conf = getConf();
Path inputPath = new Path("/user/hive/tmp");
String mongoDbPath = "mongodb://127.0.0.1:6900/mongo_users.mycoll";
MongoConfigUtil.setOutputURI(conf, mongoDbPath);
/*
Add dependencies to distributed cache via
DistributedCache.addFileToClassPath(...) :
- mongo-hadoop-core-x.x.x.jar
- mongo-java-driver-x.x.x.jar
- hive-jdbc-x.x.x.jar
HadoopUtils is an own utility class
*/
HadoopUtils.addDependenciesToDistributedCache("/libs/mongodb", conf);
HadoopUtils.addDependenciesToDistributedCache("/libs/hive", conf);
Job job = new Job(conf, "HiveToMongo");
FileInputFormat.setInputPaths(job, inputPath);
job.setJarByClass(HiveToMongo.class);
job.setMapperClass(HiveToMongoMapper.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(MongoOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTasks(0);
job.submit();
System.out.println("Job submitted.");
return 0;
}
}
ワン欠点は、'ステージングエリア'(/ user/hive/tmp)が中間ハイブ出力を格納するために必要であるということです。さらに私が知っている限り、Mongo-Hadoopコネクタはupsertsをサポートしていません。
は、私はかなりよく分からないが、あなたはまた、あなたはおそらく、いくつかのオーバーヘッドを節約することができるようにスリフトサービスを公開 hiveserver
を実行せずにHive
からデータを取得しようとすることができます。 実際にクエリを実行するHiveのorg.apache.hadoop.hive.cli.CliDriver#processLine(String line, boolean allowInterupting)
メソッドのソースコードを見てください。
...
LogUtils.initHiveLog4j();
CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
ss.in = System.in;
ss.out = new PrintStream(System.out, true, "UTF-8");
ss.err = new PrintStream(System.err, true, "UTF-8");
SessionState.start(ss);
Driver qp = new Driver();
processLocalCmd("SELECT * from users", qp, ss); //taken from CliDriver
...
サイドノート:
あなたもチェックするかもしれないhive-mongoコネクタの実装もあります次に、あなたが一緒にこのような何かをハックすることができます。 MongoDB
についても同様の方法を実装したい場合は、Hive-HBaseコネクタの実装を見てみるとよいでしょう。
Sqoopを調べましたか? HadoopとSQL/NoSQLデータベースの間でデータを移動するのは非常に簡単になるはずです。 This articleにはHiveと共に使用する例もあります。
hadoop-MongoDB
コネクター・プロジェクトを見てみましょう:
http://api.mongodb.org/hadoop/MongoDB%2BHadoop+Connector.html
が「この接続は、Hadoopの両方のMapReduceジョブで使用するためのHadoop(に読んMongoDBのデータだけでなく、他のコンポーネントを許可するという形をとるのHadoopの仕事の結果をMongoDBに書き出すことができます」
あなたのユースケースではうまくいくかどうかわかりませんが、見てみる価値はあります。
- 1. UIImageViewを移動する最も効率的な方法は何ですか?
- 2. 何千ものmongodb文書内で計算を行う最も効率的な方法は何ですか?
- 3. mongodb gpsトラッキングデータを保存する最も効率的な方法
- 4. Cでキューからデキューする最も効率的な方法#
- 5. C++からJavaにデータを渡す最も効率的(最速)の方法は何ですか?
- 6. ページにAPIを含める最も効率的な方法は何ですか?
- 7. オブジェクトのリストからデータを取得する最も効率的な方法は?
- 8. 最も効率的なページヒットを生成する最も効率的な方法
- 9. 効率的にカフカからインパラテーブルにデータを移動する方法は?ここ
- 10. ユーザーのDirectoryEntryをロードする最も効率的な方法は何ですか?
- 11. リストビューを作成する最も効率的な方法は何ですか?
- 12. アナリティクスビーコンを保存する最も効率的な方法は何ですか?
- 13. C++ - nullポインタをテストする最も効率的な方法は何ですか?
- 14. ウェブページのアニメーションヘッダをコーディングする最も効率的な方法は何ですか?
- 15. ダイナミックメニューをレンダリングする最も効率的な方法は何ですか
- 16. Laravel 5.4のデータベースからデータをロードする最も効率的な方法は何でしょうか?
- 17. pongongoを使ってMongoDBのObjectIdで値を取得する最も効率的な方法は何ですか?
- 18. データのハッシュをフォーマットする最も効率的な方法は?
- 19. タイムスタンプでデータを取得する最も効率的な方法
- 20. Elasticsearchでデータをモデル化する最も効率的な方法
- 21. シングルトンと対話する最も効率的な方法は何ですか?
- 22. 2D std :: vectorで行/列を移動する最も効率的な方法
- 23. SQL Server 2014 - データベース間でデータを1つのテーブルから別のテーブルに移動する最も効率的な方法は何ですか?同じインスタンス
- 24. キーワードを保持する最も効率的なデータ構造は何ですか?
- 25. MongoDB:単一のランダム文書を照会する最も効率的な方法は何ですか?
- 26. Cythonでガウス乱数を生成する最も効率的で移植可能な方法は何ですか?
- 27. Pythonで最も効率的にスリープする方法は何ですか?
- 28. 今月の初日に最も効率的な方法は何ですか?
- 29. mongodbコレクションからランダムなレコードを取得する最も単純で効果的な方法は何ですか?
- 30. Rで最も効率的なkmeansクラスタリングパッケージは何ですか?
Sqoopは、その時点でのhadoopとリレーショナルデータベース間の転送のみをサポートしています。http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_supported_databases –
@Jp Bondは、SqoopをJDBCで使用できると指摘していますMongoDBのJDBCサポートはありません:https://jira.mongodb.org/browse/JAVA-539 –