【问题标题】:How does spark saveAsTable work while reading and writing to hive tablespark saveAsTable 在读取和写入 hive 表时如何工作
【发布时间】:2020-06-06 03:24:54
【问题描述】:

我有以下代码:

Dataset<Row> rows = sparkContext.sql ("select from hive tables with multiple joins");
rows.saveAsTable(writing to another external table in hive immediately);

1) 在上述情况下,当调用saveAsTable() 时,spark 会将整个数据集加载到内存中吗?

1.1) 如果是,那么当这个查询实际上可以返回大量无法放入内存的数据时,我们如何处理这种情况?

2) 当服务器崩溃时spark开始执行saveAsTable()向外部Hive表写入数据时,是否有可能将部分数据写入目标Hive表?

2.2) 如果是,我们如何避免不完整/部分数据被持久化到目标 hive 表中?

【问题讨论】:

    标签: apache-spark hadoop hive


    【解决方案1】:

    是的,spark 会将所有数据放在内存中,但使用并行进程。但是当我们写入数据时,它会在写入前使用驱动程序内存来​​存储数据。因此,请尝试增加驱动程序内存。

    所以你有几个选择。如果集群中有内存,则可以根据数据大小增加 num-cores、num-executors、executor-memory 以及 driver-memory。

    如果您无法将所有数据放入内存中,请中断数据并以编程方式循环处理。

    假设源数据按日期分区,您有 10 天的时间来处理。尝试一次处理 1 天并写入暂存数据帧。然后根据最终表中的日期创建分区,并在循环中每次覆盖日期。

    【讨论】:

    • 您好,如果数据无法装入内存,Spark 会不会将数据加载到磁盘上? (我们从 hive 表中获取并插入另一个 hive 表的情况)例如,如果我们使用 createTempView 并将其显式定义为 IN MEMORY,我同意它将全部在内存中。谢谢
    • 没错。数据帧的默认持久级别是磁盘和内存。但是如果你想缓存/磁盘只持久化,那将期望所有数据都适合内存。
    猜你喜欢
    • 2020-03-08
    • 2023-03-31
    • 1970-01-01
    • 2017-04-03
    • 2023-03-26
    • 2020-10-06
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多