2017-10-26 17 views
4

私はプロジェクトに取り組んでいます。私は次のシナリオで立ち往生しています。Apache Sparkを使用してテーブルに複数挿入する

Iテーブルを持っている:superMerge(ID、名前、給料)

及びI 2つの他のテーブルを有する:TABLE1および表2

すべてのテーブル(テーブル1、表2及びsuperMerge)は、同じ構造を有しています。

私の挑戦は、table1とtable2のsuperMergeテーブルを挿入/更新することです。 テーブル1は10分ごとに更新され、20分ごとにテーブル2が更新されるため、時刻t = 20分に2つのジョブが同じテーブル(この場合はスーパーマージ)を更新しようとしています。

この並列挿入/更新/ Sparkや他のハープアプリケーションを使ってsuperMergeテーブルにマージする。

+0

テーブルについて詳しく説明できますか? superMergeで何をしようとしていますか?常にtable1とtable2を同じ場所に追加し、必要に応じてその場所からsuperMergeを読み込むのは間違っていますか? – ayplam

+0

superMergeは、通常のテーブルではなくテーブル1と2のビューであるため、superMergeを更新する必要はありません。 –

+1

@ArthurJuliãoがビューを作成することはオプションであり、私は実際に直接ルートがないというそのルートを取ることになります。私は解決策を探していますおそらくスパークまたはフェニックスは私が認識していない提供しています – GKV

答えて

5

ここで問題となるのは、2つのジョブが互いに通信し合うことができず、他のジョブが何をしているのかわからないことです。

  • 各ジョブは、HDFS上の特定のフォルダに(空の)ファイルを作成し、更新/挿入が進行し、削除していることを示す。比較的簡単な解決策は、基本的なファイルベースの「ロック」システムを実現することwhouldそのファイルが完了した場合

  • ここで、各ジョブは、更新/挿入を開始する前に、そのようなファイルが存在するかどうかをチェックする必要があります。存在する場合、ジョブはファイルがなくなるまで待機する必要があります。

1

ジョブコード1を制御できますか?& job2?あなたはどうやってそれらをスケジュールしますか?

一般に、これら2つのジョブを10分ごとに実行する1に変換できます。 20分後には、この統合ジョブは異なるモード(2つのテーブルからマージ)で実行されますが、デフォルトモードは1つのテーブルのみからマージされます。 同じドライバを使用している場合、2つのジョブ(ロックなど)の間で同期は必要ありません。この解決策は、ジョブが10分未満で終了していることを前提としています。

1

あなたのデータセットの量はどれくらいですか?あなたはバッチ(スパーク)でそれをやろうとしているのですか、またはあなたの挿入/更新をストリームすることができますか(スパークストリーミング)?

  • 打ち上げ1つのジョブだけを2つのテーブルを処理することができ、10分毎:

    あなたはバッチでそれをしたいと仮定します。あなたが表1と表2を持っていれば、連合を行い、superMergeに参加してください。イゴール・バーマンが提案したとおり。

  • superMergeテーブルが大きくなり、参加に時間がかかることに注意してください。
0

私はこのような状況に直面して、位置1にtb1 DF1を書き込み、位置2にtb2 DF2を書き込み、最後にパスをスーパーマージテーブルに切り替えるだけで、テーブルを挿入しても消費する特にハイブのランタイムの多く。ステージングの場所に上書き

は、場所1と場所2:

スーパーマージテーブルへのパスを切り替える
df1.write.mode("overwrite").partitionBy("partition").parquet(location1) 

df2.write.mode("overwrite").partitionBy("partition").parquet(location2) 

hiveContext.sql(alter table super_merge_table add if not exists partition(partition=x); LOAD DATA INPATH 'location1/partition=x/' INTO TABLE super_merge_table partition(partition=x))" 

hiveContext.sql(alter table super_merge_table add if not exists partition(partition=x); LOAD DATA INPATH 'location2/partition=x/' INTO TABLE super_merge_table partition(partition=x))" 

あなたは他のものを上書きせずに、並列マージを行うことができます。

関連する問題