大數據的重要組件之一(hive)初認識

    • 數據倉庫
      • 概念:主要是存儲數據 面向分析的額既不會產生數據 也不會消耗數據 惟一的數據是存儲數據,數據是從外部而來
      • 數據庫:爲了咱們的增刪改從查 主要是爲了捕獲數據通常使用在業務系統中
      • 大數據領域的數據倉庫:hive只是數據倉庫的一個工具而已
      • 數據倉庫的特徵
        • 面向主題: 數據倉庫的分析是有必定主題的
        • 數據集成性:涉及到的數據都會獲取到進行分析
        • 非易失性 :不可更新性 數據倉庫當中的數據都是歷史已經存在的數據
        • 時變性:數據倉庫的分析的思路會隨着時間的發展而變化
        • 數據倉庫與數據庫的區別
        • 數據倉庫的分層
          • ods層 :原始數據層
          • Dw 層:數據倉庫層
          • APP層:數據引用層
        • 數據從Ods層到DW層到APP層 數據之間的流動是經過EtL實現的
      • 數據倉庫元數據管理
        • 包括表的個數,表的字段,數據加載的時間 數據倉庫處理的時間等等
    • Hive的基本概念
    • 基於Hadoop的數據倉庫工具 能夠將結構化的數據文件映射爲一張數據表 並提供類sql查詢功能n
    • 意義:在於大幅度下降工程師學習mapreduce的學習成本 讓好用的mapreduce更方便使用
    • Hive能夠作數據存儲 能夠作數據分析
    • Hive的存儲依賴於HDFS ,HIve的分析依賴於mapreduce
    • 特色
      • 可擴展
        • 能夠自由的擴展集羣的規模通常狀況下不須要重啓服務
      • 延展性
        • 支持用戶自定義函數 用戶卡可根據本身的需求來實現本身的函數
      • 容錯
        • 良好的容錯性節點出現問題sql 仍可完成執行
      • Hive架構
        • 用戶接口
        • 元數據存儲 :一般是存儲在關係數據庫中 Hive的元數據包括表的名字,表的列和分區及其屬性 表的屬性(是否爲外部表等) 表的數據所在的目錄等
        • 解釋器 編譯器 優化器 執行器 完成hql查詢語句到mapreduce的的調用執行
    • Hive與傳統數據庫的對比
      • 海量數據是前提 離線分析是場景

      • Hive中沒有定義專門的數據格式
      • Hive 在加載數據的過程當中 不須要從用戶數據格式到Hive定義的數據格式的轉換
      • Hive在加載的過程當中不會對數據自己進行任何修改,甚至不會對數據進行掃描 只是將數據內容複製或移動到相應的HDFS目錄中
      • Hive中不支持對數據的改寫和添加
      • Hive在加載數據的過程當中不會對數據的某些key創建索引
      • Hive的可擴展性和hadoop的擴展性是一致的
    • Hive的數據存儲
      • Hive全部的數據都存儲在Hdfs中沒有專門的數據存儲格式(支持Text,SequenceFile Parque ,ORc)

    • Hive的交互方式
  •  
  • Hive的基本操做
    • Hive的數據庫 表 分區在hdfs上都是以文件夾的形式存在
    • 數據庫的增刪改查
      • 建立數據庫
        • create database if not exits myhive
        • create database myhive2 location '/myhive2' :建立數據庫並制定hdfs存儲位置
      • 刪除數據庫
        • drop database myhive02 :刪除空數據庫
        • drop database myhive casccade :強制刪除數據庫包括數據庫下面的表一塊兒刪除 (刪除需謹慎)
      • 修改數據庫
        • alter database myhive2 set dbpropertities('createtime'='2018611');
      • 查看數據庫
        • show data bases 查看全部的數據庫
        • desc database myhive2 :查看數據庫的基本信息
        • desc databa extended myive2; 查看數據庫更多詳細信息
    • 數據表的操做
      • 經常使用的操做語法
        • create[external] table [if not exisist] table_name [partitioned by (col_name data_type)] [ row farmart row_format][stored as file_format] [location hdfs_path]
      • 建立表(內部表)
        • 沒有制定列的分隔符
          • create table stu(id int,name string);
        • 指定列的分隔符
          • create table if not exists stu2(id int,name string) row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';
        • 根據查詢結果建立表
          • create table stu3 as select * form stu2
        • 根據已經存在的表結構建立表
          • create table stu4 like stu2
        • 查看錶的信息
          • desc stu2 desc formatted stu2;
        • 本地(Linux)數據加載到Hive表上
          • load data local inpath '/export/servers/hivedatas/student.csv'overwrite into table student_imp;
        • 加載hdfs上的數據
          • load data inpath'/export/servers/hivedatas/student.csv'overwrite into table student_imp;
      • 外部表 :在建立表的時候添加關鍵字子 external
        • 建表語句:
          • create external table techer(id string name string ) row format delimited fields terminated by '\t';
        • 使用場景:天天將收集到的網站日誌按期流入HDFS文本文件
        • 外部表在刪除數據的時候 hdfs的數據依然存在 只刪除 元數據
      • 分區表
        • 建表的時候添加分區語句 partitioned by(year string , month string ,day string )
        • 數據加載
          • load data local inpath' /export/sersvers/hivedatas/score.csv into table score2 partition(year='2018', month='06',day='01');
          • 注:數據在加載的時候 必須清楚的知道這個數據屬於哪一個分區
        • 查看分區
          • show partitions tablename;
        • 添加分區
          • alter table score add partition(month='201805');
        • 刪除分區
          • alter table score drop parttion(month='201805');
        • 注:分區可看作在表中添加的字段 在Hdfs 中是以文件夾的形式存在的
        • 按照業務邏輯或者需求作物理劃分 把 大的數據按照進行分紅一個個小的文件
        • 建表語句
        • 注: 分區的字段不能在數據表的字段內出現
        • 注:分區都是以文件夾的形式存在的
      •  
      • 分桶表
        • 桶 能夠做用在hive的表上 也能夠做用在HIVE 的分區上
        • 將數據按照指定的字段(必須是表中的字段)進行劃分
        • hive採用對列值哈希 而後除以桶的個數取餘 決定放在桶的哪一個位置
        • 數據加載
          • 不能使用load data方式加載數據
          • 只能使用 insert overwrite 加載數據
        • 操做步驟
          • 開啓分桶功能
            • set hive.enforce.bucketing=true;
          • 設置reduce數量
            • set mapreduce.job.reduces=3;
          • 建表
            • ​create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';
          • 加載數據
            • 建立普通表 ,並經過insert overwrite 的方式將普通表的數據經過查詢的方式加入到 桶表中
              • insert overwrite table course select*from course_common cluster by(c_id);
      • 經常使用Hql語句
        • 添加列
          • alter table score 5 add columns( mycol string,mysco string);
        • 更新列
          • alter table score5 change colum mysco mysconew int;
        • 直接向分區表中 添加數據
          • insert into table score3 partition(month='06') values ('001','002','100');
        • 經過查詢方式加載數據
          • insert overwrite table score4 partition(month='201906' select s_id ,c_id ,s_core from score;
          • 注:關鍵字 overwrite必須有
        • 多插入模式:將一張表拆開分紅倆部分
        • 查詢語句中建立表並加載數據
          • create table score5 as select* from score;
        • 查詢
          • 注:
  • Hive的參數和函數
    • 對於通常參數 有如下三種設定方式
      • 配製文件
      • 命令行參數
        • bin/hive -hiveconf hive.root.logger=INFO,console
        • 這一設定對本次啓動的Session(對於Server方式啓動,則是全部請求的Sessions)有效。
      • 參數聲明
        • set mapred.reduce.tasks=100;
          • 這一設定的做用域也是session的
      • 三種方式的優先級:
        • 參數說明>命令行參數>配置文件參數
    • 函數
      • 查看系統自帶的函數
        • show functions
      • 顯示自帶的函數的用法
        • desc function extended upper;
      • 自定義函數
        • 建立本身的類,繼承UDF
        • 編寫本身的業務代碼
        • 將代碼導出成爲jar文件,將jar文件上傳到Hive的安裝目錄下的lib內
        • 在hive shell窗口他添加jar文件 add jar /export/servers/hive-1.1.0-cdh5.14.0/lib/udf.jar;
        • 建立自定義函數 :create temporary function tolowercase as 'cn.itcast.udf.ItcastUDF'; (臨時的)
        • create function tolowercase as 'cn.itcast.udf.ItcastUDF'; (永久的)
      • UDAF 多進一出
      • UDTF一進多出
  • Hive的壓縮格式和存儲格式
    • 行存儲的使用場景
      • 只須要找到其中一個值 其他的值都在相鄰地方, 找到一個值時 這個值周邊的字段大部分的業務都會使用到
    • 列式存儲的使用場景
      • 對少許字段 可是數據條數不少的狀況下使用列式存儲
    • 數據格式
      • TextFIle(行存)
      • sequencefile(行存)
      • ORC(列存)
      • Parquet(列存)
    • 總結:
      • 在實際的項目開發當中 hive表的數據存儲格式通常選擇orc 或parquet 壓縮方式通常選擇 snappy
  • Hive的調優
    • Hive 調優
      • 1 .fetch抓取
        • 默認是more 對於如下三種查詢不會轉成Mr
        • 若果設置的參數爲none時,全部的語句都會轉換成mr
      • 本地模式
        • 此方法將Mr程序直接在本地執行,不提交到集羣中
        • 本地模式設置

      • Group BY
        • 開啓Map端聚合功能 此功能使用場景需謹慎不能使用在相似平均數的算法上
          • 開啓Map端聚合參數

      • count(distinct)
        • 基於語法級別優化
      • 笛卡爾積
        • 儘可能避免無效的on條件或再也不使用條件
      • 分區剪裁
        • 在查詢語句中,儘可能使用哪些列就讀取哪些列 業務須要使用哪些分區的數據 就讀取哪些分區 關於join的優化儘可能將where條件添加在on的後面
        • 儘可能優先過濾數據在進行數據的join 儘可能避免先join後過濾
      • 動態分區調整
        • 以第一個表的表結構爲準,將第一個表的表結構徹底複製到第二個表中 第二個表中的數據就不須要指定分區
        • 實現步驟
          • 注意:新表的分區不須要指定值,只需指定列名便可 在原始表查詢數據時 分區列必須在最後一列
      • 數據傾斜
        • 影響Map數量的因素 :切片的數量 文件的數量
        • 正在數據分析時儘可能合理設置map的數量 若一個大文件 字段較少 數據量較多 此時map數量較少 會致使每一個map處理的數據量不少 解決方案是增長map的數量

        • 文件數量不少,但每一個文件內的數據量較少 此時會開啓不少map 此時map的開銷要高於計算時間 數據;量較少 但時間較長 方案:小文件合併
        • Map數量的多少 應根據實際應用綜合考慮
      • reduce數量的調整
      • 並行執行
        • Hive將sql轉成mr 程序在執行有多個階段咱們能夠開啓hive的並行執行功能

      • Hive嚴格模式
      • JVM重用
        • MapReduce任務在運行時會開啓大量的J VM默認狀況下Jvm使用後會自動釋放 新的task須要時須要從新開啓JVM jvm頻繁開啓消耗時間較多
        • 開啓jvm重用,一個jvm結束後不釋放 新的Task 須要時直接使用 減小了Jvm的開啓次數 從而起到了調優的效果(每一個Jvm的啓動視角爲1秒)
      • 推測執行(謹慎使用)
      • 表的優化
        • 新的版本自動優化
  • 補充 : /etc/profile 是核心文件 儘可能不要修改在 /etc/profile.d路徑下添加一個腳本 將須要添加的配置填寫在腳本中 最後 source profile
相關文章
相關標籤/搜索