Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 使用ApacheSpark向表中多次插入_Hadoop_Apache Spark_Bigdata_Phoenix - Fatal编程技术网

Hadoop 使用ApacheSpark向表中多次插入

Hadoop 使用ApacheSpark向表中多次插入,hadoop,apache-spark,bigdata,phoenix,Hadoop,Apache Spark,Bigdata,Phoenix,我正在做一个项目,我被困在下面的场景中 我有一张桌子:superMerge(身份证、姓名、薪水) 我还有另外两张桌子:表1和表2 所有表(表1、表2和superMerge)都具有相同的结构 现在,我的挑战是从表1和表2中插入/更新superMerge表。 表1每10分钟更新一次,表2每20分钟更新一次,因此,在时间t=20分钟时,我有两个作业试图更新同一个表(在本例中为超级麦格) 我想了解如何使用Spark或任何其他hadoop应用程序将此并行插入/更新/合并到superMerge表中。这里的问

我正在做一个项目,我被困在下面的场景中

我有一张桌子:superMerge(身份证、姓名、薪水)

我还有另外两张桌子:表1和表2

所有表(表1、表2和superMerge)都具有相同的结构

现在,我的挑战是从表1和表2中插入/更新superMerge表。 表1每10分钟更新一次,表2每20分钟更新一次,因此,在时间t=20分钟时,我有两个作业试图更新同一个表(在本例中为超级麦格)


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

这里的问题是这两个作业无法相互通信,不知道对方在做什么。一个相对简单的解决方案是实现一个基本的基于文件的“锁定”系统:

  • 每个作业在HDFS上的特定文件夹中创建一个(空)文件,指示更新/插入正在进行,并在作业完成时删除该文件

  • 现在,在开始更新/插入之前,每个作业都必须检查此类文件是否存在。如果存在,则作业必须等待文件消失


您能控制作业1和作业2的代码吗?你是怎么安排的

通常,您可以将这两个作业转换为每10分钟运行一次的作业。每20分钟一次,此统一作业以不同模式运行(从2个表合并),而默认模式将仅从1个表合并。
因此,当您有相同的驱动程序时,您不需要在两个作业之间进行任何同步(例如锁定)。此解决方案假设作业在10分钟内完成。

您的数据集有多大?您是否计划成批(Spark)或流式传输插入/更新(Spark流式传输)

让我们假设您希望批量执行此操作:

  • 每10分钟只启动一个可以处理这两个表的作业。如果你有表1和表2,做一个并集,然后加入superMerge。正如伊戈尔·伯曼所建议的那样
  • 小心你的超级能量表会变大,你的加入会花费更长的时间

面对这种情况,我将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))"

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

您能详细描述一下这些表吗?你想用superMerge做什么?不断地将表1和表2附加到同一位置,然后在必要时从该位置读取superMerge in有什么错?superMerge可能是表1和表2的视图,而不是普通表,这将避免更新superMerge的需要。@ArthurJulião创建视图是一种选择,我实际上会选择这条路线,因为没有直接的解决方案。但我正在寻找一个解决方案,可能是spark或phoenix提供的,我不知道