这是我的python-spark代码的一部分,它的部分内容运行速度太慢,无法满足我的需求。 特别是代码的这一部分,我真的想提高它的速度,但不知道如何。对于6000万个数据行,目前大约需要1分钟,我希望将其提高到10秒以下。
sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load()
我的火花应用程序的更多上下文:
article_ids = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="article_by_created_at", keyspace=source).load().where(range_expr).select('article','created_at').repartition(64*2)
axes = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load()
speed_df = article_ids.join(axes,article_ids.article==axes.article).select(axes.article,axes.at,axes.comments,axes.likes,axes.reads,axes.shares) \
.map(lambda x:(x.article,[x])).reduceByKey(lambda x,y:x+y) \
.map(lambda x:(x[0],sorted(x[1],key=lambda y:y.at,reverse = False))) \
.filter(lambda x:len(x[1])>=2) \
.map(lambda x:x[1][-1]) \
.map(lambda x:(x.article,(x,(x.comments if x.comments else 0)+(x.likes if x.likes else 0)+(x.reads if x.reads else 0)+(x.shares if x.shares else 0))))
非常感谢你的建议。
编辑:
计数占用大部分时间(50秒)不加入
我也试过提高并行度,但它没有任何明显的效果:
sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load().repartition(number)
和
sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source,numPartitions=number).load()
答案 0 :(得分:4)
首先,你应该弄清楚究竟花了多少时间。
例如,确定只需读取数据需要多长时间
axes = sqlContext
.read
.format("org.apache.spark.sql.cassandra")
.options(table="axes", keyspace=source)
.load()
.count()
增加并行读取器的并行度或数量可能会有所帮助,但前提是您没有最大限度地提高Cassandra集群的IO。
其次,看看你是否可以使用Dataframes api完成所有工作。每次使用python lambda时,都会产生python和scala类型之间的序列化成本。
sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source).load().repartition(number)
只有在加载完成后才会生效,所以这对你没用。
sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="axes", keyspace=source,numPartitions=number).load()
不是Spark Cassandra Connector的有效参数,因此不会执行任何操作。
请参阅 https://github.com/datastax/spark-cassandra-connector/blob/master/doc/reference.md#read-tuning-parameters 输入拆分大小确定要放入Spark分区的C *分区数。