- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题分为两部分:
各种帖子显示可能存在问题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")
但是,我也不太确定我在这里需要哪些 key 。
NOTE: the 1.4
native
version of ORC is used..set("spark.sql.orc.impl", "native")
.set("spark.sql.hive.convertMetastoreOrc", "true")
My data set is repartitioned and sorted using
df.repartition(number, c1,c2,...).sortWithin("c1, c2", "c3", ...)
a secondary sort. The order of sort columns is chosen by the cardinality of costly (long string) columns. Highest ones go first.
我想将压缩后的 orc 文件写入 HDFS。小文件大小问题是我所知道的并且显然想要防止的问题 - 但是另一个方向呢?例如,如果相应地重新分区,我的一个数据集将生成 800MB 压缩的 orc 文件(分区内的单个文件)。这些 800MB 是否已经被认为太大了?我应该尝试将这些大小调整为大约 300MB 左右吗?还是400MB?请记住,它们已经被 gzip 压缩了。
目前,我观察到:
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 中使用吗?
请与我分享任何其他调整技巧。
最佳答案
问题的相当一部分仍然悬而未决。请改进答案。
对于 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 时设置这些,请确保在它们前面加上 spark.orc.bloom.filter.columns
否则它们将被忽略。
选择正确的文件大小很重要。越大越好。事实上,我可以观察到 5 个文件与 10 个文件的大约 1GB 的差异(5 个文件的存储要求更少)。
https://community.cloudera.com/t5/Community-Articles/ORC-Creation-Best-Practices/ta-p/248963 ORC files are splittable on a stripe level. Stripe size is configurable and should depend on average length (size) of records and on how many unique values of those sorted fields you can have. If search-by field is unique (or almost unique), decrease stripe size, if heavily repeated – increase. While default is 64 MB, keep stripe size in between ¼ of block-size to 4 blocks-size (default ORC block size is 256 MB
这意味着更大的 strip 更好,但在加载过程中创建更耗时(权衡)。
索引 在 Hive 3.0 中从 hives 端删除,因为它们的功能直接在 ORC 文件中实现(排序时的 min-max 对范围非常有效,bloomfilter 对 equi-join 条件。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing
另外创建一个 bloomfilter 是有意义的,但需要在存储和时间上进行权衡。创建 bloomfilters 后,可以使用 orce-tools
Stripes:
Stripe: offset: 3 data: 20833464 rows: 3475000 tail: 256 index: 3981255
Stream: column 0 section ROW_INDEX start: 3 length 52
Stream: column 0 section BLOOM_FILTER start: 55 length 17940
Stream: column 1 section ROW_INDEX start: 17995 length 31010
Stream: column 1 section BLOOM_FILTER start: 49005 length 610564
Stream: column 2 section ROW_INDEX start: 659569 length 4085
Stream: column 2 section BLOOM_FILTER start: 663654 length 378695
Stream: column 3 section ROW_INDEX start: 1042349 length 11183
Stream: column 3 section BLOOM_FILTER start: 1053532 length 1936342
排序是至关重要的 ( https://community.cloudera.com/t5/Community-Articles/ORC-Creation-Best-Practices/ta-p/248963 ),应该作为次要排序执行(正如问题中已经概述的那样)。
这看起来很有用并且不需要超耗时的微调:
orc.dictionary.key.threshold=0.95 # force dict (almost) always (seems useful for almost all (non streaming) use cases)
orc.bloom.filter.columns "*" # do not use star, but select desired columns to save space
此外,orc.column.encoding.direct https://orc.apache.org/specification/ORCv1/ (搜索这些不同的编码)可能有意义。
spark 建议 https://spark.apache.org/docs/latest/cloud-integration.html :
spark.sql.orc.filterPushdown true
spark.sql.orc.splits.include.file.footer true
spark.sql.orc.cache.stripe.details.size 10000
spark.sql.hive.metastorePartitionPruning true
为什么它们保持这么小(即使试图增加它们)。请记住:2.2.x、HDP 2.6.4 和 native ORC 支持应该已经修复。
何时使用 bloomfilters,何时使用这些过大杀伤力?
https://www.slideshare.net/BenjaminLeonhardi/hive-loading-data
关于apache-spark - spark ORC微调(文件大小,条纹),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58511045/
我在 Hive 中有一个分区的 ORC 表。在用所有可能的分区加载表后,我得到了 HDFS - 多个 ORC 文件,即 HDFS 上的每个分区目录都有一个 ORC 文件。对于某些用例,我需要将每个分区
关于 SO 和网络的大多数问题/答案都讨论了使用 Hive 将一堆小的 ORC 文件组合成一个更大的文件,但是,我的 ORC 文件是按天分隔的日志文件,我需要将它们分开。我只想每天“汇总”ORC 文件
我正在对 Hive 可用的存储格式进行一些测试,并使用 Parquet 和 ORC 作为主要选项。我将 ORC 一次包含在默认压缩中,一次包含在 Snappy 中。 我读过许多文档,指出 Parque
我正在尝试使用上面提到的 orc 工具 jar 来转换 JSON 文件 https://orc.apache.org/docs/tools.html#java-orc-tools 我已将其导入到我的
我创建了一个存储为 ORC 的托管配置单元表,当加载 .txt 文件时它工作正常,但是我无法将 ORC 文件加载到该表中。与分隔符有什么关系吗?还是我错过了什么? 最佳答案 下面的代码对我有用,同时将
当我读取 orcfile 并将数据写入 orcfile 时,出现以下错误: expected org.apache.hadoop.hive.ql.io.orc.OrcStruct, received
在浏览了一个示例 ORC 文件后,我了解到 ORC 文件格式不存储任何列信息,实际上所有列名都会被替换为 _c0 到 _cn,在这种情况下如何为 ORC 实现适当的架构演变表? 最佳答案 ORC 格式
我在 HDFS 中有一些数据是使用 Sqoop 导入的。数据以 ORC 格式导入,压缩为 Snappy。 我正在尝试使用以下 DDL 语句在此数据之上创建一个表。但是,我收到以下错误。 FAILED:
我有一个程序,其输入应为 ORC 文件格式。 我希望能够检查提供的输入是否实际上是一个 ORC 文件。仅检查扩展名是不够的,因为用户可以省略扩展名。 例如,对于 Parquet,我们可以 check如
我目前正在实现对 HDFS 和 Hive 表的监控数据的 ETL (Talend)。 我现在面临重复的问题。更详细地说,如果我们需要使用相同的输入运行一个 ETL 作业 2 次,我们最终会在 Hive
create table n_data(MARKET string,CATEGORY string,D map,monthid int,value DOUBLE) STORED AS ORC
如何将文本文件加载到 Hive orc 外部表中? create table MyDB.TEST ( Col1 String, Col2 String, Col3 String, Col4 S
在 HDP 2.3 for Windows 中的 Apache Pig 交互式 shell 中工作,我在 /path/to/file 中有一个现有的 ORC 文件。如果我加载然后保存使用: a = L
假设我有一个像这样的 Hive 查询: CREATE TABLE student (key string, name string, course struct) STORED AS ORC; 由于
我可以更新单个列,但不能更新从另一个表引用的多个列。 我启用了所有 ACID 属性以支持配置单元 (1.2.1) 表更新。 我有两个表, 表 1: 架构: create table table1(em
我正在尝试使用 orc-core 编写 orc 文件稍后由 hive 读取。 正在写入的文件具有正确的行数,但列中没有内容。我可以看到,两者都试图在配置单元中使用选择查询读取文件,并且都使用 hive
我读过很多关于 ORC 文件格式在压缩和快速查询方面有多么出色的帖子,特别是与 Parquet 格式相比。我了解 ORC 如何跨行组拆分数据,将它们分割为列组,以及它如何使用元数据和内部统计信息来跳过
我有一个要求,我想将 5GB ORC 文件拆分为 5 个文件,每个文件大小为 1GB。ORC 文件是可拆分的。这是否意味着我们只能逐条分割文件?但我有要求根据大小拆分 orc 文件。例如,将 5GB
将 Hive 外部表从 RC 升级为 ORC 格式并在其上运行 MSCK REPAIR TABLE 时,当我从表中选择全部时,出现以下错误 - Failed with exception java.i
我是大数据和相关技术的新手,所以我不确定我们是否可以将数据附加到现有的 ORC 文件中。我正在使用 Java API 编写 ORC 文件当我关闭 Writer 时,我无法再次打开文件来写入新内容,基本
我是一名优秀的程序员,十分优秀!