使用apachespark向表中多次插入

pvabu6sv  于 2021-06-02  发布在  Hadoop
关注(0)|答案(4)|浏览(406)

我在做一个项目,我被困在下面的场景。
我有一张table:supermerge(身份证、姓名、薪水)
我还有另外两张table:表1和表2
所有的表(表1、表2和supermerge)都有相同的结构。
现在,我的挑战是从表1和表2插入/更新supermerge表。表1每10分钟更新一次,表2每20分钟更新一次,因此在时间t=20分钟时,我有两个作业试图更新同一个表(在这种情况下是超级大)
我想了解如何使用spark或任何其他hadoop应用程序将这个并行插入/更新/合并到supermerge表中。

uurity8g

uurity8g1#

面对这种情况,我将tb1 df1写入位置1,将tb2 df2写入位置2,最后只需切换到超级合并表的路径,也可以执行表到表的插入,但这会消耗大量运行时,特别是在配置单元中。
覆盖暂存位置位置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))"

您可以进行并行合并,而无需覆盖另一个。

lc8prwob

lc8prwob2#

你的数据集有多大?你计划成批做(spark),或者你可以流你的插入/更新(spark流)?
假设您要成批执行:
每10分钟只启动一个可以处理两个表的作业。如果你有表1和表2,做一个并集,然后用supermerge连接。正如伊戈尔·伯曼所说。
小心你的超级能量表会变大你的加入会花更长的时间。

svmlkihl

svmlkihl3#

你能控制job1和job2的代码吗?你是怎么安排的?
通常,您可以将这两个作业转换为每10分钟运行一次的作业。每20分钟一次,此统一作业以不同的模式运行(从2个表合并),而默认模式将仅从1个表合并。所以,当你有相同的驱动程序-你不需要任何两个工作之间的同步(例如锁定)。此解决方案假设作业在10分钟内完成。

olhwl3o2

olhwl3o24#

这里的问题是,这两份工作不能相互交流,不知道对方在做什么。一个相对简单的解决方案是实现一个基本的基于文件的“锁定”系统:
每个作业在hdfs上的特定文件夹中创建一个(空)文件,指示更新/插入正在进行,并在作业完成时删除该文件
现在,在开始更新/插入之前,每个作业都必须检查这样的文件是否存在。如果存在,作业必须等到文件消失。

相关问题