Apache spark 通过PySpark设置配置单元属性

Apache spark 通过PySpark设置配置单元属性,apache-spark,hadoop,hive,pyspark,Apache Spark,Hadoop,Hive,Pyspark,我想覆盖给定表中的分区。SQL命令已经准备好,直接在配置单元中执行时工作正常: INSERT OVERWRITE TABLE mytable PARTITION (dt, event_name) SELECT * FROM mytable2 为了管理文件大小,我预先设置了一些配置单元属性,如下所示: SET hive.merge.smallfiles.avgsize=268435456; SET mapreduce.map.memory.mb=20000; SET hive.exec.max

我想覆盖给定表中的分区。SQL命令已经准备好,直接在配置单元中执行时工作正常:

INSERT OVERWRITE TABLE mytable PARTITION (dt, event_name) SELECT * FROM mytable2 
为了管理文件大小,我预先设置了一些配置单元属性,如下所示:

SET hive.merge.smallfiles.avgsize=268435456;
SET mapreduce.map.memory.mb=20000;
SET hive.exec.max.dynamic.partitions=50000;
SET mapreduce.reduce.memory.mb=20000;
SET hive.exec.dynamic.partition=true;
SET mapreduce.map.java.opts=-Xmx18000m;
SET hive.merge.size.per.task=268435456;
SET mapred.max.split.size=70000000;
SET hive.exec.dynamic.partition.mode=nonstrict;
SET mapreduce.reduce.java.opts=-Xmx18000m;
SET mapred.min.split.size=35000000;
这确保所有写入的文件都大于256MB,这正是我想要的。 现在,我需要从PySpark执行此脚本,因为我正在不同的源表上循环,并且我使用以下代码在我的SparkContext和HiveContext/SqlContext中相应地设置属性:

conf = SparkConf().setAppName("my script").setMaster(master)

config_settings = {
    'mapreduce.map.memory.mb': '20000',
    'mapreduce.map.java.opts': '-Xmx18000m',
    'mapreduce.reduce.memory.mb': '20000',
    'mapreduce.reduce.java.opts': '-Xmx18000m',
    'hive.exec.dynamic.partition': 'true',
    'hive.exec.dynamic.partition.mode': 'nonstrict',
    'hive.merge.smallfiles.avgsize': '268435456',
    'hive.merge.size.per.task': '268435456',
    'mapred.max.split.size': '70000000',
    'mapred.min.split.size': '35000000',
    'hive.exec.max.dynamic.partitions': '50000',
    #'hive.exec.compress.output': 'true',
    #'parquet.compression': 'GZIP',
}

map(lambda x: conf.set(x[0], x[1]), config_settings.items())

sc = SparkContext(conf=conf)
sqlContext = HiveContext(sc)

map(lambda x: sqlContext.setConf(x[0], x[1]), config_settings.items())

sqlContext.sql("INSERT OVERWRITE TABLE mytable PARTITION (dt, event_name) SELECT * FROM mytable2")
但是,这似乎不起作用,因为它只生成默认大小(64 MB)的文件 我在Spark 1.6和2.3中尝试了这一点,以及如何设置这些属性的不同变体,但似乎都不起作用

当我调用sc._conf.getAll()或sqlContext.getConf(…)时,看起来所有属性都设置正确


设置这些配置的正确语法是什么,以便在使用sqlContext.sql(“插入覆盖…”)时也遵守这些配置?

Spark使用自己的库进行sql解析/数据读取/数据处理/数据写入。您提到的大多数属性都是特定于Hive和MapReduce的,因此Spark会忽略这些属性(有些属性也会被TEZ忽略)。这是否回答了您的问题?感谢@mazaneicha提供的链接,我将尝试一下,并在收到结果后立即报告!设置sc.hadoopConfiguration.setInt(“mapred.min.split.size”,minSplit)sc.hadoopConfiguration.setInt(“mapred.max.split.size”,maxslit)有一些影响,但也不是期望的/预期的影响。文件大小变大,但仍不在指定范围内