0632-6.2-通过Hive生成的Snappy表Impala无法访问异常分析

Fayson的github: https://github.com/fayson/cdhproject

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f

1 问题重现

  • 测试环境:

1.CDH6.2
2.集群已开启Kerberos
3.Redhat7.4

1.已经准备好一个Parquet文件的表。

hive> show create table hive_table_test_parquet_snappy;
OK
CREATE TABLE `hive_table_test_parquet_snappy`(
  `s1` string, 
  `s2` string, 
  `s3` string, 
  `s4` string, 
  `s5` string, 
  `s6` string, 
  `s7` string, 
  `s8` string, 
  `s9` string, 
  `s10` string, 
  `s11` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  'hdfs://ip-172-31-6-83.ap-southeast-1.compute.internal:8020/user/hive/warehouse/hive_table_test_parquet_snappy'
TBLPROPERTIES (
  'transient_lastDdlTime'='1557893659')
Time taken: 0.133 seconds, Fetched: 22 row(s)
hive>

在这里插入图片描述
2.此表的HDFS的大小为4.3GB

在这里插入图片描述
3.操作目标:把此hive表(hive_table_test_parquet)在表结构不变,数据内容不变的情况下压缩存储,得到新表(hive_table_test_parquet_snappy,此表记录数跟内容跟hive_table_test_parquet应该完全一致,但hdfs文件应该显著变小)

4.设置Hive压缩,并新建另外一张表。

set hive.exec.compress.output=true;
set hive.parquet.compression=snappy;

create table hive_table_test_parquet_snappy as select * from hive_table_test_parquet;

在这里插入图片描述

在这里插入图片描述
5.查看压缩存储后的表hive_table_test_parquet_snappy的数据:(正常)
在这里插入图片描述

6.通过查看HDFS文件大小,可以看到压缩存储后的文件小了:
在这里插入图片描述

7.用impala查看压缩存储后的表结构及数据,先查看未压缩存储的表:正常

在这里插入图片描述
8.然后查看压缩存储后的表:不正常

[ip-172-31-12-142.ap-southeast-1.compute.internal:21000] default> select *from hive_table_test_parquet_snappy limit 1;   
Query: select *from hive_table_test_parquet_snappy limit 1
Query submitted at: 2019-05-15 00:05:38 (Coordinator: http://ip-172-31-12-142.ap-southeast-1.compute.internal:25000)
Query progress can be monitored at: http://ip-172-31-12-142.ap-southeast-1.compute.internal:25000/query_plan?query_id=c6434c4543e6fd8b:9624686200000000
ERROR: Scanner plugin 'DEFLATE' is not one of the enabled plugins: 'LZO'

在这里插入图片描述

报错:

ERROR: Scanner plugin ‘DEFLATE’ is not one of the enabled plugins: ‘LZO’

2 问题分析

1.查看hive_table_test_parquet_snappy表的底层文件
在这里插入图片描述
可以发现生成文件的后缀都是deflate,deflate是区别于snappy,gzip的其他压缩格式。这种格式目前在Impala中还不支持,而Hive能支持,导致同样的表在Hive中能查询,而在Impala中查询不了。即在通过Parquet表生成同样的snappy压缩格式的文件时失败,主要是hive.parquet.compression参数Hive不认识。

3 问题解决

1.重新生成hive_table_test_parquet_snappy表,使用以下语句:

set parquet.compression=SNAPPY;
create table hive_table_test_parquet_snappy stored as parquet as select * from hive_table_test_parquet;

在这里插入图片描述

在这里插入图片描述
2.使用Hive查看该表的schema以及进行查看,都正常。

在这里插入图片描述

3.使用Impala查询,也正常。

在这里插入图片描述
4.查看hive_table_test_parquet_snappy的底层文件

在这里插入图片描述

使用parquet-tools命令能查看该文件,说明是parquet文件,里面显示文件的压缩是snappy

5.与之前的parquet文件的大小进行比较

在这里插入图片描述

发现已经被压缩,文件有缩小。

4 问题总结

1.为什么使用Hive生成的“snappy”文件无法被Impala查询,是因为生成的并不是snappy文件,而是deflate的压缩文件,而该压缩在Impala中并不支持。

2.如果源表(bbb)是parquet格式的文件表,使用create aaa as select * from bbb;语句并不能让aaa表也是parquet格式,而是textfile的,需要使用create aaa stored as parquet as select * from bbb;

3.如果需要让Hive生成Snappy的压缩表,并不需要设置set hive.exec.compress.output=true;与set hive.parquet.compression=snappy;,只需要设置set parquet.compression=SNAPPY;即可,另外hive.parquet.compression该参数是Hive不支持的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值