1. 程式人生 > >重溫大資料---Hive介紹與填坑配置

重溫大資料---Hive介紹與填坑配置

沿著前面的內容,接下來的文章就是關於Hive從基礎的搭建到高階應用的知識。鄙人在大二初學Hive的時候,只是覺得Hive和Mysql差不多,但是對於Hive為什麼叫做資料倉庫,以及Hive的UDF程式設計我並沒有太多思考。所以啊,為了混口飯吃遲早還是要還的。所幸目前算是明白了資料倉庫的含義同時對Hive的架構、使用有了全新的認識。

Hive是什麼


先看一看官方的解釋

hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。----百度百科

在這裡插入圖片描述

Hive簡介

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映
成一張表,並提供類SQL查詢功能。也是由Facebook開源用於解決海量結構化日誌的資料統計。


構建在Hadoop之上的資料倉庫,其資料也儲存在HDFS之上( /user/hive/warehouse )

<property>
	<name>hive.metastore.warehouse.dir</name>
	<value>/user/hive/warehouse</value>
</property> 

"資料倉庫工具"的含義:

  • 我們先看官方對於資料倉庫的定義

資料倉庫,英文名稱Data Warehouse,簡寫為DW。資料倉庫顧名思義,是一個很大的資料儲存集合,出於企業的分析性報告和決策支援目的而建立,對多樣的業務資料進行篩選與整合。它為企業提供一定的BI(商業智慧)能力,指導業務流程改進、監視時間、成本、質量以及控制。資料倉庫的輸入方是各種各樣的資料來源,最終的輸出用於企業的資料分析、資料探勘、資料報表等方向。

用我的話來講資料倉庫是用來查詢分析的資料庫,基本不用來做插入修改刪除等操作,準確的說是Hive不支援行級別的更新插入或者刪除操。

Hive就是對資料處理或管理的工具。為什麼這麼說呢?

我們都知道Hive對於資料的處理是限於對資料的查詢、統計、分析,Hive是沒有事務機制的。由於 Hive 是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的。因此,Hive 中不支援對資料的改寫和新增,所有的資料都是在載入的時候中確定好的。一般來說也很少改變表結構。由此可見資料倉庫工具的含義了。

Hive的特點

  • 處理的資料儲存在HDFS
  • 分析資料底層的實現MapReduce
  • 執行程式執行的YARN
  • 靈活性擴充套件性比較好,支援UDF,自定義儲存格式
  • 適合離線資料處理
  • 使用HQL作為查詢介面;

Hive執行本質:將HQL轉化成MapReduce程式

Hive架構
架構上可以看出Hive不需要部署在Yarn,所以Hive在生產環境中通常被部署在叢集之外的節點。

這裡CLI和JDBC作為客戶端,在寫完HQL後交給Driver以及下部分和MetaStore執行,負責將其轉為MR來執行。

SQLParser->QueryOptimizer->Physical Plan->Execution

元資料: Metastore

  • 元資料包括:表名、表所屬的資料庫(預設是default)、表的擁有者、列/
    分割槽欄位、表的型別(是否是外部表)、表的資料所在目錄等;
  • 預設儲存在自帶的derby資料庫中,推薦使用採用MySQL儲存Metastore;

為什麼使用Hive


MapReduce的不便性

  • MapReduce is hard to program
  • 程式設計方式死板八股文格式程式設計,三大部分
  • No Schema, lack of query lanaguages, eg. SQL
    • 資料分析,針對DBA、SQL語句,如何對資料分析
    • MapReduce程式設計成本高
    • FaceBook 實現並開源Hive

總而言之,使用Hive基本上可以不再手擼MapReduce程式碼了(又臭又長),其次HQL和SQL很類似對於一般人來講上手也快。同時也降低了學習成本。

動手搭建Hive環境


介紹完了Hive,我們來動手安裝配置一個Hive。這裡有個“噩夢”->MySQL的安裝,我相信初學Hive你一定懂我。不過這次有了‘’三年‘’的開發經驗,基本上是‘“逢山開路遇水架橋”式的成功安裝。我這塊也做了一個特殊的整理。希望能幫助到我們資料庫工作室的學弟們,可千萬別死在這個坑裡。

  1. 記著啟動Hadoop,Yarn(我把RM改到了master方便啟動)。

  2. 解壓檔案 export是方便你隨地都可以開啟Hive,你願意弄就弄吧。

  3. 修改hive-env.sh (主要是設定下面兩項、conf目錄最後加個conf,我路徑有問題後來改了)

  4. 在Hdfs檔案系統上建立兩個路徑(他說的must,懂吧!)

簡單的配置就結束了,來來來,先用一用看看。

  1. show databases ;
  2. use default;
  3. show tables ;
  4. create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
  5. load data local inpath '/opt/datas/student.txt’into table student ;
  6. select * from student ;
  7. select id from student ;

你可以嘗試另起一個視窗在開啟Hive,這時你會發現,用不了崩了。原因在下面。
注意:Hive預設是將元資料放在derby(記憶體資料庫,只供一個人使用為了滿足多人開發,我們需要將使用MySQL)所以多人開啟自然崩

MySQL安裝

derby多人使用滿足不了,那麼我們換個路子用MySQL解決,在此你也可以用Oracle等

元資料metastore支援使用哪些資料庫,找了一張圖。

Mysql安裝細節

  • 檢查是否已經裝過mysql(必須)

    • rpm -qa|grep mysql 有就解除安裝沒有就跳過
  • 安裝Mysql,為rpm包新增許可權

    • chmod u+x ./* 新增執行許可權
  • 安裝server (這裡多半會出現問題)

    • rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
  • 安裝client

    • rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
  • 進入MySQL mysql -uroot -proot

  • 設定開機啟動chkconfig mysql on

  • 設定登入資訊

flush privileges;重新整理一下配置

設定任何機器可以連線,主要是Windows下連線。

你要是順利的走到了這裡,你基本上就可以舒口氣了。但是很多人會在安裝Server的時候崩潰,甚至放棄!☠

MySQL安裝常見錯誤梳理

常見錯誤一:

安裝成功但是登入失敗

mysql -uroot -p
輸入密碼出現Access denied for user ‘root’@‘localhost’(using password: YES)錯誤。每次安裝Mysql就是噩夢,今天總算找了一個比較好的解決方案。

解決方案:
  • 關閉Mysql service mysqld stop
  • 跳過密碼驗證 /usr/bin/mysqld_safe --skip-grant-tables(卡住了就另開一個視窗)
  • 無密碼登入 mysql -u root
  • 修改密碼
    • use mysql
    • update user set password=PASSWORD(“你的密碼”) where User = ‘root’;
  • 重啟 mysql service mysqld restart
  • 正常進入mysql -uroot -proot

常見錯誤二:

安裝Server發生衝突如下圖

解決方案:
  • 解除安裝它 rpm -e --nodpes xxxx

  • 然後重新安裝 Server

  • 如果出現如下異常(多半會):

  • FATAL ERROR: please install the following Perl modules before executing /usr/bin/mysql_install_db:
    Data::Dumper

  • 解決方案:# yum install -y perl-Module-Install.noarch

  • 再解除安裝安裝失敗的Mysql-server(先rpm -qa|grep Mysql)

  • 重新安裝 Mysql-server

  • 注意檢視隨機密碼 cat /root/.mysql_secret
    ld6z5j8P

這套方案基本上是我最快的解決辦法,如果你一籌莫展了你可以嘗試一下,如果你要是有更好的辦法,歡迎交流。

Hive元資料配置


安好了MySQL,下面就是配置Hive的元資料。在MySQL裡面自動建立metastore,存放元資料。

修改conf目錄下hive-site.xml的配置的核心如下。(不要問我hive-site.xml在哪,我相信你沒有那麼菜。)

1.修改配置檔案

<configuration>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://master:3306/metastore?createDatabaseIfNotExist=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>                   設定Mysql連線地址(metastore)如果不存在就建立這個資料庫。

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>                  設定連線驅動 (別忘了把JDBC的jar包匯入到lib目錄)  

<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>root</value>
  <description>password to use against metastore database</description>
</property>                設定登入密碼

</configuration>
  1. 拷貝mysql驅動jar包,到Hive安裝目錄的lib下

    $ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/hive-0.13.1/lib/

  2. 啟動hive

現在是配置的hive metastore Mysql 與我們hive安裝在同一臺機器上

注意:
  • hive-env.sh中conf的路徑不要寫錯了,否則預設載入會一直使用derby,你配置的mysql失效(我就弄錯了)
  • jdbc的jar包需要匯入lib下,否則報錯(一定不要忘)

Hive日誌檔案配置


為了方便檢視在Hive的使用中出現錯誤時的日誌資訊,對於日誌檔案存放路徑的配置是很有必要的。

  1. 重新命名 hive-log4j.properties (conf目錄下)
  2. 修改設定log檔案存放路徑,如下圖


執行後檢視是否正常生成log檔案

同時如果你不想進行全域性設定的話,你可以設定本次會話生效(在啟動時),日誌可以在hive介面檢視。

下面這一步在開發環境也是一個很有幫助的配置,可以方便你檢視目前使用的資料庫以及查詢時資料欄位的描述

在cli命令列上顯示當前資料庫,以及查詢表的行頭資訊

conf/hive-site.xml
	<property>
		<name>hive.cli.print.header</name>
		<value>true</value>
		<description>Whether to print the names of the columns in query output.</description>
	</property>

	<property>
		<name>hive.cli.print.current.db</name>
		<value>true</value>
		<description>Whether to include the current database in the Hive prompt.</description>
	</property>

Hive常用幫助


命令列輸入 bin/hive -help 調出Hive操作的幫助資訊。看著很多但是不需要去背,在需要用的時候查一下就行了。用多了自然就記住了。

usage: hive
 -d,--define <key=value>          Variable subsitution to apply to hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
 -h <hostname>                    connecting to Hive Server on remote host
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -p <port>                        connecting to Hive Server on port number
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                 console)
  • bin/hive -e </quoted-query-string/>

    eg:不進入Hive命令執行HQL語句
    bin/hive -e “select * from db_hive.student ;”

  • bin/hive -f </filename/>
    eg: 批量執行SQL指令碼。執行順序是按次序執行的,在實際開發中可以方便HQL語句的管理。

      $ touch hivef.sql
      	select * from db_hive.student ;
      $ bin/hive -f /opt/datas/hivef.sql 
      $ bin/hive -f /opt/datas/hivef.sql > /opt/datas/hivef-res.txt
    
  • bin/hive -i </filename/>
    與使用者udf相互使用

  • 在hive cli命令視窗中如何檢視hdfs檔案系統

    hive (default)> dfs -ls / ;

  • 在hive cli命令視窗中如何檢視本地檔案系統

    hive (default)> !ls /opt/datas ;


Hive的初體驗到此結束!

我有個疑問:

Hive或者Mysql中exit 和quit有區別嗎?各位路過的大佬幫忙解釋一下。

總結


在Hive的配置裡面尤其需要注意的就是Mysql的配置,以及元資料的配置。需要的就是一點細心和一點經驗。如果初學Hive的你遇著同樣的問題,哈!本文章可以一站式解決你的所有煩惱。同時如果有疑問的,歡迎相互交流!