火花ORC微调(文件大小,条纹)

问题描述 投票:0回答:1

我的问题分为两部分:

如何使用Spark设置(微调)高级ORC参数?

[各种帖子显示可能存在问题Spark Small ORC StripesHow 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")

但是,我也不太确定我在这里需要哪些键。

注意:使用ORC的1.4 native版本。

 .set("spark.sql.orc.impl", "native")
  .set("spark.sql.hive.convertMetastoreOrc", "true")

选择正确的参数:

我的数据集被重新分区并使用df.repartition(number, c1,c2,...).sortWithin("c1, c2", "c3", ...)进行二次排序。排序列的顺序由昂贵(长字符串)列的基数来选择。最高者优先。

文件大小

我想将压缩的orc文件写入HDFS。小文件大小问题是我已经知道的,显然是要防止的-但是其他方向呢?例如,如果相应地重新分区,我的数据集之一将生成800MB压缩的orc文件(分区内的单个文件)。这些800MB是否已经被认为太大?我是否应该尝试将其大小调整为大约300MB?还是400MB?请记住,它们已经被压缩了。

条带大小

目前,我从以下位置观察:

java-jar orc-tools meta foo.orc

此文件之前(还有其他文件)的火花似乎会产生大约16MB的条纹,在这种情况下为49MB。

这是第一个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
1个回答
0
投票

不完全的学习

问题的某些部分仍未解决。请改进答案。

如何在Spark中设置调整参数

对于ORC高级设置:

https://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html

usersDF.write.format("orc")
  .option("orc.bloom.filter.columns", "favorite_color")
  .option("orc.dictionary.key.threshold", "1.0")
  .save("users_with_options.orc")

实际上,可以简单地将其作为.option传递给writer。如果要在使用--conf启动火花时设置这些设置,请确保在其前面加上spark.orc.bloom.filter.columns作为前缀,否则将被忽略。

选择参数

文件大小

选择正确的文件大小很重要。越大往往越好。实际上,我可以观察到5个文件和10个文件在1GB左右的差异(5个文件的存储需求较少)。

TBC

什么仍然开放

  • 有关选择正确参数的更多信息
© www.soinside.com 2019 - 2024. All rights reserved.