我有一个天气数据集,我正在尝试查询它来获取每年的平均低点和平均高点。我提交工作并获得期望的结果没有问题,但是要花几个小时才能运行。我以为它会运行得更快,是我做错了事还是不是我想的那么快?
数据是一个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()
答案 0 :(得分:0)
确保火花作业实际上是在集群(而非本地)模式下启动的。例如如果您使用的是yarn,则作业以“ yarn-client”模式启动。
如果是这样,请确保您提供了足够的#executors / cores / executor和驱动程序内存。您可以从资源管理器(例如yarn)页面或spark上下文(sqlContext.getAllConfs)中获取实际的群集/作业信息。
1亿条记录并不小。假设每条记录为30个字节,但总大小仍为3gb,如果您只有少数执行者,则可能需要一段时间。
让我们说以上建议无济于事,然后尝试找出查询的哪一部分需要花费很长时间。加快速度的一些技巧是:
缓存天气数据帧
将查询分为2部分:第一部分进行分组,并缓存输出
第二部分按
代替合并,使用默认分片编写rdd,然后执行mergeFrom从shell获取csv输出。