我正在使用PutHive3Streaming将Nifi的Avro数据加载到Hive。作为示例,我向Nifi发送10 MB数据Json数据,将其转换为Avro(将大小减小为118 KB),并使用PutHive3Streaming写入托管的配置单元表。但是,我看到数据没有在配置单元中压缩。
hdfs dfs -du -h -s /user/hive/warehouse/my_table*
32.1 M /user/hive/warehouse/my_table (<-- replication factor 3)
在表级别,我有:
STORED AS ORC
TBLPROPERTIES (
'orc.compress'='ZLIB',
'orc.compression.strategy'='SPEED',
'orc.create.index'='true',
'orc.encoding.strategy'='SPEED',
'transactional'='true');
并且我还启用了:
hive.exec.dynamic.partition=true
hive.optimize.sort.dynamic.partition=true
hive.exec.dynamic.partition.mode=nonstrict
hive.optimize.sort.dynamic.partition=true
avro.output.codec=zlib
hive.exec.compress.intermediate=true;
hive.exec.compress.output=true;
尽管如此,但Hive中未启用压缩。有任何指针可以启用此功能吗?
答案 0 :(得分:1)
Hive不会压缩Streaming Data Ingest API插入的数据。
压缩运行时将对其进行压缩。
参见https://cwiki.apache.org/confluence/display/Hive/Streaming+Data+Ingest+V2#StreamingDataIngestV2-APIUsage
如果您不想等待,请使用ALTER TABLE your_table PARTITION(key=value) COMPACT "MAJOR"
。
答案 1 :(得分:0)
是的,到目前为止,@ K.M是正确的,需要使用压缩。
a)需要使用Hive压缩策略来管理数据的大小。仅在压缩之后才对数据进行编码。以下是自动压缩的默认属性。
hive.compactor.delta.num.threshold=10
hive.compactor.delta.pct.threshold=0.1
b)尽管这是默认设置,但我进行压缩的挑战之一是,压缩清理程序无法在压缩之后(由压缩本身进行)访问nifi编写的delta文件(可删除)。我通过使用配置单元用户作为表所有者,并根据kerberos制定的标准为配置单元用户赋予了增量文件“权限”来解决此问题。
d)我继续面临的另一个挑战是触发自动压缩作业。在我的情况下,随着增量文件继续流式传输到给定表/分区的配置单元中,第一个主要压缩作业成功完成,删除了增量并创建了基本文件。但是在那之后,不会触发自动压缩作业。蜂巢会累积大量的增量文件。 (必须手动清理,<---不可取)