第一次执行火花大约需要13秒,但是第二次,每次需要3.5秒

时间:2019-03-05 16:49:15

标签: 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.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查询)的一些知识。我有没有可能解决这个问题。附言:我是新用户,对不起,如果我的问题不够清楚或其他问题,对不起。

1 个答案:

答案 0 :(得分:0)

完全可以预期会有这样的延迟。跳过一个简单的事实,即Spark并非旨在直接用于交互式应用程序中嵌入(也不适用于实时查询),因此存在相当大的开销

  • 初始化上下文。
  • 从集群管理器获取资源。
  • 从Cassandra获取元数据。

问题是,在这里完全使用Spark是否有意义-如果您需要接近实时的响应,并且将完整的结果收集到驱动程序中,则使用native Cassandra connector应该是更好的选择。

但是,如果您打算执行Cassandra本身不支持的逻辑,那么您所能做的就是接受这种间接体系结构的成本。