[英]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)?
讓我們假設您想要批量執行:
我遇到這種情況,將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.