Spark ORC文件

一. ORC文件的格式

1. 什么是orc文件

  • ORC文件, 全称Optimized Row Columnar, 是一种高效存储数据的格式. 他能同时提高数据的read, write, process效率.
  • ORC文件和parquet一样, 不是一个单纯的列式存储结构, 而是首先按照数据行切割整个文件, 单后在行组内部使用列式存储每个字段
    • 列式文件的好处:
      • 提高查询效率: 当要查询某一列时, 不用全文见扫描, 可以只读取这一列的数据
        其次, 文件中会对列加入统计信息: 包括列的max, min, sum等, 因此可以再sql查询时进行RBO中的谓词下推
      • 由于每一列的数据格式相同, 因此可以采用更高效率的压缩算法进一步减小IO存储
      • 由于同一列的数据时顺序存储的, 也避免了CPU读取时的缓存缺失

2. 格式

  • strips: orc文件包括很多组的数据行. 这些数据行被称作strips; 每个strip包含3部分信息
    1. index data: 索引数据
      orc文件的strip中包含多个压缩的数据块. 数据块是指定大小或指定行数的row data. orc列式存储的最小单位是一个数据块, 统计信息的最小粒度是一个数据块, 同时形成orc文件时针对多少数据进行一次压缩后形成的也是一个数据块. 默认每隔10000行形成一个数据块, 因此index也是每10000行记录一次
    2. row data: 真正的数据
    3. strip footer: strip统计信息
  • file footer: 还有一些辅助信息存储在file footer中;
  • post scripts: 文件的最后部分是post scripts, 用来记录文件的元数据(ORC文件是自描述的). 主要包括:
    1. 文件的meta信息(文件的描述信息)
    2. 所有的strip信息(有多少个strip等等)
    3. 文件的schema信息(列名等)

3. orc中的统计信息, 助力提升where条件查询

orc文件包含统计信息, 比如字段的min, max, count, 是否有空值等信息. 在执行sql语句时助力谓词下推. 比如: min,max助力"<或>"条件. 当进行查询的时候, 如果发现满足查询条件的行并不在统计信息之内, 则可以跳过这个strip, 甚至整个文件.ORC中的统计信息分为3个层次:

  • file level : 文件的末尾, postscripts处记录了整个文件中columns的统计信息, 包括: min, max, sum等
  • stripe level : 记录该strip的统计信息
  • row level: 记录strip的row data中这一块数据的统计信息

4. orc文件数据访问方法

    1. 首先, orc文件的读取是从文件末尾开始的, 一次读入16kb. 文件的最后一个字节(postscript的最后一个字节)记录着PostScript的长度, 改长度不会超过256字节. 有了postscript数据, 就知道了:
    • 文件的元数据信息,
    • 数据的压缩格式,
    • 文件内部每一个压缩快的大小(后续读入数据每次读入一个完整压缩块),
    • 以及footer部分的长度
    1. 接着, 读取footer部分, 确定每个strip的长度和偏移量
    1. 最后, 根据footer中记录的每个strip位置, 读入strip的index, strip footer信息, 再根据index和footer中的信息确定要读入row data, 每次完整读入一个压缩块

5. 使用布隆过滤器加快strip中的index选择

前面提到, strip里的统计信息(min,max)可以助力where语句中, 关于"<或>"条件的检索, 避免把不满足条件的strip读入到内存. 那么如果where语句中是"="条件的呢? 这是可以通过让strip对某些列进行布隆过滤器.

6. hive使用orc文件存储时的高级参数

paramorc.png
create table if not exists ${distTable}(
    featureindex string,
    t1_primarykey string, 
    t1_clusterid string, 
    t1_xid string, 
    d1 map<string,string>, 
    t1_id string, 
    t1_zid string, 
    features string, 
    t2_primarykey string, 
    t2_clusterid string, 
    t2_xid string, 
    d2 map<string,string>, 
    t2_id string, 
    t2_zid string, 
    status string
)
partitioned by (save_time string)
STORED AS ORC
tblproperties ("orc.compress"="ZLIB")

二. Spark读取ORC文件的方式

spark读取orc有3种不同方式, 不同方式的主要区别在于对文件划分split的方式不同(一般不需要修改)
原文描述: The HYBRID mode reads the footers for all files if there are fewer files than expected mapper count, switching over to generating 1 split per file if the average file sizes are smaller than the default HDFS blocksize. ETL strategy always reads the ORC footers before generating splits, while the BI strategy generates per-file splits fast without reading any data from HDFS.

  • BI :
    每个文件作为一个split, 这种方式不需要driver节点读取每个orc文件的file footer等任何文件元数据信息
  • ETL : driver节点需要读取所有文件的footer信息, 划分文件的几个stripe成为一个split
  • Hybrid :默认的读入方式
    • 如果文件个数<mapper个数, 使用ETL模式读取
    • 如果表的文件的平均大小<hdfs的块大小, 则使用BI模式
val sparkSession = SparkSession
  .builder()
  .appName("PvMvToBase")
  .config("hive.exec.orc.default.stripe.size", 268435456L)
  .config("hive.exec.orc.split.strategy", "BI")  // 可以设置成以BI策略读取orc文件, 减小
  .enableHiveSupport()
  .getOrCreate()

如果发生spark任务迟迟无法生成UI界面, 很可能是load orc表数据时, 计算split的时间太长; 此时是driver节点在读取每个文件的footer进行split划分计算, 可以通过将策略设置成BI模式, 跳过计算split的步骤

三. Spark-ORC日常操作

1. orc+zlib 和 orc+snappy的对比

ORC+Zlib after the columnar improvements no longer has the historic weaknesses of Zlib, so it is faster than SNAPPY to read, smaller than SNAPPY on disk and only ~10% slower than SNAPPY to write it out.

2. 查看生成的orc文件

    1. 查看hdfs上的orc文件块信息
$ hdfs fsck hdfs://yq01-ns1/user/hive/warehouse/tmp.db/table1_hive/001319_0 -files -blocks
spark-orc-block.png
    1. 查看orc文件的stripe个数等信息
$ hive --orcfiledump hdfs://yq01-ns1/user/hive/warehouse/tmp.db/table1_hive/001319_0 | less
spark-orc-stripe.png

四. 控制Spark输出文件的个数

    1. 因为每个reducer生成一个orc文件, 所以可以再最后一步带有shuffle的算子上这只partition个数
    1. 设置spark.sql.shuffle.partitions, 默认的shuffle并行度, 也能设置生成文件的个数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容