python连接hive数据库count查询慢的解决办法

python连接hive数据库count查询慢的解决办法

一、问题背景

  1. 问题说明

    • 公司的项目需要使用Hive数据库,经常报超时的错误。
    • 查看日志,发现是进程卡在执行select count(1) from table 不动了
  2. count语句

    • 经常需要获取一个表的数据量。很自然使用count了
    • hive的sql语句和mysql是非常相似的
    • count有三种方式:select count(*)/count(1)/count(字段)from tablename

二、select count超时的原因

  1. 更换count()
    • 最开始因为是count(*)因为数据量太大,导致超时,
    • 改成count(1)数据量最小,但仍然超时
  2. 是否数据库有问题
    • 执行select *From tablename 和count同一张表,却很快,哪怕数据有10000条,也很快
  3. hive数据库count的原理
    • 网上找了一下资料,因为HIVE会将select count 翻译为MR作业在HADOOP上运行,效率非常低。
    • select * from table 是直接在hive数据库中直接执行的,select count(1) from table 需要调用了mapreduce来执行。
    • 如果select count 停留不动,可以试试的mapreduce的wordcount是否同样不动,那可能是namenode和datanode之间没有联通。
      参考文章
  4. hadoop运行不去,,则主要检查namenode和datanode之间的通信情况,包括但不限于以下几种:
    • hosts配置问题,没有把datanode的主机名写入namenode主机的hosts文件中。
    • slave配置问题,没有把datanode

三、更快的获取记录数的方法

  1. hive正常后count的时间
    • 经过测试,select count(1) from tablename 不管数据多少,都要6.3秒
    • 对于正常的应用来说,这是一个非常慢的慢查询,应用中无法接受
  2. 个人的改进方法
    • 我先通过select 1 from tablename 获取所有记录
    • 项目是基于flask,再len(findall的结果),得到记录数
    • 这样得出结果的的时间仅为0.3秒,速度快20倍
  3. 个人方法的问题和改进
    • 最大的问题是HIVE的数据可能会100万级的,哪怕是select 1的数据量也很大,客户端的内存会爆
    • 改进,select 1 from tablename limit 100000 限制最大多,对于大部分场景都够了

四、相关知识

  1. mapreduce
    • MapReduce是面向大数据并行处理的计算模型、框架和平台(构建多节点的分布和并发计算集群),用于大规模数据集(大于1TB)的并行运算。
      概念"Map(映射)"和"Reduce(归约)"
    • 软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,
      用来保证所有映射的键值对中的每一个共享相同的键组。
    • 最早有google提出,自发明MapReduce以后,Google公司内部进一步将其广泛应用于很多大规模数据处理问题。
    • Google公司内有上万个各种不同的算法问题和程序都使用MapReduce进行处理。台
  2. hadoop
    • 2004年,开源项目Lucene(搜索索引程序库)和Nutch(搜索引擎)的创始人Doug Cutting发现MapReduce正是其所需要的解决大规模
      Web数据处理的重要技术,因而模仿Google MapReduce,基于Java设计开发了一个称为Hadoop的开源MapReduce并行计算框架和系统。
    • Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理
    • 特性,4高1低:高可靠性、高扩展性、高效性、高容错性、低成本
    • Hadoop 最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。
      HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式
      文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心
  3. hive
    • hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
    • hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。
    • hive的优点是学习成本低,可以通过类似SQL语句实现快速MapReduce统计,使MapReduce变得更加简单,而不必开发专门的MapReduce应用程序。
    • hive不适合用于联机(online)事务处理,也不提供实时查询功能。
    • hive最适合应用在基于大量不可变数据的批处理作业。
    • hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL 的hiveQL 语言实现数据查询,
    • 所有hive 的数据都存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)中。
    • hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中hive 设定的目录下.
      因此,hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。
    • HIVE特点
      • 支持创建索引,优化数据查询。
      • 不同的存储类型,例如,纯文本文件、HBase 中的文件。
      • 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
      • 可以直接使用存储在Hadoop 文件系统中的数据。
      • 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
      • 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
原文地址:https://www.cnblogs.com/qumogu/p/13088121.html