我正在使用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))
当我启动服务器(使用spark提交)并使用Postman进行请求时,我第一次需要大约13秒才能给我答复,此后每隔3秒就需要答复。最初为用户提供13秒的延迟是不可接受的。我是Spark的新用户,我认为此行为是由于Spark性质引起的,但我不知道到底是什么原因引起的。 Maube关于缓存或编译执行计划(如sql查询)的一些知识。我有没有可能解决这个问题。附言:我是新用户,对不起,如果我的问题不够清楚或其他问题,对不起。
答案 0 :(得分:0)
完全可以预期会有这样的延迟。跳过一个简单的事实,即Spark并非旨在直接用于交互式应用程序中嵌入(也不适用于实时查询),因此存在相当大的开销
问题是,在这里完全使用Spark是否有意义-如果您需要接近实时的响应,并且将完整的结果收集到驱动程序中,则使用native Cassandra connector应该是更好的选择。
但是,如果您打算执行Cassandra本身不支持的逻辑,那么您所能做的就是接受这种间接体系结构的成本。