Spark Group By和Rank功能运行速度非常慢

时间:2018-01-05 06:21:25

标签: scala apache-spark apache-spark-sql elasticsearch-spark

我正在编写一个spark应用程序,用于在一个时间范围内查找前n个访问过的URL。但是这个工作一直在运行,并且ES中的389451个记录需要几个小时来实例化。我想减少这个时间。

我正在阅读火花中的弹性搜索,如下所示

 val df = sparkSession.read
    .format("org.elasticsearch.spark.sql")
    .load(date + "/" + business)
    .withColumn("ts_str", date_format($"ts", "yyyy-MM-dd HH:mm:ss")).drop("ts").withColumnRenamed("ts_str", "ts")
    .select(selects.head, selects.tail:_*)
    .filter($"ts" === ts)
    .withColumn("url", split($"uri", "\\?")(0)).drop("uri").withColumnRenamed("url", "uri").cache()

在上面的DF中,我正在从ElasticSearch读取和过滤。我也从URI中删除查询参数。

然后我正在做小组

var finalDF = df.groupBy("col1","col2","col3","col4","col5","uri").agg(sum("total_bytes").alias("total_bytes"), sum("total_req").alias("total_req"))

然后我正在运行一个窗口函数

val partitionBy = Seq("col1","col2","col3","col4","col5")

val window = Window.partitionBy(partitionBy.head, partitionBy.tail:_*).orderBy(desc("total_req"))


finalDF = finalDF.withColumn("rank", rank.over(window)).where($"rank" <= 5).drop("rank")

然后我将finalDF写入cassandra

finalDF.write.format("org.apache.spark.sql.cassandra").options(Map("table" -> "table", "keyspace" -> "keyspace")).mode(SaveMode.Append).save()

我在ES集群中有4个数据节点,My Spark机器是16个内核64GB Ram VM。请帮我找出问题所在。

1 个答案:

答案 0 :(得分:-1)

在阅读后保留数据帧可能是一个好主意,因为您将在排名功能中使用这么多次。