Linux環境Hive安裝配置及使用

Linux環境Hive安裝配置及使用

1. 認識Hive

(1) Hive介紹:

  • 官網:hive.apache.org/
  • Apache Hive™數據倉庫軟件有助於使用SQL讀取,編寫和管理駐留在分佈式存儲中的大型數據集。能夠將結構投影到已存儲的數據中。提供了命令行工具JDBC驅動程序以將用戶鏈接到Hive。
  • hive提供了SQL查詢功能 hdfs分佈式存儲。
  • hive本質HQL轉化爲MapReduce程序。

(2) Hive環境前提:

  • 1)啓動hdfs集羣
  • 2)啓動yarn集羣
  • 若是想用hive的話,須要提早安裝部署好hadoop集羣。

(3) 爲何要學習Hive:

  • 簡化開發。easycoding!
  • 高德地圖等知名軟件使用Hive。

  • 優勢:
    • 1)操做接口採用類sql語法,簡單、上手快。select * from XXX;
    • 2)Hive能夠替代mapreduce程序,sqoop(數據遷移)。
    • 3)hive基於hdfs和yarn,能夠處理海量數據。
    • 4)hive支持UDF,自定義函數。

  • 劣勢:
    • 1)處理數據延遲高,慢。(1.2.2之前版本都是用的mr引擎;2.x以後用的是spark引擎)
    • 2)HQL的表達能力有限——一些sql沒法解決的場景,依然須要寫mapreduce。

2. Hive架構原理解析

3. Hive-1.2.2單機安裝流程

Hadoop安裝見——juejin.im/post/5c7352…

(1) 解壓apache-hive-1.2.2-bin.tar.gz安裝包到目標目錄下:

  • tar -zxvf .tar.gz -C 目標目錄

(2) 爲後續方便,重命名Hive文件夾:

  • mv apache-hive-1.2.2-bin/ hive-1.2.2

(3) 修改配置文件:

  • 進入hive-1.2.2/conf路徑,重命名配置文件:
    • mv hive-env.sh.template hive-env.sh
  • 修改hive-env.sh信息:
    • vi hive-env.sh
    • # Set HADOOP_HOME to point to a specific hadoop install directory
      # 指定Hadoop安裝路徑
      HADOOP_HOME=Hadoop安裝路徑
      
      # Hive Configuration Directory can be controlled by:
      # 指定Hive配置文件夾
      export HIVE_CONF_DIR=/XXXXXX/hive-1.2.2/conf
      複製代碼

(4) 配置環境變量:

  • 修改配置文件:
    • vi /etc/profile
  • 增長如下內容:
    • export HIVE_HOME=hive安裝路徑
    • export PATH=$PATH:$HIVE_HOME/bin
    • # Hadoop環境加入Hive依賴
    • export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
  • 聲明環境變量:
    • source /etc/profile

(5) 啓動

  • hive

(6) 退出

  • quit;

(7) 配置MySQL元數據庫

  • Hive默認使用的數據庫是Derby,Derby不支持多個客戶端同時訪問,因此須要對Derby進行替換,現介紹用MySQL替換Derby的方法。
  • 首先在此Linux環境中安裝MySQL數據庫:
  • <1>. 上傳mysql驅動到hive/lib
  • <2>. 在hive-1.2.2/conf路徑建立配置文件hive-site.xml:
    • vi hive-site.xml
    • <?xml version="1.0"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
      	<property>
      	  <name>javax.jdo.option.ConnectionURL</name>
      	  <value>jdbc:mysql://主機名:3306/metastore?createDatabaseIfNotExist=true</value>
      	  <description>JDBC connect string for a JDBC metastore</description>
      	</property>
      
      	<property>
      	  <name>javax.jdo.option.ConnectionDriverName</name>
      	  <value>com.mysql.jdbc.Driver</value>
      	  <description>Driver class name for a JDBC metastore</description>
      	</property>
      
      	<property>
      	  <name>javax.jdo.option.ConnectionUserName</name>
      	  <value>root</value>
      	  <description>username to use against metastore database</description>
      	</property>
      
      	<property>
      	  <name>javax.jdo.option.ConnectionPassword</name>
      	  <value>密碼</value>
      	  <description>password to use against metastore database</description>
      	</property>
      	
      	# 查詢表時顯示錶頭信息
          <property>
            <name>hive.cli.print.header</name>
            <value>true</value>
          </property>
      
          # 顯示當前所在的數據庫
          <property>
            <name>hive.cli.print.current.db</name>
            <value>true</value>
          </property>
      </configuration>
      複製代碼
  • <3>. 重啓hadoop集羣
  • <4>. 啓動hive:
    • hive
  • <5>. 此時mysql中自動建立metastore元數據庫

4. Hive數據類型

Java數據類型 Hive數據類型 長度
byte TINYINT 8位二進制
short SMALLINT 2byte有符號整數
int INT 4byte有符號整數
long BIGINT 8byte有符號整數
boolean BOOLEAN false/true
float FLOAT 單精度浮點
double DOUBLE 雙精度浮點
string STRING 字符
BINARY 字節數組

5. Hive-DDL(Data Definition Language)

(1) 查看數據庫

  • show databases;

(2) 建立庫

  • create database 數據庫名;

(3) 建立庫(標準寫法)

  • create database if not exists 數據庫名;

(4) 建立庫指定hdfs路徑

  • create database 數據庫名 location '路徑';

(5) 建立表

  • create [external] table [if not exists] 表名(參數) [partitioned by(字段信息)] [clustered by(字段信息)] [sorted by(字段信息)]
    row format ---根據行格式化
    delimited fields ---分割字段
    terminated by '切割符'; ---分割依據
  • external:可選操做,加上建立的是外部表,去掉建立的是管理表(內部表)
  • if not exists:可選操做,加上爲標準寫法
  • partitioned by(字段信息):可選操做,分區
  • clustered by(字段信息):可選操做,分桶
  • sorted by(字段信息):可選操做,排序
  • **注意:**若是指定了hdfs路徑,建立的表存放於該路徑下

(6) 查看錶類型:

  • desc formatted 表名;
  • Table Type:
    • MANAGED_TABLE——內部表
    • EXTERNAL_TABLE——外部表
    • **區別:**管理表刪除時hdfs中數據刪除,外部表刪除時hdfs中數據不刪除

(7) 查詢表

  • 普通表查詢:
    • select * from 表名;
  • 指定列查詢:
    • select 表名.列1, 表名.列2 from 表名;
  • 指定列查詢設置別名
    • select 表名.列 (as) 列別名 from 列原名;
  • 分區表查詢:
    • 全查詢:
      • select * from 表名;
      • **注意:**此時查看的是整個分區表中的數據
    • 單分區查詢:
      • select * from 表名 where 分區條件;
      • **注意:**此時查看的是指定分區中的數據
    • 聯合查詢:
      • select * from 表名1 where 分區條件 union select * from 表名1 where 分區條件;
    • 經常使用基礎查詢函數:
      • 查詢總行數:
        • select count(1) from 表名;
      • 查詢最大值:
        • select max(列名) from 表名;
      • 查詢最小值:
        • select min(列名) from 表名;
      • 查詢列總和:
        • select sum(列名) from 表名;
      • 查詢列平均值:
        • select avg(列名) from 表名;
      • 查詢結果只顯示前n條:
        • select * from 表名 limit n;
    • where——過濾:
      • 查詢A列n~m之間的數據:
        • select * from 表名 where A>n and A<m;
        • select * from 表名 where A between n and m;
        • select * from 表名 where A in(n,m);
      • 查詢A列小於n或者大於m之間的數據:
        • select * from 表名 where A<n or A>m;
      • 查詢A列不在n~m之間的數據:
        • select * from 表名 where A not in(n,m);
      • 查詢A列爲空的數據:
        • select * from 表名 where A is null;
      • 查詢A列不爲空的數據:
        • select * from 表名 where A is not null;
      • like——模糊查詢(使用通配符):
        • 查詢以n開頭的A列:
          • select * from 表名 where A like 'n%';
        • 查詢第二位是n的A列:
          • select * from 表名 where A like '_n%';
        • 查詢包含n的A列:
          • select * from 表名 where A like '%n%';
    • group by——分組:
      • 查詢按B分組的A列數據:
        • select A,B from 表名 group by B;
      • 分組查詢中用having代替where
    • Join操做:
      • join(內鏈接):只有鏈接的兩張表中都存在與條件向匹配的數據纔會被保留下來
      • left join(左外鏈接):保留左表數據,右表沒有join上的字段顯示爲null
      • right join(右外鏈接):保留右表數據,左表沒有join上的字段顯示爲null
      • full join(滿外鏈接):結果會返回全部表中符合條件的全部記錄,若是有字段沒有符合條件用null值代替
    • 排序:
      • Order By(全局排序):
        • 升序排序(可省略asc):
          • select * from 表名 order by 列名 asc;
        • 降序排序:
          • select * from 表名 order by 列名 desc;
      • Sort By(內部排序):
        • 對每一個reducer端數據進行排序,若只有一個reducer端結果與全局排序相同。
        • 設置reduce個數屬性(臨時):
          • set mapreduce.job.reduces = n;
        • 升序排序(可省略asc):
          • select * from 表名 sort by 列名;
        • 降序排序:
          • select * from 表名 sort by 列名 desc;
      • Distribute By:
        • distribute by控制在map端如何拆分數據給reducer端。hive會根據distribute by指定的列,對應reducer的個數進行分發,默認是採用hash算法。sort by爲每一個reduce產生一個排序文件。在有些狀況下,須要控制某個特定行應該到哪一個reducer,這一般是爲了進行後續的彙集操做,distribute by恰好能夠作這件事。所以,distribute by常常和sort by配合使用。
        • 先按A列進行排序再按B列進行降序排序:
        • select * from 表名 distribute by A sort by B desc;
      • Cluster By:
        • 若distrbute by和sort by是相同字段時,cluster by是distribute by和sort by相結合。
        • 被cluster by排序的列只能是降序,不能指定asc和desc。
        • 按A列進行排序:
          • select * from 表名 cluster by A;
          • select * from 表名 distribute by A sort by A;
          • 上述兩語句等價

(8) 分區表操做

  • 分區表在hdfs中分目錄文件夾。
  • 添加單個分區:
    • alter table 表名 add partition(新分區信息);
    • **注意:**一次添加多個分區用空格分割便可
  • 查看分區:
    • show partitions 表名;
  • 刪除分區:
    • alter table 表名 drop partition(分區信息);
  • 修復分區:(經過hdfs上傳分區文件)
    • msck repair table dept_partitions;

(9) 分桶表操做

  • 分桶表在hdfs中分文件。
  • 適用於很是大的數據集。
  • 用戶須要統計一個具備表明性的結果或反映趨勢(抽樣)。
  • 建立分桶表語句:
    • clustered by(字段信息) into n buckets
  • 開啓分桶:
    • set hive.enforce.bucketing = true;
    • set mapreduce.job.reduces = -1;
  • 共m桶,從第n桶開始抽,查看a桶的A列數據(a<m-n):
  • select * from 表名(bucket n out of a on A);

(10) 查看數據庫結構

  • desc database 數據庫名;

(11) 添加數據庫額外描述信息

  • alter database 數據庫名 set dbproperties('key'='value');

(12) 查詢數據庫額外信息

  • desc database extended 數據庫名;

(13) 查看指定的數據庫(使用通配符)

  • show databases like 'i*';

(14) 刪除空庫

  • drop database 數據庫名;

(15) 刪除非空庫標準寫法

  • drop database if exists 數據庫名;

(16) 刪除非空庫

  • drop database 數據庫名 cascade;

(17) 刪除非空庫標準寫法

  • drop database if exists 數據庫名 cascade;

6. Hive-DML(Data Manipulation Language)

(1) 導入數據

  • load data [local] inpath '/XXXX/文件名' into table 表名 [partition(分區位置)];
  • load data:加載數據
  • local:可選操做,加上local導入是本地Linux中的數據,去掉local那麼導入的是hdfs數據
  • inpath:表示的是加載數據的路徑
  • into table:表示要加載的對應表
  • partition(分區位置):可選操做,向分區表中導入數據時須要指定

(2) 向表中插入數據

  • insert into table 表名 partition(分區信息) values(數據內容);

(3) 向表中插入sql查詢結果數據

  • insert overwrite table 表名 partition(分區信息) select * from 表名 where 查詢條件;
  • create table if not exists 表名 as select * from 表名 where 查詢條件;

(4) 建立表直接加載數據

  • create table 表名(參數) row fromat delimited fields terminated by '切割符' locatition '';
  • **注意:**locatition路徑是hdfs文件的上一層文件夾,且文件夾內只有這一個文件。

(5) 把操做結果導出到本地linux

  • insert overwrite local directory '本地路徑' select * from 表名;

(6) 把hive中表數據導出到hdfs中(拷貝操做)

  • export table 表名 to 'hdfs路徑';

(7) 把hdfs數據導入到hive中(拷貝操做)

  • import table 表名 from 'hive路徑';

(8) 清空表數據

  • truncate table 表名;

7. Hive命令

(1) 不登陸Hive客戶端直接輸入命令操做:

  • hive -e "Hive-DDL語句(注意分號)"

(2) 直接把sql寫入到文件中:

  • hive -f sql路徑

(3) 在Hive中能夠直接執行hdfs命令操做:

  • 查看hdfs文件:
    • dfs -ls 路徑;
  • 查看hdfs文件內容:
    • dfs -cat 文件路徑;
  • 建立hdfs目錄:
    • dfs -mkdir -p 目錄路徑;
  • 上傳hdfs文件:
    • dfs -put 文件路徑 目錄路徑;
  • ......

(4) 查看歷史操做

  • cat ~/.hivehistory

8. UDF自定義函數

(1) 相關概念:

  • UDF:一進一出
  • UDAF:聚合函數,多進一出 e.g. count /max/avg
  • UDTF:一進多出

(2) 查看系統自帶函數:

  • show functions;

(3) 查看系統自帶函數示範用法:

  • desc function extended 函數名;

(4) UDF自定義函數使用:

  • <1>. 使用java編寫函數(類繼承org.apache.hadoop.hive.ql.exec.UDF),導出jar包。
  • <2>. 上傳至Linux中。
  • <3>. 添加jar包:
    • 臨時添加:
      • 在Hive客戶端下輸入命令:
        • add jar jar包路徑;
      • 建立關聯:
        • create temporary function 別名 as "java函數類";
    • 註冊永久:
      • 修改hive-site.xml配置文件:
        • <property>
              <name>hive.aux.jars.path</name>
              <value>file://文件夾路徑</value>
          </property>
          複製代碼

9. Hive壓縮——大量數據節省時間

(1) Map輸出階段壓縮方式:

  • 開啓hive中間傳輸數據壓縮功能:
    • set hive.exec.compress.intermediate = true;
  • 開啓map輸出壓縮:
    • set mapreduce.map.output.compress = true;
  • 指定壓縮編碼——設置Snappy壓縮方式(高版本Hive自帶Snappy):
    • set mapreduce.map.output.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;

(2) Reduce輸出階段壓縮方式:

  • 開啓hive輸出數據壓縮功能:
    • set hive.exec.compress.output= true;
  • 開啓mr輸出數據壓縮:
    • set mapreduce.output.fileoutputformat.compress = true;
  • 指定壓縮編碼——設置Snappy壓縮方式:
    • set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
  • 指定壓縮類型塊壓縮:
    • set mapreduce.output.fileoutputformat.compress.type = BLOCK;

10. Hive進階

(1) Hive集羣搭建

  • server端配置文件:
    • <configuration>
                  <property>
                          <name>hive.metastore.warehouse.dir</name>
                          <value>/opt/module/hive-1.2.2/warehouse</value>
                  </property>
                  <property>
                          <name>javax.jdo.option.ConnectionURL</name>
                         # MySQL數據庫位置 <value>jdbc:mysql://bigdata01:3306/metastore?createDatabaseIfNotExist=true</value>
                          <description>JDBC connect string for a JDBC metastore</description>
                  </property>
      
                  <property>
                          <name>javax.jdo.option.ConnectionDriverName</name>
                          <value>com.mysql.jdbc.Driver</value>
                          <description>Driver class name for a JDBC metastore</description>
                  </property>
      
                  <property>
                          <name>javax.jdo.option.ConnectionUserName</name>
                          <value>MySQL用戶名</value>
                          <description>username to use against metastore database</description>
                  </property>
      
                  <property>
                          <name>javax.jdo.option.ConnectionPassword</name>
                          <value>MySQL密碼</value>
                          <description>password to use against metastore database</description>
                  </property>
          </configuration>
      複製代碼

  • client端配置文件:java

    • <configuration>
                  <property>
                          <name>hive.metastore.warehouse.dir</name>
                          <value>/opt/module/hive-1.2.2/warehouse</value>
                  </property>
                  <property>
                          <name>hive.metastore.local</name>
                          <value>false</value>
                  </property>
                  <property>
                          <name>hive.metastore.uris</name>
                          # server端地址信息
                          <value>thrift://bigdata01:9083</value>
                  </property>
                  # 查詢表時顯示錶頭信息
                  <property>
                          <name>hive.cli.print.header</name>
                          <value>true</value>
                  </property>
                  # 顯示當前所在的數據庫
                  <property>
                          <name>hive.cli.print.current.db</name>
                          <value>true</value>
                  </property>
          </configuration>
      複製代碼
  • 啓動:mysql

    • 啓動服務器端:hive --service metastore
    • 啓動客戶端:hive
  • 注意:linux

    • <1>. 啓動提示lls: cannot access /opt/module/spark-2.1.0/lib/spark-assembly-*.jar: No such file or directory
      • 緣由:Spark升級到Spark2之後,原有lib目錄下的大JAR包被分散成多個小JAR包,原來的spark-assembly-*.jar已經不存在,因此Hive沒有辦法找到這個JAR包。
      • 解決:
        • 編輯hive文件:vi /XXXX/hive/bin/hive
        • 找到sparkAssemblyPath屬性並更改成:
          • sparkAssemblyPath=`ls ${SPARK_HOME}/jars/*.jar`
            複製代碼
    • <2>. 因爲客戶端須要和Hadoop通訊,因此須要更改Hadoop中jline的版本。從hive的lib包中拷貝到Hadoop中lib位置爲/XXXX/hadoop/share/hadoop/yarn/lib,留一個高版本的jline jar包,不然啓動會報錯
相關文章
相關標籤/搜索