为什么在 spark 中使用 hiveContex 进行分位数计算非常慢?
Why quantile computation using hiveContex in spark is very slow?
我使用 Hue 使用 10 GB csv 文件创建了配置单元 table。然后尝试运行SQL查询。在处理数据时,它的通话时间超过 2 小时。谁能告诉我这是否是火花问题??或者我做错了什么。
我尝试了所有可能的组合,例如更改执行程序、内核和执行程序内存的数量。
--driver-memory 10g\
--num-executors 10\
--executor-memory 10g\
--executor-cores 10\
我通过更改 num-executors 进行测试,例如 10、15、20、50、100,内存和内核也是如此。
谈到集群,它有 6 个节点、380+ 个内核和 1TB 内存。
My SQL query:
select
percentile_approx(x1, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x1_quantiles,
percentile_approx(x2, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x2_quantiles,
percentile_approx(x3, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x3_quantiles
from mytest.test1
代码非常简单
val query= args(0)
val sparkConf= new SparkConf().setAppName("Spark Hive")
val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.cacheTable(" mytest.test1")
val start = System.currentTimeMillis()
val testload=sqlContext.sql(query)
testload.show()
val end = System.currentTimeMillis()
println("Time took " + (end-start) + " ms")
好吧,这不是 Spark 的问题。由于需要排序和相关的混洗,计算精确分位数在分布式环境中是一个昂贵的过程。由于您在不同的列上计算百分位数,因此此过程会重复多次,如果变量之间的相关性不强,则成本可能会特别高。通常,除非必要,否则您应该计算精确的百分位数。
Spark 2.0.0 实现了分位数近似的可调方法,如果您使用的是早期版本,您可以通过简单的采样获得类似的结果。参见
我使用 Hue 使用 10 GB csv 文件创建了配置单元 table。然后尝试运行SQL查询。在处理数据时,它的通话时间超过 2 小时。谁能告诉我这是否是火花问题??或者我做错了什么。
我尝试了所有可能的组合,例如更改执行程序、内核和执行程序内存的数量。
--driver-memory 10g\ --num-executors 10\ --executor-memory 10g\ --executor-cores 10\
我通过更改 num-executors 进行测试,例如 10、15、20、50、100,内存和内核也是如此。
谈到集群,它有 6 个节点、380+ 个内核和 1TB 内存。
My SQL query: select percentile_approx(x1, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x1_quantiles, percentile_approx(x2, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x2_quantiles, percentile_approx(x3, array(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)) as x3_quantiles from mytest.test1
代码非常简单
val query= args(0)
val sparkConf= new SparkConf().setAppName("Spark Hive")
val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.cacheTable(" mytest.test1")
val start = System.currentTimeMillis()
val testload=sqlContext.sql(query)
testload.show()
val end = System.currentTimeMillis()
println("Time took " + (end-start) + " ms")
好吧,这不是 Spark 的问题。由于需要排序和相关的混洗,计算精确分位数在分布式环境中是一个昂贵的过程。由于您在不同的列上计算百分位数,因此此过程会重复多次,如果变量之间的相关性不强,则成本可能会特别高。通常,除非必要,否则您应该计算精确的百分位数。
Spark 2.0.0 实现了分位数近似的可调方法,如果您使用的是早期版本,您可以通过简单的采样获得类似的结果。参见