1. Hadoop 是什么
1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2)主要解决,海量数据的存储和海量数据的分析计算问题。 3)广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。
2. Hadoop组成
2.1 Hadoop1.x、2.x、3.x区别
在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大。在Hadoop2.x时代,增加了Yarn,Yarn只负责资源的调度,MapReduce只负责运算。Hadoop3.x在组成上没有变化。
2.2 HDFS 架构概述
Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。 l ) NameNode ( nn )︰存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。 2 ) DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。 3 ) Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
2.3 YARN 架构概述
Yet Another Resource Negotiator 简称 YARN ,另一种资源协调者,是 Hadoop 的资源管理器。
2.3 MapReduce 架构概述
MapReduce 将计算过程分为两个阶段:Map 和 Reduce 1)Map 阶段并行处理输入数据 2)Reduce 阶段对 Map 结果进行汇总
2.4 常用端口号说明
端口名称 | Hadoop2.x | Hadoop3.x |
---|
NameNode 内部通信端口 | 8020 / 9000 | 8020 / 9000/9820 | NameNode HTTP UI | 50070 | 9870 | MapReduce 查看执行任务端口 | 8088 | 8088 | 历史服务器通信端口 | 19888 | 19888 |
3. HDFS
HDFS 的使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
3.1 HDFS优缺点
优点: 缺点:
3.2 HDFS文件块大小
3.3 HDFS的读写流程
3.3.1 HDFS写数据流程
①文件写入 (1)客户端通过 Distributed FileSystem 模块向 NameNode 请求上传文件,NameNode 检查目标文件是否已存在,父目录是否存在。 (2)NameNode 返回是否可以上传。 (3)客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。 (4)NameNode 返回 3 个 DataNode 节点,分别为 dn1、dn2、dn3。 (5)客户端通过 FSDataOutputStream 模块请求 dn1 上传数据,dn1 收到请求会继续调用dn2,然后 dn2 调用 dn3,将这个通信管道建立完成。 (6)dn1、dn2、dn3 逐级应答客户端。 (7)客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 Packet 为单位,dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;dn1 每传一个 packet会放入一个应答队列等待应答。 (8)当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复执行 3-7 步)。
②网络拓扑-节点距离计算 节点距离:两个节点到达最近的共同祖先的距离总和。
3.3.2 HDFS读数据流程
(1)客户端通过 DistributedFileSystem 向 NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。 (2)挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。 (3)DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。 (4)客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。
4. MapReduce
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。
4.1 MapReduce 优缺点
-
优点 1)MapReduce 易于编程 它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。 2)良好的扩展性 当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。 3)高容错性 MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。 4)适合 PB 级以上海量数据的离线处理可以实现上千台服务器集群并发工作,提供数据处理能力。 -
缺点 1)不擅长实时计算 MapReduce 无法像 MySQL 一样,在毫秒或者秒级内返回结果。 2)不擅长流式计算 流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。 3)不擅长 DAG(有向无环图)计算 多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到磁盘,会造成大量的磁盘 IO,导致性能非常的低下。
4.2 MapReduce 编程规范
用户编写的程序分成三个部分:Mapper、Reducer 和 Driver。
1.Mapper阶段 (1)用户自定义的Mapper要继承自己的父类 (2)Mapper的输入数据是KV对的形式(KV的类型可自定义) (3)Mapper中的业务逻辑写在map()方法中 (4)Mapper的输出数据是KV对的形式(KV的类型可自定义) (5)map()方法(MapTask进程)对每一个<K,V>调用一次
2.Reducer阶段 (1)用户自定义的Reducer要继承自己的父类 (2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV (3)Reducer的业务逻辑写在reduce()方法中 (4)ReduceTask进程对每一组相同k的<k,v>组调用一次reduce()方法
3.Driver阶段 相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象
常用数据序列化类型
Java 类型 | Hadoop Writable 类型 |
---|
Boolean | BooleanWritable | Byte | ByteWritable | Int | IntWritable | Float | FloatWritable | Long | LongWritable | Double | DoubleWritable | String | Text | Map | MapWritable | Array | ArrayWritable | Null | NullWritable |
4.3 Hadoop序列化
①序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。 ②反序列化就是将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象。 ③Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop 自己开发了一套序列化机制(Writable)。 ④自定义对象实现序列化接口(Writable)步骤: (1)必须实现 Writable 接口 (2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造 (3)重写序列化方法 (4)重写反序列化方法 (5)注意反序列化的顺序和序列化的顺序完全一致 (6)要想把结果显示在文件中,需要重写 toString() (7)如果需要将自定义的 bean 放在 key 中传输,则还需要实现 Comparable 接口,因为MapReduce 框中的 Shuffle 过程要求对 key 必须能排序。
4.4 MapReduce工作流程
具体 Shuffle 过程详解,如下: (1)MapTask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中 (2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 (3)多个溢出文件会被合并成大的溢出文件 (4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key 进行排序 (5)ReduceTask 根据自己的分区号,去各个 MapTask 机器上取相应的结果分区数据 (6)ReduceTask 会抓取到同一个分区的来自不同 MapTask 的结果文件,ReduceTask 会将这些文件再进行合并(归并排序) (7)合并成大文件后,Shuffle 的过程也就结束了,后面进入 ReduceTask 的逻辑运算过程(从文件中取出一个一个的键值对 Group,调用用户自定义的 reduce()方法)
注意: (1)Shuffle 中的缓冲区大小会影响到 MapReduce 程序的执行效率,原则上说,缓冲区越大,磁盘 io 的次数越少,执行速度就越快。 (2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb 默认 100M。
4.5 MapReduce框架原理
4.5.1 InputFormat 数据输入
①切片与 MapTask 并行度决定机制 ②FileInputFormat切片源码解析
(1)程序先找到你数据存储的目录。 (2)开始遍历处理(规划切片)目录下的每一个文件 (3)遍历第一个文件ss.txt ? ? ? ? ? a)获取文件大小fs.sizeOf(ss.txt) ? ? ? ? ? b)计算切片大小 computeSplitSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M ? ? ? ? ? c)默认情况下,切片大小=bloc d)开始切,形成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M (每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片) ? ? ? ? ? e)将切片信息写到一个切片规划文件中 f)整个切片的核心过程在getSplit()方法中完成 ? ? ? ? ? g)InputSplit只记录了切片的元数据信息,比如起始位置、长度以及所在的节点列表等。 (4)提交切片规划文件到YARN上,YARN上的MrAppMaster就可以根据切片规划文件计算开启MapTask个数。 ③FileInputFormat 常见的接口实现类
FileInputFormat 常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等;TextInputFormat 是默认的 FileInputFormat 实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable 类型。值是这行的内容,不包括任何行终止符(换行符和回车符),属于Text 类型。
④CombineTextInputFormat 切片机制
框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
1)应用场景: CombineTextInputFormat 用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个 MapTask 处理。
2)虚拟存储切片最大值设置 CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4MB 注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。
3)切片机制 生成切片过程包括:虚拟存储过程和切片过程二部分。 (1)虚拟存储过程:将输入目录下所有文件大小,依次和设置的 setMaxInputSplitSize 值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值 2 倍,此时将文件均分成 2 个虚拟存储块(防止出现太小切片)。 (2)切片过程: (a)判断虚拟存储的文件大小是否大于 setMaxInputSplitSize 值,大于等于则单独形成一个切片。 (b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
4.5.2 Shuffle机制
Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle。 ①Partition 分区 要求将统计结果按照条件输出到不同文件中,这时可以通过分区来实现。
1)默认分区
默 认分区是根据key的hashCode对ReduceTasks个数取模得到的。用户没法控制哪个key存储到哪个分区。
2)自定义Partition步骤 (1)自定义类继承Partitioner,重写getPartition()方法 (2)在Job驱动中,设置自定义Partitioner (3)自定义Partition后,要根据自定义Partitioner的逻辑设置相应数量的ReduceTask
3)分区总结 (1)如果ReduceTask的数量> getPartition的结果数,则会多产生几个空的输出文件part-r-000xx; (2)如果1<ReduceTask的数量<getPartition的结果数,则有一部分分区数据无处安放,会Exception; (3)如 果ReduceTask的数量=1,则不管MapTask端输出多少个分区文件,最终结果都交给这一个ReduceTask,最终也就只会产生一个结果文件 part-r-00000;
② WritableComparable 排序 ???????排序是MapReduce框架中最重要的操作之一。MapTask和ReduceTask均会对数据按 照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。 ???????对于MapTask,它会将处理的结果暂时放到环形缓冲区中,当环形缓冲区使用率达到一定阈值后,再对缓冲区中的数据进行一次快速排序,并将这些有序数据溢写到磁盘上,而当数据处理完毕后,它会对磁盘上所有文件进行归并排序。 ???????对于ReduceTask,它从每个MapTask上远程拷贝相应的数据文件,如果文件大小超过一定阈值,则溢写磁盘上,否则存储在内存中。如果磁盘上文件数目达到一定阈值,则进行一次归并排序以生成一个更大文件;如果内存中文件大小或者数目超过一定阈值,则进行一次合并后将数据溢写到磁盘上。当所有数据拷贝完毕后,ReduceTask统一对内存和磁盘上的所有数据进行一次归并排序。
排序分类: (1)部分排序 MapReduce根据输入记录的键对数据集排序。保证输出的每个文件内部有序。 (2)全排序 最终输出结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask。但该方法在处理大型文件时效率极低,因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。 (3)辅助排序:(GroupingComparator分组) 在Reduce端对key进行分组。应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。 (4)二次排序 在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。
自定义排序 WritableComparable 原理分析 bean 对象做为 key 传输,需要实现 WritableComparable 接口重写 compareTo 方法,就可以实现排序。
@Override
public int compareTo(FlowBean bean) {
int result;
// 按照总流量大小,倒序排列
if (this.sumFlow > bean.getSumFlow()) {
result = -1;
}else if (this.sumFlow < bean.getSumFlow()) {
result = 1;
}else {
result = 0;
}
return result;
}
③ Combiner 合并 (1)Combiner是MR程序中Mapper和Reducer之外的一种组件。 (2)Combiner组件的父类就是Reducer。 (3)Combiner和Reducer的区别在于运行的位置 ??????????????Combiner是在每一个MapTask所在的节点运行; ??????????????Reducer是接收全局所有Mapper的输出结果; (4)Combiner的意义就是对每一个MapTask的输出进行局部汇总,以减小网络传输量。 (5)Combiner能够应用的前提是不能影响最终的业务逻辑,而且,Combiner的输出kv应该跟Reducer的输入kv类型要对应起来。 (6)自定义 Combiner 实现步骤 ??????(a)自定义一个 Combiner 继承 Reducer,重写 Reduce 方法 ??????(b)在 Job 驱动类中设置: job.setCombinerClass() (ps:可直接将自定义的Reducer设置为Combiner)
4.5.3 OutputFormat 数据输出
OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了 OutputFormat接口,默认输出格式TextOutputFormat。 自定义OutputFormat 1)应用场景: 例如:输出数据到MySQL/HBase/Elasticsearch等存储框架中。 2) 自定义OutputFormat步骤 ? 自定义一个类继承FileOutputFormat。 ? 改写RecordWriter,具体改写输出数据的方法write()。
4.6 MapReduce 内核源码解析
4.6.1 MapTask 工作机制
(1)Read阶段:MapTask通过InputFormat获得的RecordReader,从输入InputSplit中解析出一个个key/value。 (2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。 (3)Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。 (4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。 溢写阶段详情: 步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号Partition进行排序,然后按照key进行排序。这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。 步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。 步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。 (5)Merge阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。 当所有数据处理完后,MapTask会将所有临时文件合并成一个大文件,并保存到文件output/file.out中,同时生成相应的索引文件output/file.out.index。 在进行文件合并过程中,MapTask以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并mapreduce.task.io.sort.factor(默认10)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。 让每个MapTask最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。
4.6.2 ReduceTask 工作机制
(1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。 (2)Sort阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。按照MapReduce语义,用户编写reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现对自己的处理结果进行了局部排序,因此,ReduceTask只需对所有数据进行一次归并排序即可。 (3)Reduce阶段:reduce()函数将计算结果写到HDFS上。
4.6.3 ReduceTask 并行度决定机制
1)设置ReduceTask并行度(个数) ReduceTask的并行度同样影响整个Job的执行并发度和执行效率,但与MapTask的并发数由切片数决定不同,ReduceTask数量的决定是可以直接手动设置:
// 默认值是1,手动设置为4
job.setNumReduceTasks(4);
2)实验:测试ReduceTask多少合适 3)注意事项 (1 ) ReduceTask=0,表示没有Reduce阶段,输出文件个数和Map个数一致。 (2) ReduceTask默认值就是1,所以输出文件个数为一个。 (3)如果数据分布不均匀,就有可能在Reduce阶段产生数据倾斜 (4 ) ReduceTask数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个ReduceTask。 (5)具体多少个ReduceTask,需要根据集群性能而定。 (6)如果分区数不是1,但是ReduceTask为1,是否执行分区过程。答案是:不执行分区过程。因为在Map’Task的源码中,执行分区的前提是先判断ReduceNum个数是否大于1。不大于1肯定不执行。
4.6.4 MapTask & ReduceTask 源码解析
1)MapTask源码解析流程
2)ReduceTask源码解析流程
4.7 Join应用
4.7.1 Reduce Join
Map端的主要工作:为来自不同表或文件的key/value对,打标签以区别不同来源的记录。然后用连接字段作为key,其余部分和新加的标志作为value,最后进行输出。
Reduce端的主要工作:在Reduce端以连接字段作为key的分组已经完成,我们只需要在每一个分组当中将那些来源于不同文件的记录(在Map阶段已经打标志)分开,最后进行合并就ok了。
缺点: 这种方式中,合并的操作是在Reduce阶段完成,Reduce端的处理压力太大,Map节点的运算负载则很低,资源利用率不高,且在Reduce阶段极易产生数据倾斜。 解决方案: Map端实现数据合并。
4.7.2 Map Join
1)使用场景 Map Join适用于一张表十分小、一张表很大的场景。 2)优点 思考:在Reduce端处理过多的表,非常容易产生数据倾斜。怎么办? 在Map端缓存多张表,提前处理业务逻辑,这样增加Map端业务,减少Reduce端数据的压力,尽可能的减少数据倾斜。 3)具体办法:采用DistributedCache (1)在Mapper的setup阶段,将文件读取到缓存集合中。 (2)在Driver驱动类中加载缓存。
//缓存普通文件到Task运行节点。
job.addCacheFile(new URI("file:///e:/cache/pd.txt"));
//如果是集群运行,需要设置HDFS路径
job.addCacheFile(new URI("hdfs://hadoop102:8020/cache/pd.txt"));
4.8 数据清洗(ETL)
“ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。 在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清理的过程往往只需要运行Mapper程序,不需要运行Reduce程序。
4.9 MapReduce开发总结
1)输入数据接口:InputFormat (1)默认使用的实现类是:TextInputFormat (2)TextInputFormat 的功能逻辑是:一次读一行文本,然后将该行的起始偏移量作为key,行内容作为 value 返回。 (3)CombineTextInputFormat 可以把多个小文件合并成一个切片处理,提高处理效率。 2)逻辑处理接口:Mapper 用户根据业务需求实现其中三个方法:map() setup() cleanup () 3)Partitioner 分区 (1)有默认实现 HashPartitioner,逻辑是根据 key 的哈希值和 numReduces 来返回一个分区号;key.hashCode()&Integer.MAXVALUE % numReduces (2)如果业务上有特别的需求,可以自定义分区。 4)Comparable 排序 (1)当我们用自定义的对象作为 key 来输出时,就必须要实现 WritableComparable 接口,重写其中的 compareTo()方法。 (2)部分排序:对最终输出的每一个文件进行内部排序。 (3)全排序:对所有数据进行排序,通常只有一个 Reduce。 (4)二次排序:排序的条件有两个。 5)Combiner 合并 Combiner 合并可以提高程序执行效率,减少 IO 传输。但是使用时必须不能影响原有的业务处理结果。 6)逻辑处理接口:Reducer 用户根据业务需求实现其中三个方法:reduce() 、setup() 、cleanup () 7)输出数据接口:OutputFormat (1)默认实现类是 TextOutputFormat,功能逻辑是:将每一个 KV 对,向目标文本文件输出一行。 (2)用户还可以自定义 OutputFormat。
5.Hadoop压缩
1)压缩的好处和坏处 压缩的优点:以减少磁盘 IO、减少磁盘存储空间。 压缩的缺点:增加 CPU 开销。 2)压缩原则 (1)运算密集型的 Job,少用压缩 (2)IO 密集型的 Job,多用压缩 3) MR 支持的压缩编码
压缩格式 | 压缩格式 Hadoop 自带? | 算法 | 文件扩展名 | 是否可切片 | 换成压缩格式后,原来的程序是否需要修改 |
---|
DEFLATE | 是,可直接使用 | DEFLATE | .deflate | 否 | 和文本处理一样,不需要修改 | Gzip | 是,可直接使用 | DEFLATE | .gz | 否 | 和文本处理一样,不需要修改 | bzip2 | 是,可直接使用 | bzip2 | .bz2 | 是 | 和文本处理一样,不需要修改 | LZO | 否,需要安装 | LZO | .lzo | 是 | 需要建索引,还需要指定输入格式 | Snappy | 是,可直接使用 | Snappy | .snappy | 否 | 和文本处理一样,不需要修改 |
4) 压缩方式选择 压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否可以支持切片。
Gzip 压缩 优点:压缩率比较高; 缺点:不支持 Split;压缩/解压速度一般;
Bzip2 压缩 优点:压缩率高;支持 Split; 缺点:压缩/解压速度慢。
Lzo 压缩 优点:压缩/解压速度比较快;支持 Split; 缺点:压缩率一般;想支持切片需要额外创建索引。
Snappy 压缩 优点:压缩和解压缩速度快; 缺点:不支持 Split;压缩率一般;
|