×

hive分析结果为多个小文件格式

hive分析结果为多个小文件格式(hive小文件合并处理)

admin admin 发表于2023-03-29 10:37:20 浏览52 评论0

抢沙发发表评论

本文目录一览:

hive的几种文件格式

hive文件存储格式包括以下几类:

1、TEXTFILE

2、SEQUENCEFILE

3、RCFILE

4、ORCFILE(0.11以后出现)

其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;

SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。-hive分析结果为多个小文件格式

前提创建环境:

hive 0.8

创建一张testfile_table表,格式为textfile。

create table if not exists testfile_table( site string, url  string, pv   bigint, label string) row format delimited fields terminated by '\t' stored as textfile;-hive分析结果为多个小文件格式

load data local inpath '/app/weibo.txt' overwrite into table textfile_table;

一、TEXTFILE

默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,

从而无法对数据进行并行操作。

示例:

create table if not exists textfile_table(

site string,

url  string,

pv   bigint,

label string)

row format delimited

fields terminated by '\t'stored as textfile;

插入数据操作:set hive.exec.compress.output=true;  

set mapred.output.compress=true;  

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  

set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  

insert overwrite table textfile_table select * from textfile_table;  

二、SEQUENCEFILE

SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。

SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。

示例:

create table if not exists seqfile_table(

site string,

url  string,

pv   bigint,

label string)

row format delimited

fields terminated by '\t'stored as sequencefile;

插入数据操作:set hive.exec.compress.output=true;  

set mapred.output.compress=true;  

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  

set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  

SET mapred.output.compression.type=BLOCK;insert overwrite table seqfile_table select * from textfile_table;  -hive分析结果为多个小文件格式

三、RCFILE

RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

RCFILE文件示例:

create table if not exists rcfile_table(

site string,

url  string,

pv   bigint,

label string)

row format delimited

fields terminated by '\t'stored as rcfile;

插入数据操作:set hive.exec.compress.output=true;  

set mapred.output.compress=true;  

set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;  

set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;  

insert overwrite table rcfile_table select * from textfile_table;

四、ORCFILE()

五、再看TEXTFILE、SEQUENCEFILE、RCFILE三种文件的存储情况:

[hadoop@node3 ~]$ hadoop dfs -dus /user/hive/warehouse/*hdfs://node1:19000/user/hive/warehouse/hbase_table_1    0-hive分析结果为多个小文件格式

hdfs://node1:19000/user/hive/warehouse/hbase_table_2    0

hdfs://node1:19000/user/hive/warehouse/orcfile_table    0

hdfs://node1:19000/user/hive/warehouse/rcfile_table    102638073

hdfs://node1:19000/user/hive/warehouse/seqfile_table   112497695

hdfs://node1:19000/user/hive/warehouse/testfile_table  536799616

hdfs://node1:19000/user/hive/warehouse/textfile_table  107308067

[hadoop@node3 ~]$ hadoop dfs -ls /user/hive/warehouse/*/-rw-r--r--   2 hadoop supergroup   51328177 2014-03-20 00:42 /user/hive/warehouse/rcfile_table/000000_0-rw-r--r--   2 hadoop supergroup   51309896 2014-03-20 00:43 /user/hive/warehouse/rcfile_table/000001_0-rw-r--r--   2 hadoop supergroup   56263711 2014-03-20 01:20 /user/hive/warehouse/seqfile_table/000000_0-rw-r--r--   2 hadoop supergroup   56233984 2014-03-20 01:21 /user/hive/warehouse/seqfile_table/000001_0-rw-r--r--   2 hadoop supergroup  536799616 2014-03-19 23:15 /user/hive/warehouse/testfile_table/weibo.txt-rw-r--r--   2 hadoop supergroup   53659758 2014-03-19 23:24 /user/hive/warehouse/textfile_table/000000_0.gz-rw-r--r--   2 hadoop supergroup   53648309 2014-03-19 23:26 /user/hive/warehouse/textfile_table/000001_1.gz-hive分析结果为多个小文件格式

总结:

相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势。-hive分析结果为多个小文件格式

Hive和Spark当中对小文件的处理

数仓面试高频考点:

【在Hive中如何解析小文件过多问题,指定的是:处理表中数据时,有很多小文件】

| Table Parameters: | NULL | NULL |-hive分析结果为多个小文件格式

| | bucketing_version | 2 |-hive分析结果为多个小文件格式

| | numFiles | 1 |-hive分析结果为多个小文件格式

| | numRows | 0 |-hive分析结果为多个小文件格式

| | rawDataSize | 0 |-hive分析结果为多个小文件格式

| | totalSize | 656 |-hive分析结果为多个小文件格式

| | transient_lastDdlTime | 1631525001 |-hive分析结果为多个小文件格式

如果没有显示表的统计信息,执行如下命令,再次查看表信息

ANALYZE TABLE db_hive.emp COMPUTE STATISTICS;

| Table Parameters: | NULL | NULL |-hive分析结果为多个小文件格式

| | COLUMN_STATS_ACCURATE | {"BASIC_STATS":"true"} |-hive分析结果为多个小文件格式

| | bucketing_version | 2 |-hive分析结果为多个小文件格式

| | numFiles | 1 |-hive分析结果为多个小文件格式

| | numRows | 14 |-hive分析结果为多个小文件格式

| | rawDataSize | 643 |-hive分析结果为多个小文件格式

| | totalSize | 656 |-hive分析结果为多个小文件格式

| | transient_lastDdlTime | 1655113125 |-hive分析结果为多个小文件格式

| | NULL | NULL |-hive分析结果为多个小文件格式

第一种,将小文件合并成一个大文件

第二种,使用SparkContext中提供: wholeTextFiles 方法,专门读取小文件数据。

将每个文件作为一条KV存储在RDD中, K:文件名的绝对路径,V:文件的内容

用于解决小文件的问题,可以将多个小文件变成多个KV,自由指定分区个数

Hive如何处理大量小文件

1.动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增

2.数据源本身就包含有大量的小文件

3.reduce个数越多,生成的小文件也越多

1 从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能

2 在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展

4.1 使用Hadoop achieve把小文件进行归档

4.2 重建表,建表时减少reduce的数量

4.3 通过参数调节,设置map/reduce的数量

4.3.1设置map输入合并小文件的相关参数:

4.3.2 设置map输出和reduce输出进行合并的相关参数:

HIVE:小文件合并

HDFS非常容易存储大数据文件,如果Hive中存在过多的小文件会给namecode带来巨大的性能压力。同时小文件过多会影响JOB的执行,hadoop会将一个job转换成多个task,即使对于每个小文件也需要一个task去单独处理,task作为一个独立的jvm实例,其开启和停止的开销可能会大大超过实际的任务处理时间。-hive分析结果为多个小文件格式

同时我们知道hive输出最终是mr的输出,即reducer(或mapper)的输出,有多少个reducer(mapper)输出就会生成多少个输出文件,根据shuffle/sort的原理,每个文件按照某个值进行shuffle后的结果。-hive分析结果为多个小文件格式

为了防止生成过多小文件,hive可以通过配置参数在mr过程中合并小文件。而且在执行sql之前将小文件都进行Merge,也会提高程序的性能。我们可以从两个方面进行优化,其一是map执行之前将小文件进行合并会提高性能,其二是输出的时候进行合并压缩,减少IO压力。-hive分析结果为多个小文件格式

HDFS的文件元信息,包括位置、大小、分块信息等,都是保存在NameNode的内存中的。每个对象大约占用150个字节,因此一千万个文件及分块就会占用约3G的内存空间,一旦接近这个量级,NameNode的性能就会开始下降了。此外,HDFS读写小文件时也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接。对于MapReduce程序来说,小文件还会增加Mapper的个数,每个脚本只处理很少的数据,浪费了大量的调度时间。当然,这个问题可以通过使用CombinedInputFile和JVM重用来解决。-hive分析结果为多个小文件格式

汇总后的数据量通常比源数据要少得多。而为了提升运算速度,我们会增加Reducer的数量,Hive本身也会做类似优化——Reducer数量等于源数据的量除以hive.exec.reducers.bytes.per.reducer所配置的量(默认1G)。Reducer数量的增加也即意味着结果文件的增加,从而产生小文件的问题。-hive分析结果为多个小文件格式

【参考】