Hive Tunning(二)优化存储

接着上一章我们讲的hive的连接策略,现在我们讲一下hive的数据存储。

下面是hive支持的数据存储格式,有我们常见的文本,JSON,XML,这里我们主要讲一下ORCFile。

Built-in Formats: 

– ORCFile 

– RCFile 

– Avro 

– Delimited Text 

– Regular Expression 

– S3 Logfile 

– Typed Bytes 

• 3 

rd 

-Party Addons: 

– JSON 

– XML

这种格式非常适合HDFS,它有以下的优点

•高压缩 

– 高压缩比. 

– 字典编码. 

•高性能 

– 自带索引. 

– 高效的精确查询. 

• 灵活的数据模型 

– 支持所有的hive类型,包括maps.

从图中可以看出,orc格式的文件存储大小仅为文本的30%左右,比gz格式的都小,采用zlib压缩的话,更小,仅有22%左右。

使用orc格式存储的方式很简单,在建表的时候STORED AS orc即可

CREATE  TABLE  sale(
      id    int,   timestamp  timestamp,
      productsk   int,  storesk  int,
      amount   decimal,  state  string
)STORED   AS   orc;   

相关参数,自己看,不解释了。

不适用zlib压缩的话,查询速度更快,但是也大一些。

CREATE    TABLE    sale(
                id    int,    timestamp    timestamp,
productsk    int,    storesk    int,
                amount    decimal,    state    string
)STORED    AS    orc    tblproperties    ("orc.compress"="NONE");   

下面是加快hive查询的一些可以参考的方式:

(1)跳跃读取:采用分区Partition或者使用Skew,才用ORCFile二次排序。

(2)在连接字段上排序并且bucket,在连接小表的时候采用Broadcast joins。

(3)对经常使用的数据,增加备份因子,激活Short-Circuit Read,采用Tez。

当某个表很大的时候,我们往往要对其进行分区,比如按照时间来分区。

CREATE    TABLE    sale(
                id    int,    amount    decimal,    ...
)partitioned    by    (xdate    string,    state    string);   

其中的xdate和state是不存在的列,你可以认为它们是虚拟列,虚拟列会在HDFS当中建立子目录,属于分区的记录会存在那个子文件夹中。 

使用分区之后,在查询和插入的时候,就必须带有至少一个分区字段,否则查询将会失败。

INSERT    INTO    sale    (xdate=‘2013-03-01’,    state=‘CA’)
SELECT    *    FROM    staging_table
WHERE    xdate    =    ‘2013-03-01’    AND    state    =    ‘CA’;

如果你想一次查出所有数据,不想受这个限制的话,你可以 hive.exec.dynamic.partition.mode参数置为nonstrict。 

set    hive.exec.dynamic.partition.mode=nonstrict;
INSERT    INTO    sale    (xdate,    state)
SELECT    *    FROM    staging_table;

有时候插入数据的时候,我们需要重新排序,在select 语句里面把虚拟列也加上,这样会有排序的效果。

INSERT    INTO    sale    (xdate,    state=‘CA’)
SELECT
            id,    amount,    other_stuff,
xdate,    state
FROM    staging_table
WHERE    state    =    ‘CA’;

下面我们讲一下常用的hive查询调优 

mapred.max.split.size和mapred.min.split.size

min    太大->   太少mapper.    

max    太小->   mapper太多.   

Example:    

– set    mapred.max.split.size=100000000;    

– set    mapred.min.split.size=1000000; 

当然也有个原则,当mappers出现抢占资源的时候,才调整这些参数。

– set    io.sort.mb=100;    

• All    the    time:    

– set    hive.optmize.mapjoin.mapreduce=true;    

– set    hive.optmize.bucketmapjoin=true;    

– set    hive.optmize.bucketmapjoin.sortedmerge=true;    

– set    hive.auto.convert.join=true;    

– set    hive.auto.convert.sortmerge.join=true;    

– set    hive.auto.convert.sortmerge.join.nocondi1onaltask=true;    

• When    bucketing    data:    

– set    hive.enforce.bucketing=true;    

– set    hive.enforce.sortng=true;    

• These and more are set by default in HDP 1.3(明显的广告词,说明HDP比较强大,已经给我们设置好了).    

这些参数我们可以在hive-site.xml中查询到,我们也可以在shell中查询。

(1)查询所有的参数

(2)查询某一个参数

(3)修改参数

时间: 2024-09-22 16:22:04

Hive Tunning(二)优化存储的相关文章

【原创】构建高性能ASP.NET站点之二 优化HTTP请求(前端)

原文:[原创]构建高性能ASP.NET站点之二 优化HTTP请求(前端) 构建高性能ASP.NET站点之二 优化HTTP请求(前端) 前言: 这段时间比较的忙,文章写不是很勤,希望大家谅解. 上一篇文章主要讲述了请求一个页面的过程,同时也提出了在这个过程中的一些优化点,本篇就开始细化页面的请求过程并且提出优化的方案.同时,在上篇文章中,不少朋友也提出了一些问题,在本篇中也对这些问题给出了回答!     系列文章链接: 构建高性能ASP.NET站点 开篇 构建高性能ASP.NET站点之一 剖析页面

忘记全闪存阵列 瞄准闪存优化存储

全闪存阵列已经成为了外部存储市场的一部分.每个季度我都能听到许多分析师和厂商高管(大部分来自传统厂商)庆祝他们的AFA业务增长速度. 由于宏观市场问题,如公有云存储.软件即服务应用以及采用超融合基础架构的软件定义存储的兴起,外部存储的整体市场在持续缩小. 这类似于声称减少预算赤字的政客说:"去年,我们有7000亿美元的赤字,今年是5000亿美元."他们真正做到的是减少赤字的下降速度. 下一步:闪存优先 AFA厂商在做一些奇怪的事情.为了对这个新的市场进行统计分析,一些供应商已经专门制造

重走LFS之路:(二) 存储设备准备

重走LFS之路:(二) 存储设备准备 (题图来自: techradar.com) LFS的编译需要单独有一块存储,条件不好的就单独划个分区,条件好的就再挂块硬盘,实在不行就新建个目录来做这件事好了,只不过这样是没法引导起来,只能chroot之后当编译环境用. 我这就以VirtualBox新建一块SATA硬盘,然后接入虚拟机,分区,挂载为例来记录这个过程. 打开VirtualBox,左侧列表中选择我用来做LFS的虚拟机PureDebian-LFS. 单击设置,弹出的对话框中选择存储这一项,从右侧点

优化存储性能?你需要关注这些Linux I/O调度程序选项

要优化Linux性能,IT团队应该检查当前正在使用的I/O调度程序,并评估诸如deadline和完全公平队列(Completely Fair Queuing)这样的替代方案选项. 如果某台Linux服务器性能不佳,通常与存储信道有关.几十年前,还相对容易进行分析,服务器拥有RAID阵列,RAID阵列的顶层存在分区并且Ext2文件系统在分区顶层运行.然而在今天的数据中心,分析存储信道就不那么容易了. 许多现代数据中心的Linux服务器运行在VMware虚拟机管理程序的顶端,与不同类型的存储区域网络

Hive Tunning(三) 最佳实践

在上一讲的基础上,我们来做来一个实际的例子来展示如何在实操中进行高效的hive查询作业. (1)首先我们建立一个表 CREATE EXTERNAL TABLE pos_staging( txnid STRING, txntime STRING, givenname STRING, lastname STRING, postalcode STRING, storeid STRING, indl STRING, productid STRING, purchaseamount FLOAT, cred

Photoshop 润饰图像(十二)存储图像

存储图像   在你作为一个4色出版物来保存 Photoshop 文件之前,你必须将图像转换到 CMYK 颜色模式以便它能够用4色进程墨水正确打印.你可以使用 Mode 命令更改图像的颜色模式. 1.选择 Image > Mode > CMYK.你现在可以为 Adobe PageMaker 和你的出版物要求的正确格式来保存文件.因为PageMaker 使用 Tagged-Image File Format(TIFF)标签图像文件格式来打印进程或    CMYK 颜色,我们将把图片保存为 TIFF

构建高性能ASP.NET站点之二 优化HTTP请求(前端)

HTTP请求的优化 在一个网页的请求过程中,其实整个页面的html结构(就是页面的那些html骨架)请求的时间是很短的, 一般是占整个页面的请求时间的10%-20%.在页面加载的其余的时间实际上就是在加载页面中的那些flash, 图片,脚本的资源. 一直到所有的资源载入之后,整个页面才能完整的展现在我们面前. 下面,我们就从一个页面开始讲述: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo

配置Hive,采用mysql存储metadata

1.安装hadoop(1.0以上) 2.安装hive安装(0.9.0以上版本) 4.当然你还得安装jdk 4. mysql,同时准备个可访问的账号,这里采用root,最好配上远程访问权限. 修改hive下的conf文件夹中将 hive-default.xml.template 复制并改名成 hive-site.xml 这里是我的文件 <property>            <name>hive.metastore.local</name>            &l

Hive Tunning 补充 关于bucket

在前面的几篇文章当中一直有一个概念bucketing不清楚到底是怎么回事. 网友南京-李先森给了他收集的一些资料,如下: Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件.如将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000:hash 值为