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

在hadoop集群上运行PySpark SQL时执行时间长?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我有一组天气数据,我试图查询它以获得每年的平均低点和平均高点。我没有问题提交的工作,并得到预期的结果,但它是需要几个小时来运行。我以为它会跑得更快,是我做错了什么,还是它没有我想象的那么快 数据是一个csv文件,包含超过100000000个条目。 这些列是日期、气象站、MeasurementTtmax或TMIN和值 我在我大学的hadoop集群上运行这个任务,我没有更多关于集群的信息 提前谢谢 导入系统 从随机导入随机 从操作员导入添加 从pyspark.sql导入SQLContext,第行 从

我有一组天气数据,我试图查询它以获得每年的平均低点和平均高点。我没有问题提交的工作,并得到预期的结果,但它是需要几个小时来运行。我以为它会跑得更快,是我做错了什么,还是它没有我想象的那么快

数据是一个csv文件,包含超过100000000个条目。 这些列是日期、气象站、MeasurementTtmax或TMIN和值

我在我大学的hadoop集群上运行这个任务,我没有更多关于集群的信息

提前谢谢

导入系统 从随机导入随机 从操作员导入添加 从pyspark.sql导入SQLContext,第行 从pyspark导入SparkContext 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: sc=SparkContextappName=PythonPi sqlContext=SQLContextsc file=sys.argv[1] lines=sc.textFilefile parts=lines.maplambda l:l.split, obs=parts.maplambda p:Rowstation=p[0],date=intp[1],measurement=p[2],value=p[3] weather=sqlContext.createDataFrameobs weather.registerTempTableweather 每年平均TMAX/TMIN query2=sqlContext.sqlselect SUBSTRINGdate,1,4为年份,avgValue为平均值,度量 天气预报 价值-40在哪里 按测量分组,子字符串日期,1,4 按子字符串日期排序,1,4 查询2.show query2.rdd.maplambda x:,.joinmapstr,x.coalesce1.saveAsTextFilehdfs:/user/inclusioncij/tmax\u tmin\u year.csv sc.停止
确保spark作业实际上是在集群而不是本地模式下启动的。e、 g.如果您使用的是纱线,则作业将以“纱线客户端”模式启动

如果这是真的,那么请确保您提供了足够的执行器/内核/执行器和驱动程序内存。您可以从资源管理器(如Thread页面)或spark context sqlContext.getAllConfs获取实际群集/作业信息

100Mil记录并不是那么小。假设每条记录有30个字节,但总大小仍然是3gb,如果只有少数几个执行器,这可能需要一段时间

假设上面的建议没有帮助,那么试着找出查询的哪个部分需要很长时间。以下是一些加速技巧:

缓存天气数据帧

将查询分为两部分:第一部分按分组,并缓存输出

第二部分按顺序排列

不要合并,而是使用默认碎片编写rdd,然后执行mergeFrom以从shell获取csv输出


确保spark作业实际上是在集群而不是本地模式下启动的。e、 g.如果您使用的是纱线,则作业将以“纱线客户端”模式启动

如果这是真的,那么请确保您提供了足够的执行器/内核/执行器和驱动程序内存。您可以从资源管理器(如Thread页面)或spark context sqlContext.getAllConfs获取实际群集/作业信息

100Mil记录并不是那么小。假设每条记录有30个字节,但总大小仍然是3gb,如果只有少数几个执行器,这可能需要一段时间

假设上面的建议没有帮助,那么试着找出查询的哪个部分需要很长时间。以下是一些加速技巧:

缓存天气数据帧

将查询分为两部分:第一部分按分组,并缓存输出

第二部分按顺序排列

不要合并,而是使用默认碎片编写rdd,然后执行mergeFrom以从shell获取csv输出


试试我提到的建议。如果您提供更多的细节,例如执行者和代码的哪一部分实际花费了很长时间,也许我可以提供更多的输入。尝试一下我提到的建议。如果您提供更多的细节,例如执行者和代码的哪一部分实际花费了很长时间,也许我可以提供更多的输入。分解查询和缓存非常有帮助。你能再解释一下第四个项目符号吗?与其合并,不如编写带有默认碎片的rdd,然后执行mergeFrom,从shell获得csv输出。好的,太好了。第四点是关于.coalesce1,您在写入文本文件之前执行的操作。这实际上会导致rdd在写入hdfs之前被重新分配到1个分区中。这也可能是一个缓慢的操作。如果您这样做是为了只在输出中获得1个文件,那么同样的事情也可以通过将rdd写入hdfs中,然后运行以下命令将输出合并到单个文件中来实现:hdfs dfs-getmerge/user/incoluccij/tmax_tmin_year.csv single_file_out.csvb分离查询和缓存有很大帮助。你能再解释一下第四个项目符号吗?与其合并,不如编写带有默认碎片的rdd,然后执行mergeFrom,从shell获得csv输出。好的,太好了。第四点是关于.coalesce1,您在写入文本文件之前执行的操作。这基本上会导致您的rdd得到r 在写入hdfs之前,已将EDI分配到1个分区中。这也可能是一个缓慢的操作。如果这样做是为了在输出中只得到一个文件,那么同样的事情也可以通过将rdd写入hdfs中,然后运行以下命令将输出合并到单个文件中来实现:hdfs dfs-getmerge/user/incoluccij/tmax\u tmin\u year.csv single\u file\u out.csv