Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 连接的Spark性能分析_Performance_Apache Spark_Bigdata_Distributed Computing_Apache Spark Sql - Fatal编程技术网

Performance 连接的Spark性能分析

Performance 连接的Spark性能分析,performance,apache-spark,bigdata,distributed-computing,apache-spark-sql,Performance,Apache Spark,Bigdata,Distributed Computing,Apache Spark Sql,输入数据 我有两个表作为csv文件从MySQL导出 表1磁盘大小:250 MB 记录:70万 表2磁盘大小:350 MB 记录:60万 代码更新 import org.apache.spark.sql.SQLContext val sqlContext = new SQLContext(sc) val table-one = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("exam

输入数据

我有两个表作为csv文件从MySQL导出

表1磁盘大小:250 MB 记录:70万

表2磁盘大小:350 MB 记录:60万

代码更新

import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
val table-one = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("example-input-files/table-1-data.csv”)
table-one.registerTempTable(“table-one”)
val table-two = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("example-input-files/table-2-data.csv”)
table-two.registerTempTable(“table”-two)
sqlContext.cacheTable(“table-one”)
sqlContext.cacheTable(“table-two”)
val result = sqlContext.sql("SELECT table-one.ID,table-two.ID FROM table-one LEFT JOIN table-two ON table-one.ID = table-two.ID")
result.take(2).foreach(println)
火花作业

  • 使用读取两个csv文件并将其注册为 桌子

  • 使用公共列(典型的左列)对两个对象执行左联接 加入关系数据库

  • 打印前两个结果,因为在控制台上打印本身会 浪费时间

这总的来说需要30秒。我在一台有足够内存的机器上运行,这样两个文件都可以放进去(毕竟是600Mb)

我有两种管理工作的方式

  • 整体运行作业,即加载所有csv,运行连接,然后打印结果
  • 第二种方式,我首先使用
    sqlContext.cacheTable(“the_table”)
缓存之后,我发现join操作本身需要8秒才能完成

这个时间合理吗?我猜不是这样的,可以做很多优化来加速查询

我看到的优化

import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
val table-one = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("example-input-files/table-1-data.csv”)
table-one.registerTempTable(“table-one”)
val table-two = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load("example-input-files/table-2-data.csv”)
table-two.registerTempTable(“table”-two)
sqlContext.cacheTable(“table-one”)
sqlContext.cacheTable(“table-two”)
val result = sqlContext.sql("SELECT table-one.ID,table-two.ID FROM table-one LEFT JOIN table-two ON table-one.ID = table-two.ID")
result.take(2).foreach(println)
  • 将数据放入HDFS而不是本地磁盘。这会加快检索速度吗
  • 在集群上运行时,我猜这不会很快,因为数据可以放入内存,并且顺序会更快
  • 数据建模和使用cassandra会更快吗
  • 我使用的是纯SQL连接,RDD连接会更快吗

还有其他更好的方法吗?

正如评论员所提到的,Spark是为分布式计算而设计的。当在本地处理小型(ish)数据时,所有初始化和调度的开销足以使Spark看起来比其他PL慢

在集群上运行,我猜这不会很快,因为 数据可以放入内存,并且顺序将更快

只要代码执行狭窄的转换,执行器就会处理内存中数据的本地副本,所以这并不完全正确。然而,您的代码执行一个连接,这是一个广泛的转换-这意味着块必须在网络中被洗牌。记住这一点。广泛的转换是昂贵的,所以尽可能多地将它们放在DAG的末尾。但同样,您的数据太小,您可能看不到好处


另一件事是,如果你有蜂箱,那么你可以考虑将数据存储在你的连接列上的一个表中。

用SK是一个小数据量和使用Snice设计来加速分布式计算时使用单个节点,性能测试有点棘手。我认为您是对的,当您的数据如此大时,不值得使用集群或HDFS。你能告诉我你的代码吗?@mattinbits:我已经更新了代码。试图在单个节点上优化代码不是一个好主意。尝试为批处理集群计算引擎优化30秒和8秒运行时不是一个好主意。试图用Spark处理600MB的数据不是一个好主意。将数据放入拼花地板格式并压缩,这将提高性能。如果缓存有这么大的帮助,您需要花费大量时间来读取数据并对其进行反序列化,那么Parquet将改善这一点。我不会对优化8秒运行时间发表评论Spark@0x0FFF当前位置这正是我问这个问题的原因,我不知道从哪里开始。我只是在尝试,谢谢你的建议,我会记住这一点。