大数据面试准备之小文件处理

253 阅读2分钟

Flume:

1. Hdfs sink可能导致一个小文件问题;我们通过设置滚动参数来解决这个问题;滚动大小设置为127M(因为一些序列化以及字段长度的原因可能导致超长一点);时间设置为半个小时;时间滚动功能关闭了(不可控);

HDFS:

1. HAR归档;将多个小文件封装到一个har文件中;

2. 针对MR,开启Jvm重用;有一个参数设置可以提高参数复用,减少创建过程中的小文件

3. 针对mr使用CombineTxtinputFormat,实现小文件聚合输入

4. MR采用阶段性压缩;文件采取压缩存储;

5. 开启map端combine功能;(可能会业务逻辑)

HIVE:

  1. JVM重用

2. combineHivexxxx

3. merge功能;map-only 默认合并;mapred需要手动开启合并功能;

4. 采用输出压缩;复用选快的,snappy,lzo;储存选小Bzip2

5. 开启map端combine功能,不影响业务逻辑情况下

 

Kafka实现有序:

1. 设置分区为1,每个表一个topic

2. 自定义key值,分区器默认的hash分区器进行分区

3. Flink读取source时可以设置watermark采取事件时间

Spark参数优化:

  1. 调节map端缓冲区大小 spark.shuffle.file.buffer 32k,每个shuffle文件输出流的内存缓冲区大小,调大此参数可以减少在创建shuffle文件时进行磁盘搜索和系统调用的次数   

  2. 调节reduce端拉取数据缓冲区大小 spark.reducer.maxSizeInFlight 48M   :当缓冲区满了进行reduce计算清空后再拉取;与hadoop不同;资源足够情况下可以增加到96M+;减少拉取次数以减少shuffle次数

  3. 调节reduce端拉取数据重试次数 spark.shuffle.io.maxRetries  增大拉取次数

  4. 调节reduce端拉取数据等待间隔 spark.shuffle.io.retryWait 5s  增加等待时间

  5. 调节SortShuffle排序操作阈值  spark.shuffle.sort.bypassMergeThreshold 200  ;通过调节此数量大于reducetask数量,调用bypass SortShuffle 作writer

  6. sql shuffle默认并行度:参数spark.sql.shuffle.partitions 决定 默认并行度200; (前提需要关闭自适应分区参数 spark.sql.adaptive.enable = false)