- 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:
相关推荐
【Openfire、Spark和SparkWeb】是一套开源的即时通讯解决方案,主要由Openfire服务器、Spark客户端和SparkWeb网页客户端组成。Openfire是基于XMPP协议的服务器,它提供了聊天、会议、文件传输等实时通信功能。Spark...
H.264中的slice分为三种类型:I-slice(Intra-slice,只包含I帧的宏块),P-slice(Predicted-slice,包含P帧的宏块)和B-slice(Bidirectional-slice,包含B帧的宏块)。I帧不依赖于其他帧,P帧依赖于前一帧,B帧...
Siemens S7-1200 PLC 使用 Slice 方式对变量进行寻址是指在编程中使用 Slice(片段访问)方式来访问和操作变量。Slice 方式可以选择包含所声明变量的特定地址区域,可以访问宽度为 1 位、8 位、16 位或 32 位的区域...
这是一个Apache Spark的演讲ppt,全都是英文的,制作时间是2020年的。包含Spart的最近状态,RDD和其生态。my presentation on RDD & Spark.pptx
这个库可能是为了提供更高效、更便捷的方式来管理和操作slice,以提高代码的可读性和维护性。下面是一些可能包含在该库中的功能和相关的知识点: 1. **添加元素**:库可能会提供一种简洁的方法来向slice末尾或指定...
"Slice type"是H.264编码中的一个重要概念,它关乎到视频编码的策略和解码过程。本篇文章将深入探讨H.264编码中的Slice类型及其在视频处理中的作用。 首先,我们需要理解什么是Slice。在H.264编码中,一个图像...
### 基于Slice的H.264并行视频编码算法 #### 一、引言 随着视频编码技术的发展,H.264作为一种新兴的视频标准,因其高效的视频压缩率和先进的编码技术而备受关注。然而,这也带来了更高的计算复杂度,使得视频编码...
string和slice.go
### 在JavaScript中,截取字符串的slice和substring的区别 #### 引言 在日常的前端开发工作中,我们经常需要对字符串进行操作,特别是在提取或截取字符串中的特定部分时。JavaScript 提供了多种方法来帮助开发者...
- **应用工具**: 如`spark-shell`和`spark-submit`用于运行Spark程序。 #### 二、Spark编程模型详解 ##### 1. Spark应用程序组成部分 - **Driver Program**: 包含Spark应用程序的主逻辑。它负责创建`SparkContext...
`center_slice`是一种在UI设计中常用于图片或背景图像处理的技术,它允许图像的中心部分保持拉伸不变,而边缘部分则可以平滑地扩展或收缩,从而适应不同的屏幕尺寸和布局变化。 在Flutter中,`center_slice`通常与`...
本篇文章将深入探讨如何使用MATLAB中的`scatter`和`slice`函数来构建四维数据的空间模型。 首先,`scatter`函数在MATLAB中用于绘制散点图。在三维空间中,`scatter3(X,Y,Z)`可以用来创建一个散点图,其中X、Y和Z...
eclipse Slice2Java 控件 jar ,eclipse Slice2Java 控件 jar
在本文档中,slice的基础知识包括如何声明和初始化slice,以及slice的基本操作,例如如何通过索引访问元素,如何追加元素到slice,以及如何通过切片表达式创建新的slice。例如,slice可以通过字面值的方式初始化,如...
这款插件大大提升了切图的效率,尤其对于处理复杂的布局和多层元素的网页设计而言,Cut&Slice me 提供了更为便捷的解决方案。 切图,或称为图像切割,是Web设计过程中的关键步骤。传统的切图方法需要手动设置切片并...
`slice2java`是ICE提供的一个工具,它可以将`slice`文件转换为Java语言的接口和数据类型实现。 在这个名为"Zeroc ICE中间件slice2java的ant脚本(v1u0_0)"的资源中,包含了一个Ant构建脚本`slice2java.xml`。Ant是...
切片采样(Slice Sampling)是一种在统计学和机器学习领域广泛应用的马尔科夫链蒙特卡洛(Markov Chain Monte Carlo, MCMC)方法。它通过构造一个包含目标分布的简单辅助函数(切片)来实现对复杂概率分布的采样。...
通过slice2java,开发者可以将 Slice 文件转换为对应的Java类,这些类提供了客户端和服务端进行通信的必要接口和数据结构。 “ant脚本”指的是Apache Ant,一个基于Java的构建工具,用于自动化构建过程,如编译、...
每个Slice可以独立编码和解码,这样有利于实现并发处理和错误恢复。Slice内还可以进一步划分为宏块(Macroblock),宏块是编码的基本元素,由16x16像素的亮度区域和对应的色度区域组成。 最后,我们讨论NAL单元。...