重溫大資料---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你一定懂我。不過這次有了‘’三年‘’的開發經驗,基本上是‘“逢山開路遇水架橋”式的成功安裝。我這塊也做了一個特殊的整理。希望能幫助到我們資料庫工作室的學弟們,可千萬別死在這個坑裡。
-
記著啟動Hadoop,Yarn(我把RM改到了master方便啟動)。
-
解壓檔案 export是方便你隨地都可以開啟Hive,你願意弄就弄吧。
-
修改hive-env.sh (主要是設定下面兩項、conf目錄最後加個conf,我路徑有問題後來改了)
-
在Hdfs檔案系統上建立兩個路徑(他說的must,懂吧!)
簡單的配置就結束了,來來來,先用一用看看。
- show databases ;
- use default;
- show tables ;
- create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
- load data local inpath '/opt/datas/student.txt’into table student ;
- select * from student ;
- select id from student ;
你可以嘗試另起一個視窗在開啟Hive,這時你會發現,用不了崩了。原因在下面。
注意:Hive預設是將元資料放在derby(記憶體資料庫,只供一個人使用為了滿足多人開發,我們需要將使用MySQL)所以多人開啟自然崩
MySQL安裝
derby多人使用滿足不了,那麼我們換個路子用MySQL解決,在此你也可以用Oracle等
元資料metastore支援使用哪些資料庫,找了一張圖。
Mysql安裝細節
-
檢查是否已經裝過mysql(必須)
- rpm -qa|grep mysql 有就解除安裝沒有就跳過
-
安裝Mysql,為rpm包新增許可權
- chmod u+x ./* 新增執行許可權
- 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>
-
拷貝mysql驅動jar包,到Hive安裝目錄的lib下
$ cp mysql-connector-java-5.1.27-bin.jar /opt/modules/hive-0.13.1/lib/
-
啟動hive
現在是配置的hive metastore Mysql 與我們hive安裝在同一臺機器上
注意:
- hive-env.sh中conf的路徑不要寫錯了,否則預設載入會一直使用derby,你配置的mysql失效(我就弄錯了)
- jdbc的jar包需要匯入lib下,否則報錯(一定不要忘)
Hive日誌檔案配置
為了方便檢視在Hive的使用中出現錯誤時的日誌資訊,對於日誌檔案存放路徑的配置是很有必要的。
- 重新命名 hive-log4j.properties (conf目錄下)
- 修改設定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的你遇著同樣的問題,哈!本文章可以一站式解決你的所有煩惱。同時如果有疑問的,歡迎相互交流!