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集群上執行。