apache hive 无法收集stats问题

环境:

hive: apache-hive-1.1.0

hadoop:hadoop-2.5.0-cdh5.3.2

hive元数据以及stats使用mysql进行存储。

hive stats相关参数如下:

hive.stats.autogather:在insert overwrite命令时自动收集统计信息,默认开启true;设置为true

hive.stats.dbclass:存储hive临时统计信息的数据库,默认是jdbc:derby;设置为jdbc:mysql

hive.stats.jdbcdriver:数据库临时存储hive统计信息的jdbc驱动;设置为com.mysql.jdbc.driver

hive.stats.dbconnectionstring:临时统计信息数据库连接串,默认jdbc:derby:databaseName=TempStatsStore;create=true;设置为jdbc:mysql://[ip:port]/[dbname]?user=[username]&password=[password]

hive.stats.defaults.publisher:如果dbclass不是jdbc或者hbase,那么使用这个作为默认发布,必须实现StatsPublisher接口,默认是空;保留默认

hive.stats.defaults.aggregator:如果dbclass不是jdbc或者hbase,那么使用该类做聚集,要求实现StatsIAggregator接口,默认是空;保留默认

hive.stats.jdbc.timeout:jdbc连接超时配置,默认30秒;保留默认

hive.stats.retries.max:当统计发布合聚集在更新数据库时出现异常时最大的重试次数,默认是0,不重试;保留默认

hive.stats.retries.wait:重试次数之间的等待窗口,默认是3000毫秒;保留默认

hive.client.stats.publishers:做count的job的统计发布类列表,由逗号隔开,默认是空;必须实现org.apache.hadoop.hive.ql.stats.ClientStatsPublisher接口;保留默认

现象:

执行insert overwrite table 没有正确的返回numRows和rawDataSize;结果类似如下

[numFiles=1, numRows=0, totalSize=59, rawDataSize=0]

在hive stats mysql 数据库也没有任何相关的stats插入进来。

先定位问题是hive stats出现问题,由于console打印出来的信息过少,无法精确定位问题;因此设置

hive --hiveconf hive.root.logger=INFO,console ;将详细日志打印出来,发现以下信息:

[Error 30001]: StatsPublisher cannot be initialized. There was a error in the initialization
of StatsPublisher, and retrying might help. If you dont want the query to fail because accurate
statistics could not be collected, set hive.stats.reliable=false

Specified key was too long; max key length is 767 bytes

这个问题比较简单,是由于hive1.1.0,ID column长度默认为4000;而且设置ID为主键,导致报错

org.apache.hadoop.hive.ql.stats.jdbc.JDBCStatsSetupConstants

  // MySQL - 65535, SQL Server - 8000, Oracle - 4000, Derby - 32762, Postgres - large.
  public static final int ID_COLUMN_VARCHAR_SIZE = 4000;

org.apache.hadoop.hive.ql.stats.jdbc.JDBCStatsPublisher:public boolean init(Configuration hconf)

              if (colSize < JDBCStatsSetupConstants.ID_COLUMN_VARCHAR_SIZE) {
                String alterTable = JDBCStatsUtils.getAlterIdColumn();
                  stmt.executeUpdate(alterTable);
              }

从这个代码知道,如果表的ID column size小于4000,会被自动改为4000;因此只有修改源码将4000->255(mysql采用utf8编码,一个utf8占用3个字节,因此255*3=765<767);并且对于目前集群来说255字节已经够用。

  public static final int ID_COLUMN_VARCHAR_SIZE = 255;

重新编译,打包推送到测试环境,经过测试发现问题还是存在。

[numFiles=1, numRows=0, totalSize=59, rawDataSize=0]

hive --hiveconf hive.root.logger=INFO,console ;将详细日志打印出来

并没有发现有异常发生。

为了跟踪问题,set hive.stats.reliable=true;

重新执行命令,这次报错,查看job报错信息,发现问题出现在

org.apache.hadoop.hive.ql.stats.jdbc.JDBCStatsAggregator

    try {
      Class.forName(driver).newInstance();
    } catch (Exception e) {
      LOG.error("Error during instantiating JDBC driver " + driver + ". ", e);
      return false;
    }

这个是在yarn上运行,无法找到com.mysql.jdbc.Driver这个类导致,将mysql驱动包,放置于yarn/lib/目录下面,全集群推送,重跑测试脚本,发现问题解决。

时间: 2024-10-25 00:13:29

apache hive 无法收集stats问题的相关文章

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—数据收集(Stats Collection)

第三百五十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-数据收集(Stats Collection) Scrapy提供了方便的收集数据的机制.数据以key/value方式存储,值大多是计数值. 该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 stats 来使用无论数据收集(stats collection)开启或者关闭,数据收集器永远都是可用的. 因此您可以import进自己的模块并使用其API(增加值或者设置新的状态键(stat k

Apache Hive 基本理论与安装指南

一.Hive的基本理论 Hive是在HDFS之上的架构,Hive中含有其自身的组件,解释器.编译器.执行器.优化器.解释器用于对脚本进行解释,编译器是对高级语言代码进行编译,执行器是对java代码的执行,优化器是在执行过程中进行优化.这里的代码就是Hadoop中的MapReduce,这里的MapReduce通过Hive往HDFS上执行.分析.查询数据. 上图展示hql的执行过程,一个hql脚本首先到hive的解释器,转化为MapReduce(当然例如“select * from table_na

Flume-NG + HDFS + HIVE 日志收集分析

最近做了一个POC,目的是系统日志的收集和分析,此前有使用过splunk,虽然用户体验很好,但一是价格昂贵,二是不适合后期开发(splunk已经推出了SDK,后期开发已经变得非常容易).在收集TB级别的日志量上flume-ng是更好的选择,因为后面的存储是扩展性极佳的HDFS.先简要介绍一下测试环境: 5台VM机器(RHEL6.3): 1, collector01 2, namenode 3, datanode01 4, datanode02 5, datanode03 第一台机器collect

笔记:Hive的主要技术改进(Major Technical Advancements in Apache Hive)

http://web.cse.ohio-state.edu/hpcs/WWW/HTML/publications/papers/TR-14-2.pdf (辅助参考:https://cwiki.apache.org/confluence/display/Hive/Correlation+Optimizer ) Introductionhive的主要不足: 存储和查询计划执行.文中提出了三个主要的改进点 新的文件格式 ORC 查询计划组件优化(关联优化器correlation optimizer 向

hive 问题收集

报错:FAILED: Error in metadata: MetaException(message:Got exception: java.lang.reflect.UndeclaredThrowableException null)FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask 解决:dfs.permissions   设为false,否则容易报权限问题. mysql> a

Apache Hive

1. Hive 简介1.1. 什么是HiveHive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.本质是将SQL转换为MapReduce程序.主要用途:用来做离线数据分析,比直接用MapReduce开发效率更高.1.2. 为什么使用Hive直接使用Hadoop MapReduce处理数据所面临的问题:人员学习成本太高MapReduce实现复杂查询逻辑开发难度太大使用Hive :操作接口采用类SQL语法,提供快速开发的能力避免了去写MapR

apache hive 0.14 beeline 使用注意事项

不要使用local关键字 load data local inpath 是不行 beeline & 方式存在问题,是beeline得bug ,使用nohup sh xxx.sh & 也会出错 beeline -f 执行sql文件,如果报"Error: Error while compiling statement: FAILED: ParseException line 1:814 cannot recognize input near ';' <EOF>' in e

hive源码阅读02-org.apache.hadoop.hive.ql.stats概述

org.apache.hadoop.hive.ql.stats包含的类与接口如下图所示: 其中: 接口: ClientStatsPublisher : 包含run方法,在hive中并没有其他类实现该方法,这个主要用于hive stats扩展使用.具体实现需要由 hive.client.stats.publishers这个参数决定,这个参数是用逗号隔开的stats publisher,这些stats publisher被每一个job调用. 该参数默认为空.其中client stats publis

解决hiveserver2报错:java.io.IOException: Job status not available - Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask

用户使用的sql: select count( distinct patient_id ) from argus.table_aa000612_641cd8ce_ceff_4ea0_9b27_0a3a743f0fe3; 下面做不同的测试: 1.beeline -u jdbc:hive2://0.0.0.0:10000 -e "select count( distinct patient_id ) from argus.table_aa000612_641cd8ce_ceff_4ea0_9b27_