use*_*267 6 hadoop amazon-emr emr hadoop-yarn apache-spark
我试图从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
Run Code Online (Sandbox Code Playgroud)
当我运行相同的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
Run Code Online (Sandbox Code Playgroud)
但有人可以解释为什么它现在有效但不是之前?
更新:将mapreduce.input.fileinputformat.split.minsize设置为256 GB后,它现在工作正常.
动态分配和最大化资源分配都是不同的设置,当其他活动时,将禁用一个.通过在EMR中最大化资源分配,每个节点启动1个执行程序,并将所有核心和内存分配给该执行程序.
我建议采取不同的路线.你似乎有一个包含51个节点的非常大的集群,不确定它是否是必需的.但是,请遵循此经验法则,您将了解如何调整这些配置.
现在假设您需要51个节点,请尝试以下操作:
以上配置对我来说就像一个魅力.您可以在Spark UI上监视资源利用率.
此外,在您的纱线配置/etc/hadoop/conf/capacity-scheduler.xml
文件中,设置yarn.scheduler.capacity.resource-calculator
为org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
- 这将允许Spark真正完全控制这些CPU.更改后重新启动纱线服务.
您应该增加执行程序内存和#执行程序,如果数据很大,请尝试增加驱动程序内存。
我的建议是不要使用动态资源分配,让它运行并查看它是否仍然挂起(请注意,spark 作业可能会消耗整个集群资源,并使其他应用程序缺乏资源,请在没有作业运行时尝试此方法)。如果它没有挂起,则意味着您应该考虑资源分配,然后开始对资源进行硬编码并不断增加资源,以便找到可以使用的最佳资源分配。
以下链接可以帮助您了解资源分配和资源优化。
http://site.clairvoyantsoft.com/understanding-resource-allocation-configurations-spark-application/
归档时间: |
|
查看次数: |
5144 次 |
最近记录: |