`
bit1129
  • 浏览: 1073140 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Spark六十五】slice、partition和inputsplit

 
阅读更多
  • slice和paritition是spark中的通用概念,表示一个原始数据块;比如使用SparkContext.parallelize方法可以把一个元素集合(不论多少元素)可以分解为多个分区(partition)
  • Spark的partition可以是MapReduce中的input split,input split是Hadoop中的数据块的逻辑表示方式,input split可以一个或多个HDFS的block,input split也是Hadoop MapReduce的输入输出
  • Spark的task是至计算单元,由输入数据片(partition)、处理逻辑和输出数据组成,slice或者parition是数据表示方式,仅仅是task中的“输入数据”或者“输出数据”。在ResultTask中返回值是一个数组,而ShuflleMapTask返回的是一个MapStatus,它是一个分片数据的存储信息?

Hadoop inputplit

  • Hadoop的一个Block默认是128M,那么对于一个记录行形式的文本,会不会造成一行记录被分到两个Block当中?
  • 在把文件从Block中读取出来进行切分时,会不会造成一行记录被分成两个InputSplit,如果被分成两个InputSplit,这样一个 InputSplit里面就有一行不完整的数据,那么处理这个InputSplit的Mapper会不会得出不正确的结果?

对于上面的两个问题,首先要明确两个概念:Block和InputSplit:

 

  • Block是HDFS物理存储文件的单位(默认是128M);
  • InputSplit是MapReduce对文件进行处理和运算的输入单位,只是一个逻辑概念,每个InputSplit并没有对文件实际的切割,只是记录了要处理的数据的位置(包括文件的path和hosts)和长度(由start和length决定)。因此以行记录形式的文本,可能存在一行记录被划分到不同的Block,甚至不同的DataNode上去。通过分析FileInputFormat里面的getSplits方法,可以得出,某一行记录同样也可能被划分到不同的InputSplit

看看Hadoop关于InputSplit的获取以及都去InputSplit中文本行的代码:

 

org.apache.hadoop.mapred.FileInputFormat:

 

public InputSplit[] getSplits(JobConf job, int numSplits)
    throws IOException {
    FileStatus[] files = listStatus(job);
     
    // Save the number of input files for metrics/loadgen
    job.setLong(NUM_INPUT_FILES, files.length);
    long totalSize = 0;                           // compute total size
    for (FileStatus file: files) {                // check we have valid files
      if (file.isDirectory()) {
        throw new IOException("Not a file: "+ file.getPath());
      }
      totalSize += file.getLen();
    }
 
    long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
    long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
      FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
 
    // generate splits
    ArrayList<FileSplit> splits = new ArrayList<FileSplit>(numSplits);
    NetworkTopology clusterMap = new NetworkTopology();
    for (FileStatus file: files) {
      Path path = file.getPath();
      FileSystem fs = path.getFileSystem(job);
      long length = file.getLen();
      BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);
      if ((length != 0) && isSplitable(fs, path)) {
        long blockSize = file.getBlockSize();
        long splitSize = computeSplitSize(goalSize, minSize, blockSize);
 
        long bytesRemaining = length;
        while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
          String[] splitHosts = getSplitHosts(blkLocations,
              length-bytesRemaining, splitSize, clusterMap);
          splits.add(makeSplit(path, length-bytesRemaining, splitSize,
                               splitHosts));
          bytesRemaining -= splitSize;
        }
         
        if (bytesRemaining != 0) {
          splits.add(makeSplit(path, length-bytesRemaining, bytesRemaining,
                     blkLocations[blkLocations.length-1].getHosts()));
        }
      } else if (length != 0) {
        String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap);
        splits.add(makeSplit(path, 0, length, splitHosts));
      } else {
        //Create empty hosts array for zero length files
        splits.add(makeSplit(path, 0, length, new String[0]));
      }
    }
    LOG.debug("Total # of splits: " + splits.size());
    return splits.toArray(new FileSplit[splits.size()]);
  }

 

 

org.apache.hadoop.mapred.TextInputFormat:
public RecordReader<LongWritable, Text> getRecordReader(
                                          InputSplit genericSplit, JobConf job,
                                          Reporter reporter)
    throws IOException {
     
    reporter.setStatus(genericSplit.toString());
    return new LineRecordReader(job, (FileSplit) genericSplit);
  }
 
 
参考:http://my.oschina.net/xiangchen/blog/99653

 

 

分享到:
评论

相关推荐

    openfire+spark+sparkweb

    【Openfire、Spark和SparkWeb】是一套开源的即时通讯解决方案,主要由Openfire服务器、Spark客户端和SparkWeb网页客户端组成。Openfire是基于XMPP协议的服务器,它提供了聊天、会议、文件传输等实时通信功能。Spark...

    计算h264码流slice的数目及大小

    H.264中的slice分为三种类型:I-slice(Intra-slice,只包含I帧的宏块),P-slice(Predicted-slice,包含P帧的宏块)和B-slice(Bidirectional-slice,包含B帧的宏块)。I帧不依赖于其他帧,P帧依赖于前一帧,B帧...

    西门子S7-1200PLC如何使用Slice方式对变量进行寻址?.docx

    Siemens S7-1200 PLC 使用 Slice 方式对变量进行寻址是指在编程中使用 Slice(片段访问)方式来访问和操作变量。Slice 方式可以选择包含所声明变量的特定地址区域,可以访问宽度为 1 位、8 位、16 位或 32 位的区域...

    my presentation on RDD & Spark.pptx

    这是一个Apache Spark的演讲ppt,全都是英文的,制作时间是2020年的。包含Spart的最近状态,RDD和其生态。my presentation on RDD & Spark.pptx

    Go-轻松在golang中处理slice的库

    这个库可能是为了提供更高效、更便捷的方式来管理和操作slice,以提高代码的可读性和维护性。下面是一些可能包含在该库中的功能和相关的知识点: 1. **添加元素**:库可能会提供一种简洁的方法来向slice末尾或指定...

    获取H.264的slice type

    "Slice type"是H.264编码中的一个重要概念,它关乎到视频编码的策略和解码过程。本篇文章将深入探讨H.264编码中的Slice类型及其在视频处理中的作用。 首先,我们需要理解什么是Slice。在H.264编码中,一个图像...

    基于Slice的H.264并行视频编码算法

    ### 基于Slice的H.264并行视频编码算法 #### 一、引言 随着视频编码技术的发展,H.264作为一种新兴的视频标准,因其高效的视频压缩率和先进的编码技术而备受关注。然而,这也带来了更高的计算复杂度,使得视频编码...

    string和slice.go

    string和slice.go

    在js中,截取字符串的slice和substring的区别

    ### 在JavaScript中,截取字符串的slice和substring的区别 #### 引言 在日常的前端开发工作中,我们经常需要对字符串进行操作,特别是在提取或截取字符串中的特定部分时。JavaScript 提供了多种方法来帮助开发者...

    02Spark编程模型和解析

    - **应用工具**: 如`spark-shell`和`spark-submit`用于运行Spark程序。 #### 二、Spark编程模型详解 ##### 1. Spark应用程序组成部分 - **Driver Program**: 包含Spark应用程序的主逻辑。它负责创建`SparkContext...

    center_slice-masterx.zip

    `center_slice`是一种在UI设计中常用于图片或背景图像处理的技术,它允许图像的中心部分保持拉伸不变,而边缘部分则可以平滑地扩展或收缩,从而适应不同的屏幕尺寸和布局变化。 在Flutter中,`center_slice`通常与`...

    四维数据matlab空间建模scatter和slice

    本篇文章将深入探讨如何使用MATLAB中的`scatter`和`slice`函数来构建四维数据的空间模型。 首先,`scatter`函数在MATLAB中用于绘制散点图。在三维空间中,`scatter3(X,Y,Z)`可以用来创建一个散点图,其中X、Y和Z...

    eclipse Slice2Java

    eclipse Slice2Java 控件 jar ,eclipse Slice2Java 控件 jar

    go语言 --- 深度解析 slice (深到汇编的那种).pdf

    在本文档中,slice的基础知识包括如何声明和初始化slice,以及slice的基本操作,例如如何通过索引访问元素,如何追加元素到slice,以及如何通过切片表达式创建新的slice。例如,slice可以通过字面值的方式初始化,如...

    Cut&Slice me

    这款插件大大提升了切图的效率,尤其对于处理复杂的布局和多层元素的网页设计而言,Cut&Slice me 提供了更为便捷的解决方案。 切图,或称为图像切割,是Web设计过程中的关键步骤。传统的切图方法需要手动设置切片并...

    Zeroc ICE中间件slice2java的ant脚本(v1u0_0)

    `slice2java`是ICE提供的一个工具,它可以将`slice`文件转换为Java语言的接口和数据类型实现。 在这个名为"Zeroc ICE中间件slice2java的ant脚本(v1u0_0)"的资源中,包含了一个Ant构建脚本`slice2java.xml`。Ant是...

    slice sampler_抽样方法_r语言slice_SLICESAMPLER_mcmc_slice_

    切片采样(Slice Sampling)是一种在统计学和机器学习领域广泛应用的马尔科夫链蒙特卡洛(Markov Chain Monte Carlo, MCMC)方法。它通过构造一个包含目标分布的简单辅助函数(切片)来实现对复杂概率分布的采样。...

    Zeroc ICE中间件slice2java的ant脚本

    通过slice2java,开发者可以将 Slice 文件转换为对应的Java类,这些类提供了客户端和服务端进行通信的必要接口和数据结构。 “ant脚本”指的是Apache Ant,一个基于Java的构建工具,用于自动化构建过程,如编译、...

    h264-sps-slice-nalunit解析VS2017.rar

    每个Slice可以独立编码和解码,这样有利于实现并发处理和错误恢复。Slice内还可以进一步划分为宏块(Macroblock),宏块是编码的基本元素,由16x16像素的亮度区域和对应的色度区域组成。 最后,我们讨论NAL单元。...

Global site tag (gtag.js) - Google Analytics