Apache spark 第一次执行spark大约需要13秒,但是第二次,每隔3.5秒执行一次

Apache spark 第一次执行spark大约需要13秒,但是第二次,每隔3.5秒执行一次,apache-spark,flask,pyspark,Apache Spark,Flask,Pyspark,我正在使用pyspark和Flask作为交互式spark服务应用程序。 我的应用程序应该得到一些带有参数的请求并返回响应。我的代码在这里: //first I make udf function def dict_list(x, y): return dict((zip(map(str, x), map(str, y)))) dict_list_udf = F.udf(lambda x, y: dict_list(x, y), types.MapType(types.

我正在使用pyspark和Flask作为交互式spark服务应用程序。 我的应用程序应该得到一些带有参数的请求并返回响应。我的代码在这里:

//first I make udf function
def dict_list(x, y):
        return dict((zip(map(str, x), map(str, y))))

dict_list_udf = F.udf(lambda x, y: dict_list(x, y), 
    types.MapType(types.StringType(), types.StringType()))

//then I read my table from cassandra
        df2 = spark.read \
            .format("org.apache.spark.sql.cassandra") \
            .options(table="property_change", keyspace="strat_keyspace_cassandra_raw2") \
            .load()

@app.route("/test/<serviceMatch>/<matchPattern>")
def getNodeEntries1(serviceMatch, matchPattern):

    result_df = df2.filter(df2.id.like(matchPattern + "%") & (df2.property_name == serviceMatch)) \
        .groupBy("property_name") \
        .agg(F.collect_list("time").alias('time'), F.collect_list("value").alias('value'))

    return json.dumps(result_df.withColumn('values', dict_list_udf(result_df.time, result_df.value)).select('values').take(1))
//首先我创建udf函数
定义目录列表(x,y):
返回dict((zip(map(str,x),map(str,y)))
dict_list_udf=F.udf(λx,y:dict_list(x,y),
types.MapType(types.StringType(),types.StringType())
//然后我读了卡桑德拉的表格
df2=spark.read\
.format(“org.apache.spark.sql.cassandra”)\
.options(table=“property\u change”,keyspace=“strat\u keyspace\u cassandra\u raw2”)\
.load()
@应用程序路径(“/test/”)
def getNodeEntries1(服务匹配,匹配模式):
结果\u df=df2.filter(df2.id.like(matchPattern+“%”)和(df2.property\u name==serviceMatch))\
.groupBy(“财产名称”)\
.agg(F.collect_list(“time”).别名(“time”)、F.collect_list(“value”).别名(“value”))
返回json.dumps(result_df.withColumn('values',dict_list_udf(result_df.time,result_df.value))。选择('values')。获取(1))

当我启动我的服务器(使用spark submit)并使用Postman处理get请求时,我第一次给出响应大约需要13秒,之后每一次响应大约需要3秒。不接受先延迟13秒为用户服务。我是spark的新用户,我假设这种行为是由于spark的性质造成的,但我不知道到底是什么原因造成的。可能是关于缓存或编译执行计划(如sql查询)的事情。我有没有可能解决这个问题。Ps我是新用户,所以如果我的问题不清楚或其他什么,我很抱歉

这种延迟是完全可以预料的。跳过Spark不是直接嵌入到交互式应用程序中使用的(也不适用于实时查询)这一简单事实,只会带来很大的开销

  • 正在初始化上下文
  • 从群集管理器获取资源
  • 正在从Cassandra获取元数据
问题是,在这里使用Spark是否有任何意义——如果您需要接近实时的响应,并向驱动程序收集完整的结果,那么使用Spark应该是更好的选择


但是,如果您计划执行Cassandra本身不支持的逻辑,那么您所能做的就是接受这种间接架构的成本。

这只是为了测试。问题是cassandra的CQL不支持分组和聚合,所以我正在测试不同的方法。谢谢你的回答,这很有帮助。