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

时间:2022-10-04 13:57:36

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


Fayson的github:

​https://github.com/fayson/cdhproject​


提示:代码块部分可以左右滑动查看噢


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>


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


2.此表的HDFS的大小为4.3GB


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


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;


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

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


5.查看压缩存储后的表hive_table_test_parquet_snappy的数据:(正常)


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


6.通过查看HDFS文件大小,可以看到压缩存储后的文件小了:


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


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


0632-6.2-通过Hive生成的Snappy表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'


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


报错:

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



2

问题分析


1.查看hive_table_test_parquet_snappy表的底层文件


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


可以发现生成文件的后缀都是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;


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

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


2.使用Hive查看该表的schema以及进行查看,都正常。


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


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


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


4.查看hive_table_test_parquet_snappy的底层文件


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


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


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


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


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


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不支持的。


提示:代码块部分可以左右滑动查看噢


为天地立心,为生民立命,为往圣继绝学,为万世开太平。

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。


推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

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

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操