Hive安裝及使用

来源:http://www.cnblogs.com/mflood/archive/2017/12/18/8056004.html
-Advertisement-
Play Games

本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教 一、安裝方式(內嵌模式,本地模式遠程模式) 安裝環境以及前提說明: Hive是依賴於hadoop系統的,因此在運行Hive之前需要保證已經搭建好hadoop集群環境。 本例中使用的hadoop版本為2.6.1,Hive版本為2.1.1 ...


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

 

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

安裝環境以及前提說明:

    Hive是依賴於hadoop系統的,因此在運行Hive之前需要保證已經搭建好hadoop集群環境。

本例中使用的hadoop版本為2.6.1,Hive版本為2.1.1版。

1.Hive的3種安裝方式:

    1)內嵌模式(元數據保存在內嵌的derby種,允許一個會話鏈接,嘗試多個會話鏈接時會報錯)

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

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

 

2.內嵌模式參數:

    <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 &

 

二、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就用這種起動方式了,這個是程式員最需要的方式

 

二、資料庫

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;

 

 

三、數據類型舉例

1、建表命令

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;

2、查看表結構:describe employee;

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

4、查詢表內容

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;

 

 

四、建表方式

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;

 

 

五、載入數據

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;

 

六、表操作

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');

 

八、分區和分桶、視圖

1. 分區:

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

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

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

  分區是以欄位的形式在表結構中存在,通過describetable命令可以查看到欄位存在,但是該欄位不存放實際的數據內容,僅僅是分區的表示(偽列)

2. 分桶

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

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

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

3. 視圖

  和關係資料庫中的視圖一個概念,可以向用戶集中展現一些數據,屏蔽一些數據,提高資料庫的安全性。

 

九、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的功能,但是排序只能是倒排

 

十、Hive在建表時,可以通過'STORED AS FILE_FORMAT' 指定存儲文件格式。有以下幾種:

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

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

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

 

 

十一、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 輸入欄位的分割字元

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL Select 語句完整的執行順序:1、from 子句組裝來自不同數據源的數據;2、where 子句基於指定的條件對記錄行進行篩選;3、group by 子句將數據劃分為多個分組;4、使用聚集函數進行計算;5、使用 having 子句篩選分組;6、計算所有的表達式;7、select 的欄位;8... ...
  • 序列 是資料庫生成的一系列數值 1 2 3 4 用於實現id 自增長使用 mySql 實現id 自增長 設置 auto_increment oracle資料庫 藉助於序列 創建序列語法 create sequence 序列名 序列的屬性 nextval --下一個值 currval --當前值 特點... ...
  • 這個系列大致想跟大家分享以下篇章: 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + ...
  • 事務(Transaction):ts,一般是指要做的或所做的事情。 例如:轉賬問題。 mysql> create table ac (id int primary key auto_increment, -> ac_name char(10),ac_money int); Query OK, 0 r ...
  • 好記性不如爛筆頭,給自己不中用的大腦寫點東西,省的每次都要去扒。 查詢 單表查詢 SELECT column_name,column_nameFROM table_name; #去重SELECT DISTINCT column_nameFROM table_name; tips:去重可以單列也可以多 ...
  • [20171218]varchar2(4000)如何保存.txt--//以前寫的,不知道為什麼被刪除了,現在補上.如果一行能被存儲於一個數據塊(data block)中,那麼其行頭(row header)所需容量將不少於 3 位元組(byte)。在行頭信息之後依次儲存的是各列的列長(column le ...
  • SQL Server on Linux也發佈一段時間了,官方上支持Red Hat, SUSE, Ubuntu。手上沒有以上Linux版本,選用了與Red Hat最接近的CentOS7.4來進行安裝和測試。 1. 環境 Linux: CentOS Linux release 7.4.1708 (Cor ...
  • 本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教 此處附上部分內容所出博客:http://blog.csdn.net/ymh198816/article/details/51998085 Flume+Kafka+Storm+Redis實時分析系統基本架構 1) 整個實時分析系統的架構 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...