执行 insert overwrite 语句,产生了200个小文件。 试过配置参数:spark.sql.shuffle.partitions=1, 但这个导致所有reduce阶段均只有一个并行度,影响了执行效率。
 大家,有没有什么办法能解决这个问题呢?

解决方案 »

  1.   

    repartition(1)
      

  2.   

    200是Spark sql的默认并行度。别人都嫌弃他太慢了要调高并行度,你居然要降低它的并行度,你如果真的嫌弃他太多了,你可以适当降低它的并行度,调节参数
    spark.sql.shuffle.partitions
      

  3.   

    你不妨在进行写入之前进行coalesce(num)这样试试,我试了一下,至少小数据量还是可以的,像这样:
    specialDaysInMall.toDF("name", "age", "address").coalesce(3)
            .registerTempTable("inMall")
    hqx.sql("insert overwrite table t1 select name,age,address from inMall")
    这样之后,在使用sql进行insert或者overwrite形式进行写入hive表,这样结果应该就只会生成3个parquet文件,不妨一试
      

  4.   

    如果每个文件都小于HDFS BlockSize,那还是有调整的必要,否则没必要在写入前reparation。
    因为一个是会增加一次shuffle,二个如果数据集已经排序,shuffle会把顺序打乱。
    所以如果真有调整的必要,建议是在写入前一个步骤插入reparation(n)。
    例如
    rdd.map(xxx).filter(xxx).sortBy(xxx).write(xxx) 在sortBy前进行reparation
      

  5.   

    对计算完成之后的rdd,再coalesce一下
      

  6.   

    coalesce(1) 望采纳
      

  7.   

    并行度决定了产生多少个文件, 要么在文件数量和并行度之间找个平衡, 要么尝试一下adaptive