大數據的重要組件之一(hive)初認識
-
- 數據倉庫
- 概念:主要是存儲數據 面向分析的額既不會產生數據 也不會消耗數據 惟一的數據是存儲數據,數據是從外部而來
- 數據庫:爲了咱們的增刪改從查 主要是爲了捕獲數據通常使用在業務系統中
- 大數據領域的數據倉庫:hive只是數據倉庫的一個工具而已
- 數據倉庫的特徵
- 面向主題: 數據倉庫的分析是有必定主題的
- 數據集成性:涉及到的數據都會獲取到進行分析
- 非易失性 :不可更新性 數據倉庫當中的數據都是歷史已經存在的數據
- 時變性:數據倉庫的分析的思路會隨着時間的發展而變化
- 數據倉庫與數據庫的區別
- 數據倉庫的分層
- ods層 :原始數據層
- Dw 層:數據倉庫層
- APP層:數據引用層
- 數據從Ods層到DW層到APP層 數據之間的流動是經過EtL實現的
-
- 數據倉庫元數據管理
- 包括表的個數,表的字段,數據加載的時間 數據倉庫處理的時間等等
- Hive的基本概念
- 基於Hadoop的數據倉庫工具 能夠將結構化的數據文件映射爲一張數據表 並提供類sql查詢功能n
- 意義:在於大幅度下降工程師學習mapreduce的學習成本 讓好用的mapreduce更方便使用
- Hive能夠作數據存儲 能夠作數據分析
- Hive的存儲依賴於HDFS ,HIve的分析依賴於mapreduce
- 特色
- 可擴展
- 延展性
- 支持用戶自定義函數 用戶卡可根據本身的需求來實現本身的函數
- 容錯
- 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;
- 三種方式的優先級:
- 函數
- 查看系統自帶的函數
- 顯示自帶的函數的用法
- 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)
- 基於語法級別優化
-
- 笛卡爾積
- 分區剪裁
- 在查詢語句中,儘可能使用哪些列就讀取哪些列 業務須要使用哪些分區的數據 就讀取哪些分區 關於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
歡迎關注本站公眾號,獲取更多信息