zoukankan      html  css  js  c++  java
  • spark分片个数的确定及Spark内存错误(GC error)的迂回解决方式

    我们知道,spark中每个分片都代表着一部分数据,那么分片数量如何被确认的呢?

    首先我们使用最常见的HDFS+Spark,sparkDeploy的方式来讨论,spark读取HDFS数据使用的是sparkcontext.textfile(Path, minPartitions):

    1   def textFile(
    2       path: String,
    3       minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
    4     assertNotStopped()
    5     hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
    6       minPartitions).map(pair => pair._2.toString)
    7   }

    在用户指定minPartitions时,便会使用用户指定的分片数量来划分,否则使用defaultMinPartitions。那么defaultMinPartitions是怎么来的?

      def defaultMinPartitions: Int = math.min(defaultParallelism, 2)
    
    ...
    
      def defaultParallelism: Int = {
        assertNotStopped()
        taskScheduler.defaultParallelism
      }
    
    ...
    
      override def defaultParallelism(): Int = backend.defaultParallelism()
    
    ...
    
      override def defaultParallelism(): Int = {
        conf.getInt("spark.default.parallelism", math.max(totalCoreCount.get(), 2))
      }

    可以看到这个参数是通过SparkConf中的spark.default.parallelism指定的。如果两边都没指定,那么分片数就为2。

    在内存小,分片数少而数据量较大的情况下,会产生GC error,因为内存占用过大,java的垃圾回收无法完成,所以在出现内存错误的时候不妨试试将默认的分片数量加大,或者干脆在textfile中指定。这样有助于数据的处理完成。

  • 相关阅读:
    安全模式下卸载windows installer打包的软件(转)
    OAF页面集成条形码或者二维码
    记一次客户生产环境供应商门户服务器无法访问
    QML显示圆形图片
    QML加载gif
    QML之信号与槽
    QML访问C++类内部
    QML使用C++对象
    C++条件变量
    C/C++程序所占用内存区域
  • 原文地址:https://www.cnblogs.com/gaoze/p/5208970.html
Copyright © 2011-2022 走看看