Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark作业在实现RDD时似乎被卡住了_Apache Spark_Pyspark - Fatal编程技术网

Apache spark PySpark作业在实现RDD时似乎被卡住了

Apache spark PySpark作业在实现RDD时似乎被卡住了,apache-spark,pyspark,Apache Spark,Pyspark,我有一个SparkJob,它首先在N个项目之间创建一个成对的得分矩阵。虽然这是相当快的高达约20K元素之后,它似乎被卡住了很长一段时间。我在多次尝试中看到的最后一行日志是“cleaned acculator”,我在下面附加了代码块,用随机创建的50K元素数据集重新处理问题。笛卡尔乘积非常快,对结果RDD的计数在几分钟内返回(25亿行),但第二次计数会停滞两个多小时,日志或Spark Jobs UI中没有进度更新。我有一个由15个EC2 M3.2x大型节点组成的集群。我怎样才能理解这里发生了什么,

我有一个SparkJob,它首先在N个项目之间创建一个成对的得分矩阵。虽然这是相当快的高达约20K元素之后,它似乎被卡住了很长一段时间。我在多次尝试中看到的最后一行日志是“cleaned acculator”,我在下面附加了代码块,用随机创建的50K元素数据集重新处理问题。笛卡尔乘积非常快,对结果RDD的计数在几分钟内返回(25亿行),但第二次计数会停滞两个多小时,日志或Spark Jobs UI中没有进度更新。我有一个由15个EC2 M3.2x大型节点组成的集群。我怎样才能理解这里发生了什么,以及可以做些什么来加快这一进程

import random
from pyspark.context import SparkContext
from pyspark.sql import HiveContext, SQLContext
import math
from pyspark.sql.types import *
from pyspark.sql.types import Row
sc=SparkContext(appName='kmedoids_test')
sqlContext=HiveContext(sc)
n=50000
A = [random.normalvariate(0, 1) for i in range(n)]
B = [random.normalvariate(1, 1) for i in range(n)]
C = [random.normalvariate(-1, 0.5) for i in range(n)]
df = sqlContext.createDataFrame(zip(A,B,C), ["A","B","C"])
f = lambda x, y : math.pow((x.A - y.A), 2) + math.pow((x.B - y.B), 2) +    math.pow((x.C - y.C), 2)
schema  = StructType([StructField("row_id", LongType(), False)] +       df.schema.fields[:])
no_of_cols=len(df.columns)
rdd_zipped_with_index=df.rdd.zipWithIndex()
reconstructed_rdd = rdd_zipped_with_index.map(lambda x: [x[1]]+list(x[0][0:no_of_cols]))
indexed_df=reconstructed_rdd.toDF(schema)
indexed_rdd = indexed_df.rdd
sc._conf.set("spark.sql.autoBroadcastJoinThreshold","-1") #turning off broadcast join
rdd_cartesian_prod = indexed_rdd.cartesian(indexed_rdd)
print "----------Count in self-join--------------- {0}".format(rdd_cartesian_prod.count()) #this returns quickly in about 160s
ScoreVec = Row("head_id","tail_id","score")
output_rdd = rdd_cartesian_prod.map(lambda x :   ScoreVec(float(x[0].row_id), float(x[1].row_id), float(f(x[0], x[1]))))
print "-----------Count after scoring---------------  {0}".format(output_rdd.count()) #gets stuck here for a LONG time
output_df = output_rdd.toDF() #does not get here
这可能是由于

火花是一样的。它会一直等到你给了它操作符,只有当你要求它给你最后的答案时,它才会进行评估,而且它总是会限制它要做的工作


笛卡尔乘积之后的行数将被索引为
rdd.count()^2
。Spark实际上不需要生成所有这些行来知道将有多少行。虽然
output\u rdd.count()中的行数相同,但实际上Spark正在处理所有数据并在计数之前映射到这些数据。这就是为什么这项任务要花这么长时间。为了证明这就是正在发生的事情,您可以尝试
索引的\u rdd.cache().count()
。计数前的缓存将强制数据处理(并将结果保存在内存中),这将花费很长时间。

如果您不告诉Spark不要太详细,则“清洁的累加器”只是Spark不断吐出的一行。谢谢David。正如您所建议的,我尝试了rdd_cartesian_prod.cache().count()来强制处理自连接rdd。仍然在一分钟内完成,而对于一个30k的数据集,其余的工作需要45分钟以上。我怎样才能加快速度?增加并行性是否会适得其反,最终导致更多的洗牌?