apache-spark - 火花中止火花作业中打开的文件太多
问题描述
在我的应用程序中,我正在阅读完全分布在 188 个文件中的 40 GB 文本文件。我拆分这些文件并使用 pair rdd 在 spark 中每行创建 xml 文件。对于 40 GB 的输入,它将创建数百万个小 xml 文件,这是我的要求。一切正常,但是当 spark 在 S3 中保存文件时,它会引发错误并且作业失败。
这是我得到的例外
原因:java.nio.file.FileSystemException: /mnt/s3/emrfs-2408623010549537848/0000000000: 在 sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) 在 sun.nio.fs 打开的文件太多。 UnixException.rethrowAsIOException(UnixException.java:102) 在 sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 在 sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) 在 java.nio.file .Files.newByteChannel(Files.java:361) at java.nio.file.Files.createFile(Files.java:632) at com.amazon.ws.emr.hadoop.fs.files.TemporaryFiles.create(TemporaryFiles.java :70) 在 com.amazon.ws.emr.hadoop.fs.s3n.MultipartUploadOutputStream.openNewPart(MultipartUploadOutputStream.java:493) ... 21 更多
ApplicationMaster 主机:10.97.57.198 ApplicationMaster RPC 端口:0 队列:默认开始时间:1542344243252 最终状态:FAILED
跟踪 URL: http://ip-10-97-57-234.tr-fr-nonprod.aws-int.thomsonreuters .com:20888/proxy/application_1542343091900_0001/ 用户:线程“主”org.apache.spark.SparkException中的hadoop异常:应用程序application_1542343091900_0001以失败状态完成
这也是
com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception:请降低您的请求率。(Service: Amazon S3; Status Code: 503; Error Code: SlowDown; Request ID: D33581CA9A799F64; S3 Extended Request ID: /SlEplo+lCKQRVVH+zHiop0oh8q8WqwnNykK3Ga6/VM2HENl/eKizbd1rg4vZD1BZIpp8lk6zwA=), S3 Extended Request ID: /SlEplo+lCKQRVVH+zHiop0oh8q8WqwnNykK3Ga6 /VM2HENl/eKizbd1rg4vZD1BZIpp8lk6zwA=
这是我的代码。
object TestAudit {
def main(args: Array[String]) {
val inputPath = args(0)
val output = args(1)
val noOfHashPartitioner = args(2).toInt
//val conf = new SparkConf().setAppName("AuditXML").setMaster("local");
val conf = new SparkConf().setAppName("AuditXML")
val sc = new SparkContext(conf);
val input = sc.textFile(inputPath)
val pairedRDD = input.map(row => {
val split = row.split("\\|")
val fileName = split(0)
val fileContent = split(1)
(fileName, fileContent)
})
import org.apache.hadoop.io.NullWritable
import org.apache.spark.HashPartitioner
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat
class RddMultiTextOutputFormat extends MultipleTextOutputFormat[Any, Any] {
override def generateActualKey(key: Any, value: Any): Any = NullWritable.get()
override def generateFileNameForKeyValue(key: Any, value: Any, name: String): String = key.asInstanceOf[String]
}
pairedRDD.partitionBy(new HashPartitioner(10000)).saveAsHadoopFile("s3://a205381-tr-fr-development-us-east-1-trf-auditabilty//AUDITOUTPUT", classOf[String], classOf[String], classOf[RddMultiTextOutputFormat], classOf[GzipCodec])
}
}
即使我尝试减少 HashPartitioner 的数量,它也不起作用
解决方案
Unix 系统上的每个进程都有打开文件或文件描述符数量的限制。由于您的数据很大并且分区为子文件(在 Spark 内部),您的过程遇到了限制和错误。您可以为每个用户增加文件描述符的数量,如下所示:
编辑文件:/etc/security/limits.conf并添加(或修改)
* hard nofile 500000
* soft nofile 500000
root hard nofile 500000
root soft nofile 500000
这会将每个用户和 root 用户的nofile(文件描述符数量)功能设置为500000。
重新启动后将应用更改。
此外,有人可以通过设置LimitNOFILE为特殊进程设置文件描述符的数量。例如,如果您使用 yarn 运行 Spark 作业并且 Yarn 守护程序将使用systemd启动,您可以在 Yarn systemd 脚本(资源管理器和节点管理器)中添加 LimitNOFILE=128000 以将文件描述符的 Yarn 进程数设置为128000。
相关文章:
推荐阅读
- html - HTML/AngularJS - 如何使这个名字、姓氏和电子邮件可编辑?
- c - 如何获取表元组并将其转换为 C 中的数组以用于 postgres?
- javascript - Vuetify v-btn-toggle 组的 v-model 错误
- google-sheets - Excel - 在相对列中对给定条件求和
- python - 迭代地实例化 Sklearn 模型
- python - 如何一次处理多条消息 - 电报
- python - 使用 Pandas (Python) 清理分类数据
- reactjs - 键入没有道具的 React 组件类的正确方法是什么?
- c# - 为什么抛出 System.Reflection.TargetInvocationException 而不是 System.UriFormatException?
- rust - 实现一个 trait 方法,为拥有的类型返回一个有界的生命周期引用