我试图从s3(15天的数据)查询。我试着单独查询它们(每天)它工作正常。它也能正常工作14天。但是当我查询15天时,作业一直在运行(挂起)并且任务#没有更新。
我的设置:
我正在使用具有动态分配和最大资源打开的51节点集群r3.4x large。
我所做的只是=
val startTime="2017-11-21T08:00:00Z"
val endTime="2017-12-05T08:00:00Z"
val start = DateUtils.getLocalTimeStamp( startTime )
val end = DateUtils.getLocalTimeStamp( endTime )
val days: Int = Days.daysBetween( start, end ).getDays
val files: Seq[String] = (0 to days)
.map( start.plusDays )
.map( d => s"$input_path${DateTimeFormat.forPattern( "yyyy/MM/dd" ).print( d )}/*/*" )
sqlSession.sparkContext.textFile( files.mkString( "," ) ).count
当我运行相同的14天时,我得到了197337380(计数),我分别运行了第15天并获得了27676788.但是当我查询15天时,工作总计挂起
更新:
这项工作正常:
var df = sqlSession.createDataFrame(sc.emptyRDD[Row], schema)
for(n <- files ){
val tempDF = sqlSession.read.schema( schema ).json(n)
df = df(tempDF)
}
df.count
但有人可以解释为什么它现在有效而不是之前有效吗?
更新:将mapreduce.input.fileinputformat.split.minsize设置为256 GB后,现在工作正常。
答案 0 :(得分:9)
动态分配和最大化资源分配都是不同的设置,当其他活动时,将禁用其中一个。通过在EMR中最大化资源分配,每个节点启动1个执行程序,并将所有核心和内存分配给该执行程序。
我建议采取不同的路线。你似乎有一个包含51个节点的非常大的集群,不确定它是否是必需的。但是,请遵循此经验法则,您将了解如何调整这些配置。
现在假设您需要51个节点,请尝试以下操作:
以上配置对我来说就像一个魅力。您可以在Spark UI上监视资源利用率。
此外,在您的yarn config /etc/hadoop/conf/capacity-scheduler.xml
文件中,将yarn.scheduler.capacity.resource-calculator
设置为org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
- 这将允许Spark真正完全控制这些CPU。更改后重新启动纱线服务。
答案 1 :(得分:0)
你应该增加执行程序内存和#executors,如果数据很大,请尝试增加驱动程序内存。
我的建议是不要使用动态资源分配并让它运行并查看它是否仍然挂起(请注意,spark作业可能会消耗整个群集资源并使其他应用程序匮乏资源尝试此方法时,没有任何作业运行)。如果它没有挂起,这意味着你应该玩资源分配,然后开始硬编码资源并不断增加资源,以便你可以找到你可能使用的最佳资源分配。
以下链接可以帮助您了解资源分配和资源优化。
http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/