【发布时间】:2020-02-19 00:05:37
【问题描述】:
我的问题分为两部分:
如何使用 spark 设置(微调)高级 ORC 参数?
各种帖子显示Spark Small ORC Stripes、How to set ORC stripe size in Spark可能存在问题。我目前在 HDP 2.6.4 平台上使用 spark 2.2,所以根据https://community.cloudera.com/t5/Support-Questions/Spark-ORC-Stripe-Size/td-p/189844 这应该已经解决了。尽管如此,我不清楚在执行时如何设置这些参数:
df.write.orc("/path/to/file")
也许只是一个:
df.write.options(Map("key"-> "value")).orc("/path/to/file")
但是,我也不太确定这里需要哪些键。
注意:使用的是 1.4
native版本的 ORC。.set("spark.sql.orc.impl", "native") .set("spark.sql.hive.convertMetastoreOrc", "true")
选择正确的参数:
我的数据集使用
df.repartition(number, c1,c2,...).sortWithin("c1, c2", "c3", ...)二次排序进行了重新分区和排序。排序列的顺序由昂贵(长字符串)列的基数选择。最高的先去。
文件大小
我想将 gzip 压缩的 orc 文件写入 HDFS。 小文件大小问题是我所知道的并且显然想要防止 - 但另一个方向呢? 例如,如果相应地重新分区,我的一个数据集将生成 800MB gzipped orc 文件(分区内的单个文件)。 这些 800MB 是否已经被认为太大了?我应该尝试将这些大小调整为大约 300MB 左右吗?还是400MB?请记住,它们已经被压缩了。
条带大小
目前,我从以下方面观察:
java-jar orc-tools meta foo.orc
对于这个文件之前(以及其他文件)spark 似乎创建了大小约为 16MB 的条纹,即在这种特殊情况下为 49。
这是第一个 Stripe 的输出示例:
Stripe 1:
Column 0: count: 3845120 hasNull: false
Column 1: count: 3845120 hasNull: false min: a max: b sum: 246087680
Column 2: count: 3845120 hasNull: false min: aa max: bb sum: 30288860
Column 3: count: 3845120 hasNull: false min: aaa max: bbb sum: 89174415
Column 4: count: 3845120 hasNull: false
Column 5: count: 3845120 hasNull: false min: 2019-09-24 00:00:00.0 max: 2019-09-24 23:45:00.0 min UTC: 2019-09-24 02:00:00.0 max UTC: 2019-09-25 01:45:00.0
Column 6: count: 3845120 hasNull: false min: 2019-09-24 00:15:00.0 max: 2019-09-25 00:00:00.0 min UTC: 2019-09-24 02:15:00.0 max UTC: 2019-09-25 02:00:00.0
Column 7: count: 3845120 hasNull: false min: 1 max: 36680 sum: 36262602
在列出所有条纹后的详细输出中(同样是第一个条纹):
Stripes:
Stripe: offset: 3 data: 17106250 rows: 3845120 tail: 185 index: 51578
Stream: column 0 section ROW_INDEX start: 3 length 55
Stream: column 1 section ROW_INDEX start: 58 length 21324
Stream: column 2 section ROW_INDEX start: 21382 length 3944
Stream: column 3 section ROW_INDEX start: 25326 length 12157
Stream: column 4 section ROW_INDEX start: 37483 length 55
Stream: column 5 section ROW_INDEX start: 37538 length 4581
Stream: column 6 section ROW_INDEX start: 42119 length 4581
Stream: column 7 section ROW_INDEX start: 46700 length 4881
Stream: column 1 section DATA start: 51581 length 57693
Stream: column 1 section LENGTH start: 109274 length 16
Stream: column 1 section DICTIONARY_DATA start: 109290 length 623365
Stream: column 2 section DATA start: 732655 length 447898
Stream: column 2 section LENGTH start: 1180553 length 148
Stream: column 2 section DICTIONARY_DATA start: 1180701 length 968
Stream: column 3 section DATA start: 1181669 length 2449521
Stream: column 3 section LENGTH start: 3631190 length 6138
Stream: column 3 section DICTIONARY_DATA start: 3637328 length 303255
Stream: column 5 section DATA start: 3940583 length 5329298
Stream: column 5 section SECONDARY start: 9269881 length 172
Stream: column 6 section DATA start: 9270053 length 5334123
Stream: column 6 section SECONDARY start: 14604176 length 172
Stream: column 7 section DATA start: 14604348 length 2553483
Encoding column 0: DIRECT
Encoding column 1: DICTIONARY_V2[16914]
Encoding column 2: DICTIONARY_V2[214]
Encoding column 3: DICTIONARY_V2[72863]
Encoding column 4: DIRECT
Encoding column 5: DIRECT_V2
Encoding column 6: DIRECT_V2
Encoding column 7: DIRECT_V2
这里推荐什么? Hive 默认值似乎提到了 256MB,但这似乎与 spark 计算的值范围完全不同。这里的理由是什么?
为什么会这样:
spark.conf.get("orc.dictionary.key.threshold")
java.util.NoSuchElementException: orc.dictionary.key.threshold
即使可以清楚地看到以某种方式设置了字典,但还是失败了?查看 spark 的代码库,我无法识别在任何地方设置的此属性https://github.com/apache/spark/search?q=orc.dictionary.key.threshold&unscoped_q=orc.dictionary.key.threshold
兽人好东西
最近版本的 orc 引入了布隆过滤器和索引。这些也可以从 spark 中使用吗?
其他调优技巧
请与我分享任何其他调整技巧。
【问题讨论】:
标签: apache-spark hive filesize orc