为什么spark python udf执行时间在不同的分区策略上有10倍的差异?

时间:2016-07-15 03:39:04

标签: apache-spark dataframe pyspark apache-spark-sql udf

我在两个作业之间的执行时间差异很大(超过10x~100x),只有分区策略不同,想知道原因:)

观察:

  1. 按分区号重新分区,均衡记录比2慢10~100倍。
  2. 按列重新分区:phone_country_code
  3. 来自火花历史,只有差异为1.得到较小的(10~20%)洗牌读取大小。
  4. 我的环境:

    • Spark 1.6.1 on EMR 4.7
    • Python 2.7
    • 使用pyspark提交工作

    Spark Job:

    • python udf解析时区信息的电话号码
    • 通过spark-redshift从redshift读取数据并回写

    代码示例:

    from pyspark import SparkContext, SparkConf
    from pyspark.sql.types import DateType, TimestampType, StringType
    from pyspark.sql import SQLContext
    from pyspark.sql.functions import col, udf
    
    conf = SparkConf().setAppName("extract_local_time")
    sc = SparkContext(conf=conf)
    sql_context = SQLContext(sc)
    sc.addPyFile("s3://xxx/xxx.zip")
    
    def local_time(phone_number, datetime_org):
        from util import phonenumber_util
        local_time = phonenumber_util.convert_to_local_datetime_by_phone_number(
                phone_number,
                datetime_org)
        return local_time.replace(tzinfo=None)
    
    local_time_func = udf(local_time, TimestampType())
    
    df = sql_context.read \
        .format("com.databricks.spark.redshift") \
        .option("url", "jdbc:redshift://xxx") \
        .option("query", "select * from xxx") \
        .option("tempdir", "s3n://xxx") \
        .load()
    
    
    # df = df.repartition(12*10)    # partition strategy 1
    df = df.repartition('phone_country_code')   # partition strategy 2
    
    df2 = df.withColumn("datetime_local", local_time_func(col("phone_number"), col("datetime")))
    df2.registerTempTable("xxx")
    sql_context.sql("SELECT * FROM xxx") \
        .write.format("com.databricks.spark.redshift") \
        .option("url", "jdbc:redshift://xxx") \
        .option("tempdir", "s3n://xxx") \
        .option("dbtable", "xxx") \
        .mode("overwrite") \
        .save()
    

    数据样本:

    phone_number, phone_country_code
    55-82981399971, 55
    1-7073492922, 1
    90-5395889859, 90
    

    我的猜测:

    • udf上jvm-py级别的某些优化取决于分区的记录分布?

    感谢您提出任何进一步的建议:)

0 个答案:

没有答案