`
x10232
  • 浏览: 57564 次
  • 来自: 北京
社区版块
存档分类
最新评论

数据存储text转parquet及引发的OOM问题

 
阅读更多

1.数据转parquet的后效果

 
table1为textfile格式存储的表,分区20161122转换之前大小约400M,分别以parquet无压缩,parquet snappy压缩和parquet gzip压缩,转换到parquet格式的表table1_parquet的20161122,20161123,20161124三个分区。
(1)insert into table1_parquet partition (dt=20161122) select a,b,c from table1 where dt=20161122;
(2)set parquet.compression=snappy;
insert into table1_pa;rquet partition (dt=20161123) select a,b,c from table1 where dt=20161122
(3)set parquet.compression=gzip;
insert into table1_parquet partition (dt=20161124) select a,b,c from table1 where dt=20161122
 转换结果:
(1) 416.2 M  1.2 G    /table1_parquet/dt=20161122  -hive-e                     
查询:29s,28s,39s
(2) 133.6 M  400.7 M  /table1_parquet/dt=20161123  -hive-e "set parquet.compression=snappy"       
查询:35s,28s,39s
(3) 69.9 M   209.6 M  /table1_parquet/dt=20161124  -hive-e "set parquet.compression=gzip"         
查询:31s,35s,38s
 
(1)转parquet无压缩大小为400M,大小基本不变,
(2)转parquet并使用snappy压缩后,大小为133.6M
(3)转parquet并使用gzip压缩后,大小为69.9M,约压缩至原大小的85%
查询耗时基本不变。
参考理论:转parquet后空间节省约75%
列式存储和行式存储相比有哪些优势呢?
  1. 可以跳过不符合条件的数据,只读取需要的数据,降低IO数据量。(谓词下推)
  2. 压缩编码可以降低磁盘存储空间。由于同一列的数据类型是一样的,可以使用更高效的压缩编码(例如Run Length Encoding和Delta Encoding)进一步节约存储空间。
  3. 只读取需要的列,支持向量运算,能够获取更好的扫描性能。

注:曾发生转换之后数据量没下来的问题,结果发现为参数设置错误,设置成了impala的参数。

 

 2.转化parquet后引起的OOM问题

 

问题:将表table1历史数据转成parquet表table_parquet(表按天分区,转换之前每个分区约10m数据,转换之后每个分区约1m数据),对近10天的数据做join操作,发生map side 内存溢出问题。

join操作:

 

当前时间:20161130
查询一:查询历史全量数据(查询正常)
select count(*) from(
select a.* from tmp.table1_parquet a
left join 
(select * from tmp.table1_parquet where dt>=20160601) b
on a.logtime=b.logtime and a.order_id=b.order_id and
where a.dt>=20160601
) as t; 

查询二:查询约近10天的数据(map side OOM)
select count(*) from(
select a.* from tmp.table1_parquet a
left join 
(select * from tmp.table1_parquet where dt>=20161118) b
on a.logtime=b.logtime and a.order_id=b.order_id and
where a.dt>=20161118
) as t; 

 查询三:查询近5天的数据(查询正常)
select count(*) from(
select a.* from tmp.table1_parquet a
left join 
(select * from tmp.table1_parquet where dt>=20161128) b
on a.logtime=b.logtime and a.order_id=b.order_id and
where a.dt>=20161128
) as t; 
 

 

查询二的异常信息:




跟踪发现,hive默认小表小于20m会走map side join,结果查询二近十天的数据大小为10m(parquet,gzip压缩),hive默认走map side join,但由于10m数据为parquet gzip压缩格式,解压后大小约为100m,导致map side join溢出。


 解决方案:

将参数hive.auto.convert.join.noconditionaltask.size的值由20m调整为5m,问题解决。

其中未找到hive.mapjoin.smalltable.filesize这个参数。

 

附一:与map side join相关的参数如下:

  • hive.auto.convert.join : 是否自动转换为mapjoin
  • hive.mapjoin.smalltable.filesize : 小表的最大文件大小,默认为25000000,即25M
  • hive.auto.convert.join.noconditionaltask : 是否将多个mapjoin合并为一个
  • hive.auto.convert.join.noconditionaltask.size : 多个mapjoin转换为1个时,所有小表的文件大小总和的最大值。
解释:hive.auto.convert.join.noconditionaltask.size表明可以转化为MapJoin的表的大小总合。例如有A、B两个表,他们的大小都小于该属性值,那么他们都会都会分别被转化为MapJoin,如果两个表大小总和加起来也小于该属性值,那么这两个表会被合并为一个MapJoin。

例如,一个大表顺序关联3个小表a(10M), b(8M),c(12M),如果hive.auto.convert.join.noconditionaltask.size的值:

1. 小于18M,则无法合并mapjoin,必须执行3个mapjoin;

2. 大于18M小于30M,则可以合并a和b表的mapjoin,所以只需要执行2个mapjoin;
3. 大于30M,则可以将3个mapjoin都合并为1个。


 

 

附二:谓词下推
谓词一般就是指where后面的那些过滤条件

映射下推[projectoin pushdown]和谓词下推[predicates pushdown]包括一个执行引擎,用来将映射和谓词推送到存储格式中以便于在底层尽可能来优化操作。结果就是提高了时间和空间上的效率,由于与查询无关的列都会被摒弃,并且不需要提供给执行引擎。

这对柱状存储无疑是非常有效的,因为 Pushdown 允许存储格式跳过整个与查询无关的列组,并且柱状存储格式操作起来也更加高效。

接下来我们将看看如果在 Hadoop 管道中使用 Pushdown。

在编码之前,你需要在 Hive 和 Pig 中启动对 Parquet 提供的开箱即用的投影/映射下推。在 MapReduce 程序中,有些手动操作你需要加入到 Driver 代码中来启动下推操作。从下面的高亮部分可以看到具体操作。
Hive --> Predicates [set hive.optimize.ppd = true; ]
Pig   --> Projectoin [  以后补充]
  • 大小: 7.3 KB
  • 大小: 43.9 KB
分享到:
评论

相关推荐

    1、通过亿级数据量在hive和impala中查询比较text、orc和parquet性能表现(二)

    1. 计算总数(COUNT(*)):这类操作主要测试数据扫描的效率,列式存储的ORCFile和ParquetFile由于只读取所需列,所以通常比TextFile快。 2. 按名称(name)查询:这涉及到数据过滤,列式存储的优势在于可以快速定位...

    1、通过亿级数据量在hive和impala中查询比较text、orc和parquet性能表现(一)

    本文通过亿级数据量在Hive和Impala中对比了text、orc和parquet这三种不同的文件格式,以分析它们的性能表现。 首先,让我们深入了解每种文件格式的特点: 1. **Parquet**: - 优点:Parquet采用了高效的压缩和...

    datax支持读取parquet格式文件,支持写入parquet格式文件,修复读取orc读取数据丢失问题

    在此次更新中,DataX引入了对Parquet和ORC这两种列式存储格式的支持,这对于大数据处理领域具有重要意义。 首先,让我们深入理解Parquet格式。Parquet是由Twitter和Cloudera共同开发的一种列式存储格式,它被设计...

    使用pyspark将csv文件转为parquet文件

    Parquet是一种列式存储格式,适用于大规模数据分析,它支持高效的数据压缩和查询性能。本教程将详细介绍如何使用Python的PySpark库将CSV文件转换为Parquet文件。 首先,确保已经安装了PySpark。如果没有,可以使用...

    C++ 读写 parquet 文件 Demo

    Parquet 是一种列式存储格式,被广泛用于大数据处理和分析场景,如 Apache Hadoop、Spark、Impala 等。它支持高效的读写操作,尤其适用于大规模数据处理,因为它的设计允许对数据进行快速的随机访问和压缩。C++ 是一...

    parquet_tools-0.2.5.tar.gz

    Parquet是一种列式存储格式,广泛应用于大数据处理和分析领域,如Hadoop、Spark、Impala等。Parquet的优势在于它的高效性和对复杂数据结构的支持,能够优化数据读取速度和存储空间。 在"parquet_tools-0.2.5.tar.gz...

    Dremel+made+simple+with+Parquet.pdf

    2. Parquet如何表示嵌套数据结构:通过将嵌套数据结构扁平化为列式格式,Parquet能够有效地存储复杂的嵌套数据。 3. Parquet的效率:Parquet通过特定的模型,将嵌套数据表示为一系列列,这不仅便于存储,而且还能...

    json2parquet:将JSON文件转换为Apache Parquet

    JSON转换为Parquet 将JSON文件转换为Apache Parquet。 您可能也对 , 或。安装下载预编译的二进制文件您可以从获取最新版本。带货物cargo install json2parquet用法USAGE: json2parquet [FLAGS] [OPTIONS] <JSON> ...

    java使用Parquet

    Parquet是一种列式存储格式,广泛应用于大数据处理和分析领域,尤其在Apache Hadoop生态系统中。它被设计为高效、跨平台且与处理语言无关,能够支持多种数据处理框架,如Pig、Hive、Impala和Spark。本文将深入探讨...

    sqoop从mysql中导入数据到parquet格式的hive中

    sqoop导入数据到hive

    Kylin on Parquet.pdf

    在本文档中,我们将重点介绍Kylin新支持的Parquet存储格式,以及其基于Spark引擎的Cube构建。 ### 知识点 #### Kylin与Parquet存储格式 Kylin原本主要使用HBase作为其后端存储,但HBase作为键值存储并不适合所有...

    Python库 | json2parquet-0.0.8-py2-none-any.whl

    这个库专门用于将JSON数据转换为Parquet文件格式,这是一种高效、列式存储的数据格式,常用于大数据分析和处理。 首先,让我们了解JSON(JavaScript Object Notation)。JSON是一种轻量级的数据交换格式,易于人...

    synthetic-text-to-sql 数据集,从 Parquet 转为 jsonl 方便模型调优

    synthetic_text_to_sql 数据转换,训练集 + 测试集,python 转换程序

    藏经阁-Spark + Parquet in Depth.pdf

    Parquet 的工作原理是将数据存储在列式存储中,每个列都可以单独压缩和存储。这使得 Parquet 能够快速地查询和处理大规模数据。例如,在一个大规模数据集上执行查询时,Parquet 可以快速地返回结果,而不需要扫描...

    parquet 查看内容工具,可以看到编码格式等内容

    要使用 parquet CLI 查看 parquet 文件的元数据,我们执行: parquet-cli meta <path-to-parquet-file> 此输出将首先显示一个包含文件信息的标头: File path: 128_row_group.parquet Created by: parquet-mr ...

    json2parquet:使用PyArrow将JSON文件转换为Parquet

    Json2实木复合地板 该库包装了pyarrow ,提供了一些工具,可以轻松地将JSON数据转换为Parquet格式。 它主要是在Python中。 遍历文件。 它将数据多次复制到内存中。 这并不意味着它是最快的东西。 但是,它对于较小的...

    钻石示例数据,经典的机器学习示例数据,parquet格式、csv格式,方便用户下载学习

    钻石示例数据,经典的机器学习示例数据,parquet格式、csv格式,方便用户下载学习。学习dbt资料,可参考系列博客:https://blog.csdn.net/neweastsun/category_12786252.html

    parquet-mr,阿帕奇拼花.zip

    Parquet是一种列式存储格式,被广泛应用于大数据处理领域,因为它具备高效、跨平台和多语言支持的特性。 Parquet格式的主要优点在于其优化的存储效率和查询性能。在大数据分析中,列式存储相比于行式存储有显著优势...

    parquet-tools.jar

    查看parquet文件工具 使用方式:java -jar xxx.jar usage: parquet-tools cat [option...] where option is one of: --debug Enable debug output -h,--help Show this help string -j,--json Show records in ...

    parquet-format-2.1.0.zip

    1. **列式存储**:Parquet将数据按列存储,这极大地减少了磁盘I/O,因为在分析查询中通常只需要访问部分列。 2. **压缩与编码**:数据在存储时会被压缩,如使用Snappy或Gzip等算法,以减少存储空间。同时,还支持...

Global site tag (gtag.js) - Google Analytics