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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM