大數據入門第十一天——hive詳解(一)入門與安裝


一、基本概念

  1.什么是hive

  The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.

    簡潔的中文解釋就是:

  Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供類SQL查詢功能。

    數據倉庫的概念可以先查看百度百科的介紹

  數據倉庫,英文名稱為Data Warehouse,可簡寫為DW或DWH。數據倉庫,是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它是單個數據存儲,出於分析性報告和決策支持目的而創建。 為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制。

    數據庫與數據倉庫的區別對比,參考知乎相關問題https://www.zhihu.com/question/20623931

    更加詳細的數倉的介紹與深入,將另開隨筆介紹!

  2.為什么用hive  

  • 直接使用hadoop所面臨的問題

    人員學習成本太高

    項目周期要求太短

    MapReduce實現復雜查詢邏輯開發難度太大

  • 為什么要使用Hive

    操作接口采用類SQL語法,提供快速開發的能力。

    避免了去寫MapReduce,減少開發人員的學習成本。

    擴展功能很方便。

  3.hive架構

    

    基本組件:  

  • 用戶接口:包括 CLI、JDBC/ODBC、WebGUI。
  • 元數據存儲:通常是存儲在關系數據庫如 mysql , derby中。
  • 解釋器、編譯器、優化器、執行器。

    組件功能:

  • 用戶接口主要由三個:CLI、JDBC/ODBC和WebGUI。其中,CLI為shell命令行;JDBC/ODBCHiveJAVA實現,與傳統數據庫JDBC類似;WebGUI是通過瀏覽器訪問Hive
  • 元數據存儲:Hive 將元數據存儲在數據庫中。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
  • 解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在 HDFS 中,並在隨后有 MapReduce 調用執行。

    更多詳細的hive體系架構深入介紹,參考http://blog.csdn.net/zhoudaxia/article/details/8855937

  4.hive與Hadoop的關系   

    Hive利用HDFS存儲數據,利用MapReduce查詢數據

    

    與傳統數據庫對比:

     

  補充計算框架tezhttps://www.cnblogs.com/yjt1993/p/11044578.html

  性能優於MR的DAG計算框架!

   5.hive數據存儲

    1、Hive中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)

    2、只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。

    3、Hive 中包含以下數據模型:DB、Table,External Table,Partition,Bucket。

      ² db:在hdfs中表現為${hive.metastore.warehouse.dir}目錄下一個文件夾

      ² table:在hdfs中表現所屬db目錄下一個文件夾

      ² external table:外部表, 與table類似,不過其數據存放位置可以在任意指定路徑

        普通表: 刪除表后, hdfs上的文件都刪了

        External外部表刪除后, hdfs上的文件沒有刪除, 只是把文件刪除了

    內外部表的區別:

未被external修飾的是內部表(managed table),被external修飾的為外部表(external table);
區別:
內部表數據由Hive自身管理,外部表數據由HDFS管理;
內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由自己制定;
刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

 

    使用場景:

外部表使用場景:導入hdfs中的源數據 內部表使用場景:存放Hive處理的中間表、結果表 如: 每天將日志數據傳入HDFS,一天一個目錄;Hive基於流入的數據建立外部表,將每天HDFS上的原始日志映射到外部表的天分區中; 在外部表基礎上做統計分析,使用內部表存儲中間表、結果表,數據通過SELECT+INSERT進入內部表

 

 

      內部表外部表的區別,我們可以參考:https://blog.csdn.net/qq_36743482/article/details/78393678

                      https://www.jianshu.com/p/cd30f7980e9f

      ² partition:在hdfs中表現為table目錄下的子目錄

      ² bucket:桶, 在hdfs中表現為同一個表目錄下根據hash散列之后的多個文件, 會根據不同的文件把數據放到不同的文件中 

 二、hive安裝與配置

  ###hive可視化工具推薦http://lxw1234.com/archives/2016/09/723.htm

 https://www.cnblogs.com/wujiadong2014/p/6058851.html

 1.准備安裝包——推薦使用sftp上傳,更快速!

    

  2.解壓

    與之前保持一致,解壓至apps,當然到usr/local等自定義的目錄是完全沒毛病的

[hadoop@mini1 ~]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C apps/

    順便將解壓出來的文件夾的過長的名字稍作更改:

[hadoop@mini1 apps]$ mv apache-hive-1.2.1-bin/ hive-1.2.1

   3.安裝mysql

    由於hive是默認將元數據保存在本地內嵌的 Derby 數據庫中,但是這種做法缺點也很明顯,Derby不支持多會話連接,因此本文將選擇mysql作為元數據存儲。

    mysql的安裝參考之前linux的隨筆,注意開啟用戶遠程登錄!

  4.配置元數據庫信息

    這里暫時不修改默認的了,在conf目錄下使用一個新的配置文件hive-site.xml:

vi  hive-site.xml

    以下配置項也是簡單易懂的:

<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?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>Zcc170821#</value>
<description>password to use against metastore database</description>
</property>
</configuration>

 hive進行元數據管理,參考介紹:https://www.cnblogs.com/qingyunzong/p/8710356.html#_label2

   5.添加mysql驅動包

    在lib目錄下添加驅動包

    

  6.替換JLine的jar包

    解決Jline包版本不一致的問題

[hadoop@mini1 lib]$ rm ~/apps/hadoop-2.6.4/share/hadoop/yarn/lib/jline-0.9.94.jar [hadoop@mini1 lib]$ cp jline-2.12.jar ~/apps/hadoop-2.6.4/share/hadoop/yarn/lib/

  7.配置環境變量

[hadoop@mini1 hive-1.2.1]$ sudo vim /etc/profile
export HIVE_HOME=/home/hadoop/apps/hive-1.2.1 export PATH=$PATH:$HIVE_HOME/bin
[hadoop@mini1 hive-1.2.1]$ source /etc/profile

  8.初體驗

 啟動之前,需要啟動MySQL

 

systemctl start mysql

 

啟動ZK(已編寫一鍵啟停腳本在/root下)

/root/bin/startZK.sh

啟動Hadoop(在hadoop/sbin下已有腳本,配置即可)

sbin/start-dfs.sh
sbin/start-yarn.sh

 

 啟動hive:

[hadoop@mini1 hive-1.2.1]$ bin/hive

 // 配置環境變量后可以直接啟動

   建庫:

hive> create database shizhan01; OK Time taken: 0.943 seconds hive> 

  

  建表:

hive> use shizhan01; OK Time taken: 0.049 seconds hive> create table t_user(id int,name string); OK Time taken: 0.395 seconds hive> 

  // hive中使用完全的java數據類型即可!

  查看元數據:

  

   刪除t_user;重新建表指定數據格式:

hive> create table t_user01(id int,name string) > row format delimited > fields terminated by ','
    > ; OK Time taken: 0.074 seconds hive> 

   上傳測試數據:

[hadoop@mini1 ~]$ vim user.dat [hadoop@mini1 ~]$ ls apache-hive-1.2.1-bin.tar.gz  apps  hadoop-2.6.4.tar.gz hdpdata user.dat [hadoop@mini1 ~]$ hadoop fs -put user.dat /user/hive/warehouse/shizhan01.db/t_user

   正常查詢:

hive> select * from t_user01; OK 1    Join
2 Mary 3    Bob

   通過mr任務:

hive> select count(*) from t_user01; Query ID = hadoop_20180224172255_b984036d-5bdd-44fc-bfb5-380b9a433034 Total jobs = 1 Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number>
In order to set a constant number of reducers: set mapreduce.job.reduces=<number> Starting Job = job_1519458521203_0001, Tracking URL = http://mini1:8088/proxy/application_1519458521203_0001/
Kill Command = /home/hadoop/apps/hadoop-2.6.4/bin/hadoop job  -kill job_1519458521203_0001 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2018-02-24 17:23:09,002 Stage-1 map = 0%,  reduce = 0%
2018-02-24 17:23:15,635 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.29 sec 2018-02-24 17:23:25,213 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 2.63 sec MapReduce Total cumulative CPU time: 2 seconds 630 msec Ended Job = job_1519458521203_0001 MapReduce Jobs Launched: Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 2.63 sec   HDFS Read: 6416 HDFS Write: 2 SUCCESS Total MapReduce CPU Time Spent: 2 seconds 630 msec OK 4 Time taken: 31.956 seconds, Fetched: 1 row(s) hive> 

 三、啟動為thrift服務

  1.啟動

啟動為前台:bin/hiveserver2 啟動為后台:nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err &

  2.連接

    使用支持thrift服務的進行連接,這里采用hive默認提供的beeline(另外復制一個SSH隧道)

[hadoop@mini1 ~]$ beeline Beeline version 1.2.1 by Apache Hive beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: hadoop
Enter password for jdbc:hive2://localhost:10000: 
Connected to: Apache Hive (version 1.2.1) Driver: Hive JDBC (version 1.2.1) Transaction isolation: TRANSACTION_REPEATABLE_READ 0: jdbc:hive2://localhost:10000> 

  // 默認是使用hadoop用戶無密碼登錄即可,或者進行配置(當然配置的意義不大)

    或者使用啟動即連接:

bin/beeline -u jdbc:hive2://localhost:10000 -n hadoop

    當然,更加推薦的方式是自己在有環境變量的bin下寫個啟動腳本,以后就可以使用startbeeline.sh等自定義腳本一鍵啟動了!

 補充:

  也可以通過hive -e 'sql'的形式

[hadoop@mini1 ~]$ hive -e 'sql'

  這樣的好處是執行完了回到命令行,也就是可以通過shell腳本來執行一連串的sql了,而不用一個一個在命令行敲了!

  或者執行某個sql文件

[hadoop@mini1 ~]$ hive -f '1.sql'

 四、使用HUE進行界面化管理

  安裝hue以及配置Mysql作為外部元數據庫等參考HUE隨筆!

  參考隨筆:https://www.cnblogs.com/zlslch/p/6804757.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM