温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github:
提示:代码块部分可以左右滑动查看噢
1
问题重现
- 测试环境:
1.CDH6.2
2.集群已开启Kerberos
3.Redhat7.4
1.已经准备好一个Parquet文件的表。
2.此表的HDFS的大小为4.3GB
3.操作目标:把此hive表(hive_table_test_parquet)在表结构不变,数据内容不变的情况下压缩存储,得到新表(hive_table_test_parquet_snappy,此表记录数跟内容跟hive_table_test_parquet应该完全一致,但hdfs文件应该显著变小)
4.设置Hive压缩,并新建另外一张表。
5.查看压缩存储后的表hive_table_test_parquet_snappy的数据:(正常)
6.通过查看HDFS文件大小,可以看到压缩存储后的文件小了:
7.用impala查看压缩存储后的表结构及数据,先查看未压缩存储的表:正常
8.然后查看压缩存储后的表:不正常
报错:
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表,使用以下语句:
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不支持的。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。
温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操