0
点赞
收藏
分享

微信扫一扫

如何在Impala中使用Parquet表

我是芄兰 2022-09-21 阅读 100

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。


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


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


1.文档编写目的



Parquet是一种列式的二进制文件格式,Impala基于Parquet文件可以高效的处理大型复杂查询。Parquet特别适合扫描表中的特定列的查询,例如查询具有多列的“宽”表,或者对于部分列或者全部列需要做聚合操作(例如SUM()和AVG())。


列式存储,顾名思义就是按照列进行存储数据,把某一列的数据连续的存储,每一行中的不同列的值离散分布。列式存储技术并不新鲜,在关系数据库中都已经在使用,尤其是在针对OLAP场景下的数据存储,由于OLAP场景下的数据大部分情况下都是批量导入,基本上不需要支持单条记录的增删改操作,而查询的时候大多数都是只使用部分列进行过滤、聚合,对少数列进行计算(基本不需要select * from xx之类的查询)。列式存储可以大大提升这类查询的性能,较之于行式存储,列式存储能够带来这些优化:

1.由于每一列中的数据类型相同,所以可以针对不同类型的列使用不同的编码和压缩方式,这样可以大大降低数据存储空间。


2.可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。


3.只读取需要的列,支持向量运算,能够获取更好的扫描性能。


Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。

1.查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL


2.计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite


3.数据模型: Avro, Thrift, Protocol Buffers, POJOs


Parquet列式存储带来的性能上的提高在业内已经得到了充分的认可,特别是当你们的表非常宽(column非常多)的时候,Parquet无论在资源利用率还是性能上都优势明显。Spark已经将Parquet设为默认的文件存储格式,Cloudera投入了很多工程师到Impala+Parquet相关开发中,Hive/Pig都原生支持Parquet。如果说HDFS是大数据时代文件系统的事实标准的话,Parquet就是大数据时代存储格式的事实标准。


本文主要是介绍如何在Impala中生成Parquet文件,并进行数据分析。 


  • 内容概述

1.测试数据准备

2.Impala创建Parquet表

3.验证


  • 测试环境

1.RedHat7.3

2.CM和CDH版本为5.13.1


  • 前置条件

1.已使用hive-testbench生成好Hive的基准测试数据


2.测试数据准备



1.使用hive-testbench生成15GB测试数据,挑选catalog_sales表做为测试表


生成的表数据为text类型


如何在Impala中使用Parquet表_hive


查看catalog_sales表生成的text数据大小


如何在Impala中使用Parquet表_hdfs_02


具体的数据如何生成,大家可以参考Fayson前面讲的《​​如何编译及使用hive-testbench生成Hive基准测试数据​​》。


2.查看catalog_sales表的数据量大小


如何在Impala中使用Parquet表_hdfs_03


测试表的数据量大小为21602679


3.Impala创建Parquet表



1.创建一个SQL脚本内容如下:


set parquet_file_size=512M;
set COMPRESSION_CODEC=snappy;
drop table if exists catalog_sales;
create table default.catalog_sales
stored as parquet
as select * from tpcds_text_15.catalog_sales;

(可左右滑动)


如何在Impala中使用Parquet表_数据_04


脚本描述:

  • Impala的当前会话设置Parquet文件的大小为512MB并设置其压缩格式为snappy
  • 在default库下创建一个与tpcds_text_15.catalog_sales表结构一致的Parquet表将tpcds_text_15.catalog_sales表数据插入到default.catalog_sales表中。
  • 统计分析default.catalog_sales表


2.在ImpalaDaemon节点的命令行执行如下脚本,创建Parquet表并导入数据


[root@ip-172-31-21-83 impala-parquet]# impala-shell -f load_parquet.sql 
Starting Impala Shell without Kerberos authentication

(可左右滑动)


如何在Impala中使用Parquet表_数据_05


命令执行成功,显示如下:


如何在Impala中使用Parquet表_hive_06


3.查看HDFS上catalog_sales表占用空间大小


[root@ip-172-31-16-68 ~]# hadoop fs -du -h /user/hive/warehouse

(可左右滑动)


如何在Impala中使用Parquet表_hdfs_07


查看catalog_sales表生成的parquet文件


如何在Impala中使用Parquet表_hive_08


4.验证



1.在命令行登录impala-shell


如何在Impala中使用Parquet表_hive_09


表的数据量大小与原始表tpcds_text_15.catalog_sales表数据量一致。


5.为Impala使用合适大小的Parquet block size



默认情况下,Impala的INSERT...SELECT语句创建的Parquet文件的块大小是256MB。这个是在Impala2.0开始生效的。以前,这个默认的大小为1GB,但Impala还会使用一些压缩,所以导致生成的文件会小于1GB。

 

被Impala写入的Parquet文件都是一个单独的块,允许整个文件刚好由一台机器处理。在将Parquet文件拷贝到HDFS其他目录或者其他HDFS时,请使用hdfs dfs -pb来保留原始块大小。

 

如果Parquet表中或者查询访问的某个分区中只有一个或几个数据块,则可能会导致查询性能下降:没有足够的数据来利用Impala查询的分布式能力。每个数据块由其中一台DataNode上的单个CPU核来处理。

 

在一个由100个节点组成的16核机器中,你可以同时处理数千个数据文件。如果我们希望在“许多小文件”和“单个大文件”之间找到一个高I/O和并行处理能力的平衡点,就可以在执行INSERT...SELECT语句之前设置PARQUET_FILE_SIZE,以控制每个生成的Parquet文件的大小。Impala2.0之前你要指定绝对字节数,2.0以后你可以以m或者g为单位,分别代表MB和GB大小。基于特定的数据量选择不同的file size做一些基准测试,然后找到适合你集群和数据文件的PARQUET_FILE_SIZE大小。


6.备注:如何保留HDFS的block size拷贝数据



HDFS的Block大小设置为


如何在Impala中使用Parquet表_hive_10


生成parquet文件内容查看


如何在Impala中使用Parquet表_hdfs_11


查看parquet文件ee435eda333de93f-921275b700000000_36230343_data.0.parq文件的block数量


hadoop fsck -blocks /user/hive/warehouse/catalog_sales/ee435eda333de93f-921275b700000000_36230343_data.0.parq

(可左右滑动)


如何在Impala中使用Parquet表_hive_12


从上面的截图可以看到该文件的block数量为1接下来使用HDFS的distcp命令拷贝文件并保留文件原始块大小:


hadoop distcp -pb /user/hive/warehouse/catalog_sales/ee435eda333de93f-921275b700000000_36230343_data.0.parq /fayson/block-test/test.parq

(可左右滑动)


如何在Impala中使用Parquet表_数据_13


文件拷贝成功后查看文件的block数量


如何在Impala中使用Parquet表_hive_14


可以看到拷贝后文件的block数量没有随着HDFS设置的128MB而变化,文件的大小与源文件一致。

 

参考:

​​http://community.cloudera.com/t5/Interactive-Short-cycle-SQL/Recommended-file-size-for-Impala-Parquet-files/td-p/62480​​

​​http://community.cloudera.com/t5/Batch-SQL-Apache-Hive/Parquet-table-snappy-compressed-by-default/m-p/51914#M1822​​

​​https://www.cloudera.com/documentation/enterprise/latest/topics/impala_parquet_file_size.html​​

​​https://www.cloudera.com/documentation/enterprise/latest/topics/impala_parquet.html​​

​​https://www.cloudera.com/documentation/enterprise/latest/topics/impala_perf_cookbook.html#perf_cookbook__perf_cookbook_parquet_block_size​​



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


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

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。



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

如何在Impala中使用Parquet表_数据_15

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


举报

相关推荐

0 条评论