簡體   English   中英

使用Apache Spark多次插入表中

[英]multiple insert into a table using Apache Spark

我正在研究一個項目,我堅持以下方案。

我有一張桌子:superMerge(id,name,salary)

我有另外兩個表:table1和table2

所有表(table1,table2和superMerge)具有相同的結構。

現在,我的挑戰是從table1和table2插入/更新superMerge表。 table1每10分鍾更新一次,table2每20分鍾更新一次因此在時間t = 20分鍾我有2個工作試圖更新同一個表(在這種情況下是superMerge。)

我想了解如何使用Spark或任何其他hadoop應用程序實現此並行插入/更新/合並到superMerge表中。

這里的問題是這兩個工作不能相互通信,不知道對方在做什么。 一個相對簡單的解決方案是實現基於文件的基本“鎖定”系統:

  • 每個作業在HDFS上的特定文件夾中創建一個(空)文件,指示更新/插入正在進行中,並在作業完成時刪除該文件

  • 現在,每個作業必須在開始更新/插入之前檢查是否存在這樣的文件。 如果存在,則作業必須等到文件消失。

你能控制job1和job2的代碼嗎? 你如何安排這些?

通常,您可以將這兩個作業轉換為每10分鍾運行一次的作業。 一旦在20分鍾內,這個統一的作業以不同的模式運行(從2個表合並),而默認模式將僅從1個表合並。 因此,當您擁有相同的驅動程序時 - 您不需要在兩個作業之間進行任何同步(例如鎖定)。 該解決方案假設工作在10分鍾內完成。

您的數據集有多大? 您打算在Batch(Spark)中執行此操作,還是可以流式插入/更新(Spark Streaming)?

讓我們假設您想要批量執行:

  • 每10分鍾只啟動一個可處理兩個表的作業。 如果你有表1和表2做一個聯盟並加入superMerge。 正如伊戈爾伯曼所說。
  • 小心你的superMerge表會變大,你的加入需要更長的時間。

我遇到這種情況,將tb1 DF1寫入location1並將tb2 DF2寫入位置2,最后只需將路徑切換到超級合並表,也可以執行表到表插入,但這會消耗大量的運行時間,尤其是蜂巢。

覆蓋到臨時位置location1和位置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))"

您可以執行並行合並而不會覆蓋其他合並。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM