在hadoop集群上运行PySpark-SQL时执行时间长吗?

时间:2019-04-24 19:12:17

标签: pyspark pyspark-sql

我有一个天气数据集,我正在尝试查询它来获取每年的平均低点和平均高点。我提交工作并获得期望的结果没有问题,但是要花几个小时才能运行。我以为它会运行得更快,是我做错了事还是不是我想的那么快?

数据是一个csv文件,具有超过100,000,000个条目。 这些列是日期,气象站,测量值(TMAX或TMIN)和值

我正在大学的hadoop集群上运行该作业,没有比该集群更多的信息了。

谢谢!

import sys
from random import random
from operator import add
from pyspark.sql import SQLContext, Row
from pyspark import SparkContext

if __name__ == "__main__":
    sc = SparkContext(appName="PythonPi")
    sqlContext = SQLContext(sc)
    file = sys.argv[1]
    lines = sc.textFile(file)
    parts = lines.map(lambda l: l.split(","))
    obs = parts.map(lambda p: Row(station=p[0], date=int(p[1]) , measurement=p[2] , value=p[3]  )  ) 
    weather = sqlContext.createDataFrame(obs)
    weather.registerTempTable("weather")


    #AVERAGE TMAX/TMIN PER YEAR
    query2 = sqlContext.sql("""select SUBSTRING(date,1,4) as Year, avg(value)as Average, measurement
                                from weather
                                where value<130 AND value>-40 
                                group by measurement, SUBSTRING(date,1,4) 
                                order by SUBSTRING(date,1,4) """)

    query2.show()
    query2.rdd.map(lambda x: ",".join(map(str, x))).coalesce(1).saveAsTextFile("hdfs:/user/adduccij/tmax_tmin_year.csv")
    sc.stop()


1 个答案:

答案 0 :(得分:0)

确保火花作业实际上是在集群(而非本地)模式下启动的。例如如果您使用的是yarn,则作业以“ yarn-client”模式启动。

如果是这样,请确保您提供了足够的#executors / cores / executor和驱动程序内存。您可以从资源管理器(例如yarn)页面或spark上下文(sqlContext.getAllConfs)中获取实际的群集/作业信息。

1亿条记录并不小。假设每条记录为30个字节,但总大小仍为3gb,如果您只有少数执行者,则可能需要一段时间。

让我们说以上建议无济于事,然后尝试找出查询的哪一部分需要花费很长时间。加快速度的一些技巧是:

  • 缓存天气数据帧

  • 将查询分为2部分:第一部分进行分组,并缓存输出

  • 第二部分按

  • 排序
  • 代替合并,使用默认分片编写rdd,然后执行mergeFrom从shell获取csv输出。