您的位置 首页 > 数码极客

【ods文件怎么打开】0405-如何使用Impala合并小文件

温馨提示:如果使用计算机发现图片不清晰,可以使用手机点击打开文章文本的图片进行放大,查看高清原件。(大卫亚设)。

Fayson的github:

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

1.文档编写目的


Fayson在前面的文章《

如何在Hadoop中处理小文件

》里面介绍了多种处理方式。在Impala表中使用小文件也会降低Impala和HDFS的性能,本篇文章Fayson主要介绍如何使用Impala合并小文件。

  • 内容概述

1.环境准备

2.Impala合并小文件实现

3.验证小文件是否合并

  • 测试环境说明

1.CM5.15.0和CDH5.14.2

2.环境准备


在这里测试Fayson准备了4张表,两个有数据的表ods_user和ods_user_256表,ods_user表的数据量大于Impala默认的Block(256MB)大小,ods_user_256表的数据量小于Impala默认的Block大小。

1.准备一个测试表ods_user,该表中有888个小文件,如下截图所示

命令行查看该表下的数据文件:

[root@cdh03 ~]# hadoop fs -ls /user/hive/warehouse/ods_user |wc -l [root@cdh03 ~]# hadoop fs -du -h /user/hive/warehouse/ods_user |more

(可左右滑动)

2. 准备测试表ods_user_256,该表有7个小文件,如下截图所示:

3.使用建表语句创建2个与ods_user表结构一致的表ods_user_temp和ods_user_256_temp

[cd] > create table ods_user_temp like ods_user; [cd] > select * from ods_user_temp; [cd] > create table ods_user_256_temp like ods_user; [cd] > select * from ods_user_256_temp;

(可左右滑动)

3.Impala合并小于Impala Block的小文件


1.执行如下脚本将ods_user_256表中的数据写入到ods_user_256_temp表中

[cd] > insert overwrite table ods_user_256_temp select * from ods_user_256;

(可左右滑动)

查看ods_user_256_temp表数据文件数量

[root@cdh03 ~]# hadoop fs -du -h /user/hive/warehouse/ods_user_256_temp

(可左右滑动)

上图可以看到文件数量由原表的7个减少到3个但还是生成了多个小文件,这里应该跟Impala节点数有关。

2.将ods_user_256_temp表中的数据再写回ods_user_256表中,注意在这一步Fayson会进行小文件合并操作,具体执行命令如下

[cd] > set NUM_NODES=1; [cd] > insert overwrite table ods_user_256 select * from ods_user_256_temp;

(可左右滑动)

在命令行查看ods_user_256表数据文件数量

[root@cdh03 ~]# hadoop fs -du -h /user/hive/warehouse/ods_user_256

(可左右滑动)

由上图可以看到ods_user_256表的文件数量被合并为1个了。

4.Impala合并大于Impala Block的小文件


1.执行如下脚本将ods_user表中的数据写入到ods_user_temp表中

[cd] > insert overwrite table ods_user_temp select * from ods_user;

(可左右滑动)

查看ods_user_temp表数据文件数量

[root@cdh03 ~]# hadoop fs -du -h /user/hive/warehouse/ods_user_temp

(可左右滑动)

2.将ods_user_temp表中的数据再写回ods_user表中,注意在这一步Fayson会进行小文件合并操作,具体执行命令如下

[cd] > set NUM_NODES=1; [cd] > insert overwrite table ods_user select * from ods_user_temp;

(可左右滑动)

在命令行查看ods_user表数据文件数量

[root@cdh03 ~]# hadoop fs -du -h /user/hive/warehouse/ods_user

(可左右滑动)

由上图可以看到ods_user表生成了多个文件,但每个文件的大小在Impala默认的block大小范围内。

5.总结


1.在设置了NUM_NODES=1后,如果合并的数据量超过Impala默认的Parquet Block Size(256MB)大小时会生成多个文件,每个文件的大小在256MB左右,如果合并的数据量小于256MB则最终只会生成一个文件。

2.通过设置NUM_NODES=1强制Impala使用一个节点Daemon来处理整个Query,因此最终只会输出一个文件到HDFS。

3.在使用该配置项时会引起单个主机的资源利用率增加,导致SQL运行缓慢,超出内存限制或查询挂起等。

4.该参数没办法设置超过1,即无论你有多少台机器,多大数据量,想使用该方法,也只能设置为1,让一台机器来慢慢帮你合并文件,所以该方法不是太实用,仅供参考。

6.备注:NUM_NODES参数说明


该参数用来限制执行查询作业的节点数,常见的场景是用于调试/debug查询的时候。它是一个数值类型,但只有两个值,默认是0即使用所有节点来执行查询,也可以设置为1即所有的查询子任务都会在coordinator节点上个执行。

如果你在调试某个查询作业,怀疑是因为分布式计算才导致的执行时间较长,可以将NUM_NODES设置为1,从而可以校验同样的作业在单个节点上执行时是否问题依旧存在。当然也可以在执行INSERT或者CREATE TABLE AS SELECT加上这个参数的设置来解决小文件的问题,也即是本篇文章正文所分析的内容。

注意:设置该参数会导致单台节点资源使用增加,从而影响集群上别的查询作业比如导致执行缓慢,hang住或者OOM。所以建议在开发/测试环境中使用,或者如果你的生产系统不是太繁忙的时候使用。

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

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

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

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

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

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐