Hive安裝及使用

本文是學習時的自我總結,用於往後溫習。若有錯誤還望諒解,不吝賜教java

 

1、安裝方式(內嵌模式,本地模式遠程模式)python

安裝環境以及前提說明:mysql

    Hive是依賴於hadoop系統的,所以在運行Hive以前須要保證已經搭建好hadoop集羣環境。linux

本例中使用的hadoop版本爲2.6.1,Hive版本爲2.1.1版。程序員

1.Hive的3種安裝方式:web

    1)內嵌模式(元數據保存在內嵌的derby種,容許一個會話連接,嘗試多個會話連接時會報錯)正則表達式

    2)本地模式(本地安裝mysql 替代derby存儲元數據)sql

    3)遠程模式(遠程安裝mysql 替代derby存儲元數據)數據庫

 

2.內嵌模式參數:apache

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:derby:;databaseName=/usr/local/hive/bin/metastore_db;create=true</value>

    描述了hive元數據存儲的位置

 

3.Mysql的幾個操做

    1)查詢平臺自己的Mysql版本和安裝的MySQL是不是同一個版本,不一致要刪除舊的數據庫

    2)安裝缺乏的兩個rpm包:libaio 和 perl。聯外網(虛擬機要橋接到外網,配置外網後若是ping IP可行,ping域名不行,則須要把ifcfg-eth0複製一份拷貝到dns中)或下載後拷貝到服務器

    3)按項目規模選擇合適的配置文件

      ①my-small.cnf是爲了小型數據庫而設計的。不該該把這個模型用於含有一些經常使用項目的數據庫。

      ②my-medium.cnf是爲中等規模的數據庫而設計的。若是你正在企業中使用RHEL,可能會比這個操做系統的最小RAM需求(256MB)明顯多得多的物理內存。因而可知,若是有那麼多RAM內存可使用,天然能夠在同一臺機器上運行其它服務。

      ③my-large.cnf是爲專用於一個SQL數據庫的計算機而設計的。因爲它能夠爲該數據庫使用多達512MB的內存,因此在這種類型的系統上將須要至少1GB的RAM,以便它可以同時處理操做系統與數據庫應用程序。

      ④my-huge.cnf是爲企業中的數據庫而設計的。這樣的數據庫要求專用服務器和1GB或1GB以上的RAM。

    這些選擇高度依賴於內存的數量、計算機的運算速度、數據庫的細節大小、訪問數據庫的用戶數量以及在數據庫中裝入並訪問數據的用戶數量。隨着數據庫和用戶的不斷增長,數據庫的性能可能會發生變化。

    4)考慮安全問題要對root用戶設置密碼並刪除空用戶;建立一個普通用戶,並給普通用戶賦予localhost和%(遠程)的權限;爲普通用戶建立一個數據庫

    5)查看權限和更新權限

        SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;

        UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='hive';

    6)初始化MySQL數據庫

        schematool -dbType mysql -initSchema

 

4.本地模式參數

    1)<name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://localhost/hive?createDatabaseIfNotExist=true</value>

    爲Hive建立的訪問MySQL的用戶的庫空間

    2)<name>javax.jdo.option.ConnectionDriverName</name>

    <value>com.mysql.jdbc.Driver</value>

    MySQL的JDBC驅動(須要把mysql的驅動包放到目錄 <HIVE_HOME>/lib 中)

    3)<name>javax.jdo.option.ConnectionUserName</name>

    <value>hive</value>

    爲Hive建立的訪問MySQL的用戶

 

5.遠程模式須要配置那些文件

    1)配置環境變量:/.bashrc

    2)配置Hadoop和Hive的路徑:hive-env.sh

    3)hive-default.xml.template --> hive-site.xml

    4) hive.server2.thrift.port– TCP 的監聽端口,默認爲10000。 

   hive.server2.thrift.bind.host– TCP綁定的主機,默認爲localhost

    5)啓動

  hive --service metastore &

        hive --service hiveserver2 &

 

2、Hive

1. 什麼是Hive

是創建在Hadoop基礎上的數據倉庫基礎架構。能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱爲QL,相似於SQL語句。同時,這個語言也容許熟悉 MapReduce 開發者的開發自定義的mapper和reducer來處理內建的mapper和 reducer 沒法完成的複雜的分析工做。

Hive 是 SQL解析引擎,它將SQL語句轉譯成Map/Reduce Job而後在Hadoop執行

Hive的表其實就是HDFS的目錄,按表名把文件夾分開。若是是分區表,則分區值是子文件夾,能夠直接在Map/Reduce Job裏使用這些數據。

2. Hive實現WordCount

  1. 建立一個數據庫,如create database word;
  2. 建表

create external table word_data(line string) row format delimited fields terminated by '\n' stored as textfile location '/home/hadoop/worddata';

  1. 根據MapReduce的規則,咱們須要進行拆分,把每行數據拆分紅單詞,這裏須要用到一個hive的內置表生成函數(UDTF):explode(array),參數是array,其實就是行變多列:
    create table words(word string);
    insert into table words select explode(split(line, " ")) as word from word_data;
    split是拆分函數,跟java的split功能同樣,這裏是按照空格拆分,因此執行完hql語句,words表裏面就所有保存的單個單詞
  2. 這樣基本實現了,由於hql能夠group by,因此最後統計語句爲:
    select word, count(*) from word.words group by word;
    註釋:word.words 庫名稱.表名稱,group by word這個word是create table words(word string) 命令建立的word string

 

3.Java鏈接Hive查詢表信息

public class HiveTest {

    private static String driverName = "org.apache.hive.jdbc.HiveDriver";

    private static ResultSet res;

    public static void main(String[] args) throws Exception {

        Class.forName(driverName);//加載驅動

        Connection conn = DriverManager.getConnection(

                "jdbc:hive2://192.168.111.219:10000/default", "hive", "123456");//創建鏈接

        Statement stmt = conn.createStatement();//聲明

        res = stmt.executeQuery("select * from userinfo");//用聲明stmt對象下的executeQuery方法查詢

        while (res.next()) {

            System.out.println(res.getInt(1) + "\t" + res.getString(2));

        }

        res.close();

        stmt.close();

        conn.close();

    }

}

4.Hive支持的數據類型

    1)基本數據類型:數值類型、布爾型和字符串(TIMESTAMP、BINARY)

        TINYINT 1字節 有符號整數

        SMALLINT2字節 有符號整數

        INT 4字節 有符號整數

        BIGINT  8字節 有符號整數

        FLOAT   4字節 單精度浮點數

        DOUBLE  8字節 雙精度浮點數

    2)複雜數據類型:ARRAY、MAP 和 STRUCT

 

5.Hive的數據類型轉換

    1)隱式類型轉換的規則:

    任何整數類型能夠隱式地轉換爲一個範圍更廣的類型。

    全部整數類型、FLOAT 和 STRING 類型都能隱式轉換爲 DOUBLE。

    TINYINT、SMALLINT 和 INT 均可以轉換爲 FLOAT。

    BOOLEAN 類型不能轉換爲其餘任何類型。

    TIMESTAMP 能夠被隱式轉換爲 STRING。

    2)顯示數據類型轉換(CAST)

    例如,CAST(‘1’ AS INT)  把字符串’1’轉換成整數值 1。

 

6.內表和外表

EXTERNAL 關鍵字可讓用戶建立一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION)。

Hive 建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變。在刪除表的時候,內部表的元數據和數據會被一塊兒刪除,而外部表只刪除元數據,不刪除數據。

 

11.Hive的三種啓動方式

1)   hive  命令行模式

進入hive安裝目錄,輸入bin/hive的執行程序,或者輸入 hive –service cli

用於linux平臺命令行查詢,查詢語句基本跟mysql查詢語句相似

2)   hive  web界面的啓動方式

bin/hive –service hwi  (& 表示後臺運行)

用於經過瀏覽器來訪問hive,感受沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi

3)   hive  遠程服務 (端口號10000) 啓動方式

   bin/hive –service hiveserver2  &(&表示後臺運行)

用java,python等程序實現經過jdbc等驅動的訪問hive就用這種起動方式了,這個是程序員最須要的方式

 

2、數據庫

1.hive會爲每一個數據庫建立一個目錄。數據是庫中的表將會以這個數據庫目錄的子目錄形式存儲。

有一個例外就是default數據中的表,由於這個數據庫自己沒有本身的目錄。

數據庫全部的目錄位於屬性hive.metastore.warehouse.dir所指定的頂層目錄以後。

用戶能夠經過以下命令來修改這個默認的位置

create database financials location '/my/preferred/directory';

  1. 創建數據庫:create database if not exists financials;
  2. 顯示Hive中所包含的數據庫:show databases;
  3. 使用正則表達式匹配來篩選出須要的數據庫名:show databases like 'h.*';
  4. 爲數據庫增長一個描述信息並查看:create database financials comment 'Holds all financial tables';   describe database financials
  5. 切換數據庫:use financials
  6. 顯示當前數據庫:set hive.cli.print.current.db=true
  7. 刪除數據庫:drop database if exists financials(庫中沒有表);   drop database if exists financials CASCADE;(庫中有標強刪)
  8. 用root登錄Mysql,給用戶添加CREATE,DROP權限:

    GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON hive.* TO hive@'%' identified by '123456';

    FLUSH PRIVILEGES;

 

 

3、數據類型舉例

一、建表命令

CREATE TABLE employee(

name STRING,

salary FLOAT,

subordinates ARRAY<STRING>,

deductions MAP<STRING,FLOAT>,

address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)

row format delimited fields terminated by '\001'

collection items terminated by '\002'

MAP KEYS terminated by '\003'

LINES terminated by '\n'

stored as textfile;

二、查看錶結構:describe employee;

三、導數據:load data local inpath '/root/employees.txt' into table employee;

四、查詢表內容

SELECT * FROM employee;

SELECT name ,salary FROM employee;

SELECT name , subordinates[0] FROM employee;

SELECT name , deductions["State Taxes"] FROM employee;

SELECT name , address.city FROM employee;

 

 

4、建表方式

1.直接創建表

2.指定表空間創建表

CREATE TABLE mydb.employee(

name STRING,

subordinates ARRAY<STRING>)

row format delimited fields terminated by '\001'

collection items terminated by '\002'

LINES terminated by '\n'

stored as textfile;

3.複製表結構創建新表(LIKE)

CREATE TABLE IF NOT EXISTS copy_employee LIKE employee;

4.複製指定表字段結構及數據並創建表(AS SELECT)

CREATE TABLE copy_part_employee AS SELECT name,subordinates from employee;

 

 

5、加載數據

1.從本地加載數據到表中:load data local inpath '/root/employees.txt' into table employee;

從HDFS中加載數據到表中:load data inpath '/test/employees.txt' OVERWRITE into table employee;

2.從原有的表employee中追加數據到表copy_employee:

insert INTO table copy_employee select * from employee

從原有的表employee中加載數據到表copy_employee,並替換掉原來的數據

insert OVERWRITE table copy_employee select * from employee;

3.建立表的時候經過select加載數據:

create table cr_employee as SELECT * from employee;

建立表的時候經過select 指定創建的字段並加載指定字段的數據

create table cr_employee1 as SELECT name from employee;

4.直接把與表結構相符的數據文件複製到表指定的存儲位置

dfs -put /root/employees.txt /user/hive/warehouse/employee;

 

6、表操做

1.表重命名(RENAME TO):ALTER TABLE employee RENAME TO rm_emp;

2.修改列信息(CHANGE COLUMN對某個字段進行重命名,並修改其位置、類型或者註釋):

ALTER TABLE employee CHANGE COLUMN

name rename STRING COMMENT 'The people name';

3.增長列(ADD COLUMNS在表的最後添加字段)

ALTER TABLE employee ADD COLUMNS(

addcol1 STRING COMMENT  'Application name',

addclo2 INT COMMENT 'The current session id');

4.刪除列或者替換列(REPLACE COLUMNS替換原來全部的字段)

ALTER TABLE employee REPLACE COLUMNS(

rename  STRING  COMMENT  'name to rename',

resalary  FLOAT COMMENT  'salary to resalary',

resub  ARRAY<STRING> COMMENT  'subordinates to resub');

 

8、分區和分桶、視圖

1. 分區:

  所謂分區(Partition) 對應於數據庫的 Partition 列的密集索引。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,全部的 Partition 的數據都存儲在對應的目錄中

  有時候只須要掃描表中關心的一部分數據,所以建表時引入了partition概念。

  分區表指的是在建立表時指定的partition的分區空間。一個表能夠擁有一個或者多個分區,每一個分區以文件夾的形式單獨存在表文件夾的目錄下。

  分區是以字段的形式在表結構中存在,經過describetable命令能夠查看到字段存在,可是該字段不存放實際的數據內容,僅僅是分區的表示(僞列)

2. 分桶

  桶是更爲細粒度的數據範圍劃分。

  Hive採用對 列值哈希 除以 桶的個數 求餘 的方式決定該條記錄存放在哪一個桶當中

  優勢:得到更高的查詢處理效率;使取樣(sampling)更高效。

3. 視圖

  和關係數據庫中的視圖一個概念,能夠向用戶集中展示一些數據,屏蔽一些數據,提升數據庫的安全性。

 

9、Hive中order by、sort by、distribute by、cluster by的區別

order by對輸入作全局排序,只有一個reducer(多個reducer沒法進行全局),輸入規模較大時,須要較長的計算時間。與數據庫的區別在於必須指定limit,由於數據量大時也只在一臺服務器上,會出現沒法輸出結果的狀況,進行limit,就只有n*map number條記錄,一個reduce也能夠處理

sort by在數據進入reducer前排序,sort by只保證同一reduce中的數據能夠按指定字段排序

distribute by按照指定的字段對數據進行劃分到不一樣的輸出reduce/文件中

cluster by具備distribute by和sort by的功能,可是排序只能是倒排

 

10、Hive在建表時,能夠經過'STORED AS FILE_FORMAT' 指定存儲文件格式。有如下幾種:

  1. TextFile:存儲空間較大,壓縮以後的文件不能分割與合併,查詢效率低;可直接存儲,加載速度最快;這種是默認的格式。
  2. SequenceFile:hadoop API提供的一種二進制文件支持,存儲空間最大,可分割與合併,查詢效率高,須要text文件轉換來加載
  3. RcFile:是一種行列存儲相結合的存儲方式。

    1)將數據按行分塊,保證同一個record在一個塊上,避免讀一個記錄須要讀取多個block;

    2)塊數據列式存儲,有利於數據壓縮和快速的列存取。查詢效率最高、存儲空間最小、但加載最慢。

 

 

11、Sqoop = Sql to Hadoop

  1. Sqoop的做用:容許用戶將數據從結構化存儲器抽取到Hadoop 中,用於如MapReduce、Hive的進一步的處理。Sqoop能夠將這些結果導回數據存儲器,供其餘客戶端使用。
  2. Sqoop import命令參數的含義

    sqoop import

    --connect jdbc:mysql://localhost/hadoopguide    #jdbc鏈接字符串

    --table widgets     #讀取的表名

    -m 1 map    #任務的個數

    --target-dir /widgets   #hdfs目標路徑

  3.  Sqoop導出命令的含義

     sqoop export --connect jdbc:mysql://localhost/hadoopguide -m 1 --table sales_by_zip --export-dir /user/hive/warehouse/zip_profits --input-fields-terminated-by '\0001'

    --connect mysql鏈接字符串

    -m mapreduce的個數

    --table 代表

    --export-dir 導出路徑

    --input-fields-terminated-by 輸入字段的分割字符

相關文章
相關標籤/搜索