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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...