HIVE高级与企业优化

来源:互联网 发布:11淘宝销量前十名产品 编辑:程序博客网 时间:2024/05/21 10:04

HiveServer2

参考地址:http://blog.csdn.net/czw698/article/details/44394923

1、启动hiveserver2服务

$HIVE_HOME/bin/hive --service hiveserver2

2、测试连接是否以连上

不用写jdbc程序,运行 bin/beeline.sh  然后输入  !connect jdbc:hive2://hadoop-senior.ibeifeng.com:10000 beifeng beifeng 后面两个是你创建的用户名和密码  如果能连接上就表示 jdbc没有问题了 

3、通过程序连接jdbc
package test;    import java.sql.Connection;      import java.sql.DriverManager;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.sql.Statement;  // import org.apache.hive.jdbc.HiveDriver;    public class HiveJdbcClient {        private static String driverName = "org.apache.hive.jdbc.HiveDriver";        public boolean run() {            try {              Class.forName(driverName);              Connection con = null;              con = DriverManager.getConnection(                      "jdbc:hive2://192.168.17.15:10000/hivedb", "hiveuser", "hiveuser");              Statement stmt = con.createStatement();              ResultSet res = null;                String sql = "select count(*) from test_data";                System.out.println("Running: " + sql);              res = stmt.executeQuery(sql);              System.out.println("ok");              while (res.next()) {                  System.out.println(res.getString(1));                }              return true;          } catch (Exception e) {              e.printStackTrace();              System.out.println("error");              return false;          }        }        public static void main(String[] args) throws SQLException {          HiveJdbcClient hiveJdbcClient = new HiveJdbcClient();          hiveJdbcClient.run();      }    }  


hive数据存储

参考地址:http://blog.csdn.net/lxpbs8851/article/details/18553961

1.textfile (默认)
textfile为默认格式
存储方式:行存储
磁盘开销大 数据解析开销大
压缩的text文件 hive无法进行合并和拆分
2.sequencefile
二进制文件,以<key,value>的形式序列化到文件中
存储方式:行存储
可分割 压缩
一般选择block压缩
优势是文件和Hadoop api中的mapfile是相互兼容的。
3.rcfile
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
读记录尽量涉及到的block最少
读取需要的列只需要读取每个row group 的头部定义。
读取全量数据的操作 性能可能比sequencefile没有明显的优势
4.orc (推荐使用)
存储方式:数据按行分块 每块按照列存储
压缩快 快速列存取
效率比rcfile高,是rcfile的改良版本
5.自定义格式
用户可以通过实现inputformat和 outputformat来自定义输入输出格式。

总结:
textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高
sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载
rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低


Hive数据压缩

参考地址:http://blog.csdn.net/an342647823/article/details/45094539

Hive使用的是Hadoop的文件系统和文件格式,比如TEXTFILE,SEQUENCEFILE等。 
           在Hive中对中间数据或最终数据数据做压缩,是提高数据吞吐量和性能的一种手段。对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件, 可以将文件压缩40%或更多,同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I /O和使用更少的内存开销。 
           Hadoop jobs作业,往往是I/O密集型的,而非CPU集型的。数据压缩对I/O密集型的作业带来大大的性能提升,但是如果用户的jobs作业时CPU密集型 的,那么在使用压缩就会降低性能,这就要用户对作业的类型做判断,权衡是否要对数据做压缩。 
选择合适的编解码器 
    对数据做压缩,可以最大程度的减少文件所需的磁盘空间和网络I/O的开销,但对数据做压缩和解压缩总会增加CPU的开销,故最好对那些I/O密集型的作业使用数据压缩——这样的作业会有富余的CPU资源,或者对那些磁盘空间不富裕的系统。 
    Hadoop默认支持Gzip和BZip2的解压缩方式,包括原生的Linux解压缩库。Snappy压缩在最近的Hive版本中才被添加的压缩算法,如果您使用的是Hive不支持Snappy的话,用户就要手动添加。过去经常使用的是LZO压缩算法。 
    那么,为什么要使用不同的压缩算法呢?它们都有什么区别呢?BZip2有最高的压缩比但也会带来更高的CPU开销,Gzip较BZip2次之;如果基于磁盘利用率和I/O考虑,这两个压缩算法都是比较有吸引力的算法。 
    LZO和Snappy算法有更快的解压缩速度,如果在关注数据解压多于磁盘利用率和I/O开销的场景中,它们都是不错的选择。 LZO和Snappy在压缩数据上大致相当,但Snappy算法在解压速度上要较LZO更快。                  
    在选择解压缩算法时,另外一个比较重要的考虑就是压缩格式是否是支持可分割的。Hadoop的会将大文件分割成HDFS block(默认64MB)大小的splits分片,每个分片对应一个Mapper程序。在这几个压缩算法中,只有 BZip2和LZO提供block级的压缩,而Gzip和Snappy则不支持。 
首选Snappy压缩算法。
1、Hive中Mapper过程数据文件的压缩

       HiveQL语句最终会被编译成Hadoop的Mapreduce job,开启Hive的中间数据压缩功能,就是在MapReduce的shuffle阶段对mapper产生的中间结果数据压缩。在这个阶段,优先选择一个低CPU开销的算法。 
        可以通过参数hive.exec.compress.intermediate来开启和禁用该功能,默认情况下该值值为false,将之设置为true为激活中间数据压缩功能:

        SnappyCodec比较适合在这种场景中编解码器,该算法会带来很好的压缩性能和较低的CPU开销:

MapReduce通过 -D 或者-jobConf 设置参数  Hive通过set  eg:MapReduce  hadoop jar example.jar -D hive.exec.compress.intermediate=true -D mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec  eg:Hive  hive> set hive.exec.compress.intermediate=true<pre name="code" class="plain">hive> set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; 


2、最终Hive输出文件的压缩
       用户可以对最终生成的Hive表的数据通常也需要压缩。参数 hive.exec.compress.output控制这一功能的激活与禁用。用户可以通过设置来打开这个功能,同样也可以在XML配置文件中将该功能配置成全局变量:

      将hive.exec.compress.output参数设置成true后,然后选择一个合适的编解码器,如选择SnappyCodec:

<property>        <name>hive.exec.compress.output</name>        <value>true</value>    </property>    <property>        <name>mapred.output.compression.codec</name>        <value>org.apache.hadoop.io.compress.SnappyCodec</value>    </property>   


3、使用rcfile、orcfile列式存储


hive企业优化


前面讲的压缩(snappy)、存储(orcfile,parquet)都是对hive的优化,下面介绍几种常见的优化。

1、列裁剪(创建子表)

     在读数据的时候,只读取查询中需要用到的列,而忽略其他列。

create table if not exits default.bf_log_20150913_sa    as select ip,user from deault.bf_log_20150913 ; 


2、分区裁剪(创建分区)
    在查询的过程中根据分区查询数据。

Select * from emp_partition where month = ‘201509’ ; ----and day =’30’; --二级分区 


3、设置fetch task

   fetch task 为执行hive时,不用执行MapReduce,如select * from emp;

Hive.fetch.task.conversion 默认为minimal  修改配置文件hive-site.xml  <property>    <name>hive.fetch.task.conversion</name>    <value>more</value>    <description>      Some select queries can be converted to single FETCH task       minimizing latency.Currently the query should be single       sourced not having any subquery and should not have      any aggregations or distincts (which incurrs RS),       lateral views and joins.      1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only      2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)    </description>  </property>   或者当前session修改  hive> set hive.fetch.task.conversion=more;  执行SELECT id, money FROM m limit 10;不走mr  


4、join优化
参考地址:http://blog.csdn.net/liyaohhh/article/details/50697519

      hive在实际的应用过程中,大部份分情况都会涉及到不同的表格的连接,例如在进行两个table的join的时候,利用MR的思想会消耗大量的内存,良妃磁盘的IO,大幅度的影响性能,因为shuffle真的好令人担心啊,总之,就是各种问题都是由他产生的。下面介绍一下涉及hive在join的时候的优化方式。

4.1在map端产生join

      mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行map操作。join就发生在map操作的时候,每当扫描一个大的table中的数据,就要去去查看小表的数据,哪条与之相符,继而进行连接。这里的join并不会涉及reduce操作。map端join的优势就是在于没有shuffle,真好。在实际的应用中,我们这样设置:

set hive.auto.convert.join=true;   


这样设置,hive就会自动的识别比较小的表,继而用mapJoin来实现两个表的联合。

4.2 common join

       common join也叫做shuffle join,reduce join操作。这种情况下生再两个table的大小相当,但是又不是很大的情况下使用的。具体流程就是在map端进行数据的切分,一个block对应一个map操作,然后进行shuffle操作,把对应的block shuffle到reduce端去,再逐个进行联合,这里优势会涉及到数据的倾斜,大幅度的影响性能有可能会运行speculation,这块儿在后续的数据倾斜会讲到。因为平常我们用到的数据量小,所以这里就不具体演示了。

4.3  SMBJoin

       smb是sort  merge bucket操作,首先进行排序,继而合并,然后放到所对应的bucket中去,bucket是hive中和分区表类似的技术,就是按照key进行hash,相同的hash值都放到相同的buck中去。在进行两个表联合的时候。我们首先进行分桶,在join会大幅度的对性能进行优化。也就是说,在进行联合的时候,是table1中的一小部分和table1中的一小部分进行联合,table联合都是等值连接,相同的key都放到了同一个bucket中去了,那么在联合的时候就会大幅度的减小无关项的扫描。

首先设置:

set hive.auto.convert.sortmerge.join=true;    set hive.optimize.bucketmapjoin = true;    set hive.optimize.bucketmapjoin.sortedmerge = true;    set hive.auto.convert.sortmerge.join.noconditionaltask=true;


create table emp_info_bucket(ename string,deptno int)    partitioned by (empno string)    clustered by(deptno) into 4 buckets;        insert overwrite table emp_info_bucket    partition (empno=7369)    select ename ,deptno from emp  ;      create table dept_info_bucket(deptno string,dname string,loc string)    clustered by (deptno) into 4 buckets;        insert overwrite table dept_info_bucket    select * from dept;  


select * from emp_info_bucket emp  join dept_info_bucket dept    on(emp.deptno==dept.deptno);//正常的情况下,应该是启动smbjoin的但是这里的数据量太小啦,还是启动了mapjoin


5、并行执行

Set hive.exec.mode.local.auto=true;  Set hive.exec.parallel.thread.number =10;一般设置1-20之间  


6、jvm重用

Set mapred.job.reuse.jvm.num.tasks=5;---5为重用个数,不要设置太大  


7、设置Map /Reduce数目

Set mapreduce.job.reduces=2  --- reduce个数  Set hive.merge.size.per.task=256000000 


8、推测执行
目的:是通过加快获取单个task的结果以及进行侦测将执行慢的TaskTracker加入到黑名单的方式来提高整体的任务执行效率

修改 $HADOOP_HOME/conf/mapred-site.xml文件

<property>         <name>mapred.map.tasks.speculative.execution </name>         <value>true</value>  </property>  <property>         <name>mapred.reduce.tasks.speculative.execution </name>         <value>true</value>  </property>  


修改hive配置

set hive.mapred.reduce.tasks.speculative.execution=true;  


9、动态分区调整
--动态分区属性:设置为true表示开启动态分区功能(默认为false)  hive.exec.dynamic.partition=true;     --动态分区属性:设置为nonstrict,表示允许所有分区都是动态的(默认为strict)  --设置为strict,表示必须保证至少有一个分区是静态的  hive.exec.dynamic.partition.mode=strict;     --动态分区属性:每个mapper或reducer可以创建的最大动态分区个数  hive.exec.max.dynamic.partitions.pernode=100;     --动态分区属性:一个动态分区创建语句可以创建的最大动态分区个数  hive.exec.max.dynamic.partitions=1000;     --动态分区属性:全局可以创建的最大文件个数  hive.exec.max.created.files=100000;     --控制DataNode一次可以打开的文件个数  --这个参数必须设置在DataNode的$HADOOP_HOME/conf/hdfs-site.xml文件中  <property>      <name>dfs.datanode.max.xcievers</name>      <value>8192</value>  </property> 


10、严格模式
--对分区表进行查询,在where子句中没有加分区过滤的话,将禁止提交任务(默认:nonstrict)
set hive.mapred.mode=strict;
 
注:使用严格模式可以禁止3种类型的查询:
(1)对于分区表,不加分区字段过滤条件,不能执行
(2)对于order by语句,必须使用limit语句。
(3)限制笛卡尔积的查询(join的时候不使用on,而使用where的)。
原创粉丝点击