zoukankan      html  css  js  c++  java
  • hive原理和调优

    参考:

    hive参数:

    https://www.cnblogs.com/yinzhengjie/articles/11065409.html

    官网:

    hive.apache.org

    选Getting Started Guide会转到wiki, 中文翻译--里面搜索想要的,比如hiveserver2

    Getting started guide:

    https://cwiki.apache.org/confluence/display/Hive/GettingStarted

      Hive是构建在hadoop之上的一个数据仓库平台,将结构化的数据映射为结构化的表,使用较为易用的SQL来处理数据,使用SQL来代替编程门槛较高的Mapreduce,但本质上依然是将SQL转换为响应逻辑的Mapreduce来对大规模数据进行分布式计算处理
      几乎在hive的同一时期,还有一种比较简单的Mapreduce编程接口,即Pig;其通过简单的语义表达式来描述对数据的处理,为分析师或者ETL开发人员进行大规模数据处理大大降低了门槛,其执行过程依然是将语义描述转换为Mapreduce程序,在hadoop上进行分布式计算;和hive相比,pig更加灵活,也可以脱离hadoop进行简单的数据处理。由于SQL的普及率更高以及易用性,所以hive的发展更加迅速

    #三个入口: cli, JDBC/ODBC(java是用JDBC), web UI.

    hive可以部署在不同的hadoop节点或有客户端的机器上,共用metadata.

    hive的作用就是, 提个sql进来,解析成MR,提到yarn运行.

     hive:client将查询请求发送到hive server,它会和metastor交互,获取表的元信息,如表的位置结构等,之后hive server会进行语法解析,解析成语法树,变成查询计划,进行优化后,将查询计划交给执行引擎,默认是MR,然后翻译成MR

    Hive元数据的三种方案:
    1/ 内嵌Derby方式
    使用内嵌的Derby库存储元数据,不能多用户并行操作,适合单机测试、学习.自带
    2/ Local方式
    使用mysql、pg等RDBMS作为hive元数据存储介质,运行多用户并行操作,是较为常用的方式


    hive.metastore.local true
    javax.jdo.option.ConnectionURL
    javax.jdo.option.ConnectionDriverName
    javax.jdo.option.ConnectionUserName
    javax.jdo.option.ConnectionPassword

    3/ Remote方式

    在元数据库上启动一个独立的metastore server,客户端通过metastore server与元数据库交
    互,对客户端隐藏数据库信息

    hive.metastore.local true
    hive.metastore.uris thrift://ip :9083

    show databases慢的话,可从访问元数据库慢的方向排查或Thirft这个服务的问题

    Metastore Server与HiveServer2区别:

    两个独立的服务
    MetaStore Server:
    hive元数据的访问入口,使用thirft协议(支持多种语言),提供对hive元数据的跨语言访问
    HiveServer2:
    hive库中数据的访问入口,同样适用thirft协议,提供对hive中数据的跨语言访问,比如
    常见的python、java等对hive数据的远程访问,beeline客户端也是通过Hiveserver2方式访问数据

    hive的数据结构:

    见G:文档大数据

    因为hive有很多宽表,很多时候需要读取的是其中的字段,所以列式存储对这种场景更快.
    列式存储,即存储以行为单位,常见的文件格式有rcfile(不推荐了)、orc(orc是rcfile的优化,presto低版本只支持ORC)、parquet(上层用了impala的话最好用这种)

     #先存在hbase的采集方案,以支持事务来实时查询,在数据量不大(千万条时),后端可用hive,和phx来实时查询(当然hive如果选MR作引擎,做不了准实时,有MR的时间)

    Hive事务:
    hive适合于大规模,高吞吐的数据处理
    提供基本的查询、分析能力,所以hive
    并不是为事务、交易处理场景而存在的,
    最初hive并不支持事务。由于部分场景的
    需要,对hive进行了扩展,提供了基本
    的事务支持,但限制较多:
    1/ 复杂的配置
    2/ 文件格式必须是ORC
    3/ 表必须分桶
    4/ 对事务的支持不够完善,性能、稳定性欠缺。脏数据,多用户的并发支持不好等。
    生产不建议用,如果对使用hive事务有非常强的需求,建议考虑上面的hbase+hive的方案,利用hbase的实时写入以及事务支持的特性,hive的hql易用并且高吞吐的能力,组合来满足。

    hive命令:
    把hive结果保存在本地:
    1/ hive -e 'select id from db.tab_test where...'
    2/ echo 'select id from db.tab_test where...' >insql.hql
    hive -f ./insql.hql

    优化

    hive参数设置:
    参数设置的方式:
    1/是hive-site里全局变量
    2/ 针对一次会话的set设置
    设置是否在map前合并小文件以减少map数
    hive>set hive.hadoop.supports.splittable.combineinputformat=true;
    在map-only的任务结束时合并小文件
    hive>set hive.merge.mapfiles=true;
    在map-reduce的任务结束时合并小文件
    hive>set hive.merge.mapredfiles=true;
    使用tez引擎
    hive>set hive.execution.engine=tez   #还可选spark
    注:tez还是走的MR,只不过把中间数据存在内存里。

    github.com/rcongiu/Hive-JSON-Serde
    优化:
    合理控制并行:并不是所有任务都能并行,如group by, 没有依赖关系的join可以
    开启任务并行执行
    set hive.exec.parallel=true;
    允许并行任务的最大线程数:
    set hive.exec.parallel.thread.number=8;

    合理控制map数:

    小文件的来源有两个:
    一种是数据本身就小
    一种是map阶段一些参数的设置问题

    map数太少了,意味着并发性不好.太多了也不好,浪费了很多内存.(map运行在container里, 需要去申请更多的container,这种调度本身就很浪费资源)

    256000000=256M,比如1个G的文件, 就拆分成4个map

    最后一个合并文件是发生在map端.

     #Reduce合理控制:

    指定reduce的数量要合理,数据量大的时候要设置大些,不要让每个reduce处理的数据量过大,消耗的时间就长.

     map-only是指一些任务只有map没有reduce,如一些sqoop任务

    sort,order by:
    sort是在reduce里做的排序
    order by是全局的,只能有一个reduce.
    所以大数据量的时候要尽量避免order by.
    在只能使用order by的场景一般要和limit搭配用.

    场景六:

    map多承担问题,减少reduce的计算成本和数据传输成本

    -map join

    -map aggr

    场景七:

    数据倾斜问题:
    1/ 空值问题
    一般只会发生在空值的量太大的情况下.
    解决:
    做join的加个条件不空, 或union is not null
    2/ 数据类型不一致
    产生原因: hive默认是用hash, 不像自己写MR
    在join的时候自己强转移一下,比如cost -as bigint
    3/ 业务数据本身导致
    在某个区域它的业务量不一样:
    比如在北京业务多.
    解决:
    增加一个job,如group by xx

    场景八:
    数据裁减:
    -记录裁剪
    分区、分桶
    无效记录map阶段剔除
    -列裁剪
    剔除无效、非计算范围内的列数据(只拿自己需要的列,如不用select * 用select name,id)
    列式存储

    #多表插入,一次计算多次使用

    hive-site.xml
    hive.async.log.enabled false #控制beeline日志,跑时是否输出执行日志,默认是true提升性能. 设置为false表示输出日志,包括map, application id等.便于排错.

    Hive自定义UDF的JAR包加入运行环境的方法:

    https://blog.csdn.net/fjssharpsword/article/details/70271671

    一般放到:hive-site.xml文件配置hive.aux.jars.path参数的目录下,配置多个目录中间用逗号隔开.

    hive:
    hive.exec.parallel.thread.number 50
    hive.exec.reducers.bytes.per.reducer
    该参数在0.14.0之前默认为1,000,000,000(约1GB),在0.14.0及以后默 认为256,000,000(约256MB)。该参数控制每个reducer平均处理的字节 数,默认值不一定适合所有的情况,应该根据企业内Hive作业通常处理的 数据量、集群节点数等参数来酌情配置
    hive.exec.dynamic.partition

    hive.exec.reducers.max 250
    hive.server2.thrift.max.worker.threads 5000

  • 相关阅读:
    laravel 共享session问题总结
    QQ互联登录提示redirect uri is illegal(100010)完美解决方法
    LESS一种 动态 样式 语言.
    Maximum Depth of Binary Tree
    能力工程师什么是你的核心竞争力之三?
    类对象RMI的简单实现
    对象序列化Java中的序列化
    阿尔法状态目睹一个程序员精神失常的经历
    内容文件Java创建TXT文件并进行读、写、修改操作
    原因资料POST gitreceivepack (chunked)
  • 原文地址:https://www.cnblogs.com/hongfeng2019/p/12109686.html
Copyright © 2011-2022 走看看