最近在整理关于小文件合并的一些问题,以下是一些mr的参数优化
-- 每个Map最大输入大小(这个值决定了合并后文件的数量)
set mapred.max.split.size = 256000000;
-- 一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node = 100000000;
-- 一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack = 100000000;
-- 执行Map前进行小文件合并
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
-- 设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true;
-- 设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true;
-- 设置合并文件的大小
set hive.merge.size.per.task = 256000000;
-- 当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize = 16000000;
-- 分区模式
-- 设置动态分区
set hive.exec.dynamic.partition = true;
-- 设置非严格模式
set hive.exec.dynamic.partition.mode = nonstrict;
-- 设置非严格检查
set hive.strict.checks.no.partition.filter = false;
-- 设置非严格模式
set hive.mapred.mode = nostrict;
-- –单个节点上的mapper/reducer允许创建的最大分区
set hive.exec.max.dynamic.partitions.pernode=1000;
-- –允许动态分区的最大数量
set hive.exec.max.dynamic.partitions=1500;
-- 一个mapreduce作业能创建的HDFS文件最大数
set hive.exec.max.created.files=100000;
我想知道sparkonhive这些参数是否还能生效?spark底层是rdd,设置map或者reduce的相关参数是不是就无法生效了?
引用 皆我百晓生 小程序回复内容作答:
对于Spark on Hive, 一些MapReduce相关的参数仍然可以生效,但是设置Spark相关的参数对其不起作用。
Spark底层使用的是RDD(弹性分布式数据集),因此需要通过设置Spark的相关参数来进行优化。这些参数可以通过SparkConf对象进行设置,然后传递给SparkSession或SparkContext。例如,可以使用以下代码设置Spark的分区数量和执行任务的最大内存使用量:
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("example") \
.config("spark.sql.shuffle.partitions", "10") \
.config("spark.executor.memory", "4g") \
.getOrCreate()
同样,通过设置RDD的相关参数可以对其进行优化,例如,通过调用repartition()
方法来重新分区,或调用cache()
方法将RDD持久化到内存中。
需要注意的是,Spark on Hive使用Hive的元数据和执行引擎,因此某些Hive参数仍然会影响Spark on Hive的行为。但是,对于Spark on Hive自身独有的参数,需要使用Spark相关的配置来进行设置。