我实际上使用的是Spark SQLhiveContext。sql()
使用group by查询,我遇到了OOM问题。所以考虑增加火花的价值。sql。洗牌分区从默认的200到1000,但这没有帮助。
我相信这个分区会共享数据洗牌负载,所以分区越多,需要保存的数据就越少。我是新手。我使用的是Spark 1.4.0,我有大约1TB的未压缩数据要使用hiveContext进行处理。sql()
按查询分组。
这实际上取决于您的数据和查询,如果Spark必须加载1Tb,则说明您的设计有问题。
使用superbe web UI查看DAG,即Spark如何将SQL查询转换为作业/阶段和任务。
有用的指标是“输入”和“洗牌”。
而且,OOM可能会发生在你的司机身上?
-
好的,所以我认为你的问题更普遍。它不特定于SparkSQL,它是Spark的一个普遍问题,当文件很少时,它忽略了你告诉它的分区数量。除非调用重新分区,否则Spark的分区数似乎与HDFS上的文件数相同。因此调用重新分区应该可以工作,但需要注意的是会导致不必要的洗牌。
我不久前提出了这个问题,但仍然没有得到一个好的答案:(
Spark:增加分区的数量而不引起混乱?
如果洗牌时内存不足,请尝试设置spark。sql。洗牌分区
至2001年。
当分区数大于2000时,Spark使用不同的数据结构进行洗牌记账:
private[spark] object MapStatus {
def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
if (uncompressedSizes.length > 2000) {
HighlyCompressedMapStatus(loc, uncompressedSizes)
} else {
new CompressedMapStatus(loc, uncompressedSizes)
}
}
...
我真的希望他们能让你独立配置。
顺便说一下,我在Cloudera的幻灯片中找到了这些信息。
我使用Spark SQL v2。4.7关于EMR(含纱线)。我编写Spark Sql查询来执行转换。 估计复杂查询的最佳随机分区数: 我正在尝试估计需要设置的最佳随机分区数,以便为具有多个连接的复杂查询获得最佳性能。在Internet上我发现分区的最佳大小应该在-的范围内。现在,由于我知道这个值,我的下一步是计算查询的数据随机体积(以MB为单位),然后将其除以以获得随机分区数。但是,对于涉及多个与
我不确定在进行聚合操作时应该增加还是减少分区数量。假设我正在使用pyspark数据框架。。 我知道行转换通常需要更多的分区。而将数据保存到磁盘通常需要fewere分区。 但是,对于聚合,我不清楚在中做什么?? 增加分区数的参数:由于我们必须为聚合而洗牌数据,因此您希望洗牌更少的数据,从而增加分区数,以减小分区的大小。 减少分区数量的论点:IT需要大量开销来收集和计算每个分区。因此,太多的分区将导致
问题内容: 我想在SQL Server中存储一个代表百分比的值,哪种数据类型应该是首选? 问题答案: 十进制(p,s)和数字(p,s) p(精度): 将存储的最大十进制数字总数(在小数点的左边和右边) s(比例): 将存储在小数点右边的小数位数(-> s定义小数位数) 0 <= s <= p。 p …总位数 s …小数点右边的位数 ps …小数点左边的位数 例子: 结果: 链接:msdn.micr
Spark中的任务数由阶段开始时的RDD分区总数决定。例如,当Spark应用程序从HDFS读取数据时,Hadoop RDD的分区方法继承自MapReduce中的,它受HDFS块的大小、的值和压缩方法等的影响。 截图中的任务花了7,7,4秒,我想让它们平衡。另外,阶段被分成3个任务,有什么方法可以指定Spark的分区/任务数吗?
如果和具有相同的分区符,
我试图理解和之间的区别。 如果我正确理解了这个答案,只能减少dataframe的分区数量,如果我们尝试增加分区数量,那么分区数量将保持不变。 但当我试图执行下面的代码时,我发现了两件事 对于合并的Dataframe,可以增加分区数 对于Rdd,如果Shuffle=false,那么分区的数量不能随着合并而增加。 这是否意味着使用合并数据帧分区可以增加? 当我执行以下代码时: 我得到以下输出 当我执行