如何提高SaveAsTable性能?

时间:2017-09-06 21:09:50

标签: pyspark apache-spark-sql spark-streaming

我正在运行一个火花流应用程序,但是当我最终将它保存到蜂巢时,它需要花费更多时间,例如15kb数据,大约50秒,第一次流式传输迷你批次,注意到了SPARKUI SQL选项卡,并且每个迷你批次的火花流量也在增加,

saveAsTable at NativeMethodAccessorImpl.java:0+details 
org.apache.spark.sql.DataFrameWriter.saveAsTable(DataFrameWriter.scala:358)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.
invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
py4j.Gateway.invoke(Gateway.java:280)
py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
py4j.commands.CallCommand.execute(CallCommand.java:79)
py4j.GatewayConnection.run(GatewayConnection.java:214)
java.lang.Thread.run(Thread.java:745) 

2 个答案:

答案 0 :(得分:3)

当我们创建Spark DF时,默认情况下会创建200个分区,有时使用小数据200个分区可能会降低性能。

我建议你减少分区数量,看看是否有帮助。

sqlContext.setConf("spark.sql.shuffle.partitions", "10")

您可以使用上面的语句将分区减少到10。

此致

Neeraj

答案 1 :(得分:0)

由于将数据从集群写入文件需要将数据移动到主节点,因此需要进行大量的重排。我可以提供的一些建议是通过以下方式调整SparkContext:

  • 使用Kryo Serializer
  • 通过网络发送前压缩数据
  • 使用JVM垃圾回收
  • 增加你的随机记忆