python连接hive数据库count查询慢的解决办法
一、问题背景
-
问题说明
- 公司的项目需要使用Hive数据库,经常报超时的错误。
- 查看日志,发现是进程卡在执行select count(1) from table 不动了
-
count语句
- 经常需要获取一个表的数据量。很自然使用count了
- hive的sql语句和mysql是非常相似的
- count有三种方式:select count(*)/count(1)/count(字段)from tablename
二、select count超时的原因
- 更换count()
- 最开始因为是count(*)因为数据量太大,导致超时,
- 改成count(1)数据量最小,但仍然超时
- 是否数据库有问题
- 执行select *From tablename 和count同一张表,却很快,哪怕数据有10000条,也很快
- hive数据库count的原理
- 网上找了一下资料,因为HIVE会将select count 翻译为MR作业在HADOOP上运行,效率非常低。
- select * from table 是直接在hive数据库中直接执行的,select count(1) from table 需要调用了mapreduce来执行。
- 如果select count 停留不动,可以试试的mapreduce的wordcount是否同样不动,那可能是namenode和datanode之间没有联通。
参考文章
- hadoop运行不去,,则主要检查namenode和datanode之间的通信情况,包括但不限于以下几种:
- hosts配置问题,没有把datanode的主机名写入namenode主机的hosts文件中。
- slave配置问题,没有把datanode
三、更快的获取记录数的方法
- hive正常后count的时间
- 经过测试,select count(1) from tablename 不管数据多少,都要6.3秒
- 对于正常的应用来说,这是一个非常慢的慢查询,应用中无法接受
- 个人的改进方法
- 我先通过select 1 from tablename 获取所有记录
- 项目是基于flask,再len(findall的结果),得到记录数
- 这样得出结果的的时间仅为0.3秒,速度快20倍
- 个人方法的问题和改进
- 最大的问题是HIVE的数据可能会100万级的,哪怕是select 1的数据量也很大,客户端的内存会爆
- 改进,select 1 from tablename limit 100000 限制最大多,对于大部分场景都够了
四、相关知识
- mapreduce
- MapReduce是面向大数据并行处理的计算模型、框架和平台(构建多节点的分布和并发计算集群),用于大规模数据集(大于1TB)的并行运算。
概念"Map(映射)"和"Reduce(归约)" - 软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,
用来保证所有映射的键值对中的每一个共享相同的键组。 - 最早有google提出,自发明MapReduce以后,Google公司内部进一步将其广泛应用于很多大规模数据处理问题。
- Google公司内有上万个各种不同的算法问题和程序都使用MapReduce进行处理。台
- MapReduce是面向大数据并行处理的计算模型、框架和平台(构建多节点的分布和并发计算集群),用于大规模数据集(大于1TB)的并行运算。
- 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分布式平台的所有技术核心
- 2004年,开源项目Lucene(搜索索引程序库)和Nutch(搜索引擎)的创始人Doug Cutting发现MapReduce正是其所需要的解决大规模
- 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集群上执行。