Hive
Hive將HiveQL(類sql語言)轉為MapReduce,完成資料的查詢與分析,減少了編寫MapReduce的複雜度。它有以下優點:
- 學習成本低:熟悉sql就能使用
- 良好的資料分析:底層基於MapReduce實現
同樣存在一些缺點:
- HiveDL表達能力有限
- 效率不高
- Hive調優比較困難
Hive架構
- 使用者通過Hive的使用者介面(User Interfaces)與hive互動,常見的使用者介面有CLI,JDBC/ODBC,WEB UI等
- Hive將後設資料存在Meta Store中,後設資料包括資料庫、表、列、型別、資料所在目錄等
- HiveQL Process Engine實現HiveQL的語法分析、優化生成對應的查詢計劃,存於HDFS中。
- 由Execution Engine實現HiveQL Process Engine與MapReduce的結合。最終實現對HDFS中資料的處理。
Hive工作流程
- Execute Query:Hive介面,如命令列或Web UI傳送查詢驅動程式(任何資料庫驅動程式,如JDBC,ODBC等)來執行。
- Get Plan: 在驅動程式幫助下查詢編譯器,分析查詢檢查語法和查詢計劃或查詢的要求。
- Get MetaData:編譯器傳送後設資料請求到Metastore(任何資料庫)。
- Send MetaData:Metastore傳送後設資料,以編譯器的響應。
- Send Plan:編譯器檢查要求,並重新傳送計劃給驅動程式。到此為止,查詢解析和編譯完成。
- Excute Plan:驅動程式傳送的執行計劃到執行引擎。
- Excute Job:執行作業的過程是一個MapReduce工作。執行引擎傳送作業給JobTracker,在名稱節點並把它分配作業到TaskTracke。
- MetaData Ops:在執行時,執行引擎可以通過Metastore執行後設資料操作。
- Fetch Results:執行引擎接收來自資料節點的結果。
- Send Results:執行引擎傳送這些結果值給驅動程式。
- Send Results:驅動程式將結果傳送給Hive介面。
Hive安裝
1.下載Hive3.1.2
https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/
2.解壓
tar -zxvf apache-hive-3.1.2-bin.tar.gz
3.配置環境變數
vi /etc/profile export HIVE_HOME=/usr/local/hive312/apache-hive-3.1.2-bin export HIVE_CONF_DIR=/usr/local/hive312/apache-hive-3.1.2-bin/conf #生效 source /etc/profile
4.將mysql作為metastore,下載mysql-connetctor
https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.46
將其放入$HIVE_HOME/lib資料夾中
5.配置conf/hive-env.sh
cd conf
mv hive-env.sh.template hive-env.sh
6.將以下內容加入hive-env.sh
export JAVA_HOME=/usr/local/java18/jdk1.8.0_331 export HADOOP_HOME=/usr/local/hadoop323/hadoop-3.2.3 export HIVE_HOME=/usr/local/hive312/apache-hive-3.1.2-bin export HIVE_CONF_DIR=/usr/local/hive312/apache-hive-3.1.2-bin/conf
7.新增conf/hive-site.xml檔案
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false</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>admin</value> <description>password to use against metastore database</description> </property> </configuration>
8.替換guava檔案
因為hadoop/share/hadoop/common/lib目錄下的guava和/apache-hive-3.1.2-bin/lib目錄下的guava版本不同。需要將版本將hadoop高版本的guava拷貝到hive的目錄下,刪除hive低的版本。
cp /usr/local/hadoop323/hadoop-3.2.3/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive312/apache-hive-3.1.2-bin/lib/ rm -rf /usr/local/hive312/apache-hive-3.1.2-bin/lib/guava-19.0.jar
9.初始化metastore
./bin/schematool -dbType mysql -initSchema
10.使用Hive
bin/hive
這種方式預設啟動了cli,相當於以下命令
bin/hive --service cli
11.檢視錶
hive> show tables;
12.啟動Hive Thrift Server
bin/hive --service hiveserver2 &
通過jps驗證RunJar是否啟動
也可以檢視10000埠是否處於監聽狀態
[root@localhost apache-hive-3.1.2-bin]# netstat -anop |grep 10000 tcp6 0 0 :::10000 :::* LISTEN 12207/java off (0.00/0/0)
C#如何連線Hive
可以通過odbc來連線。
1.首先需要配置hadoop,從任何主機登入的root使用者可以作為任意組的使用者
<property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
重啟hadoop
sbin/stop-dfs.sh sbin/stop-yarn.sh sbin/start-dfs.sh sbin/start-yarn.sh
2.啟動hiveserver2 thrift server,其預設埠為10000
bin/hive --service hiveserver2 &
可通過10002埠驗證是否thrift server啟動
3.下載odbc,並安裝(同樣有linux版本)
http://package.mapr.com/tools/MapR-ODBC/MapR_Hive/MapRHive_odbc_2.1.1.0013/Windows/
4.開啟odbc,新增dsn
5.新建console,並新增hive訪問類
using System.Data; using System.Data.Odbc; public class HiveOdbcClient { public static HiveOdbcClient Current { get { return new HiveOdbcClient(); } } public void ExcuteNoQuery(string dns, string sql) { OdbcConnection conn = null; try { conn = new OdbcConnection(dns); conn.Open(); OdbcCommand cmd = new OdbcCommand(sql, conn); cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { if (null != conn) { conn.Close(); } } } public DataSet Query(string dns, string sql, string tblName = "tbl") { DataSet set = new DataSet(); OdbcConnection conn = null; try { conn = new OdbcConnection(dns); conn.Open(); OdbcCommand cmd = conn.CreateCommand(); cmd.CommandText = sql; OdbcDataAdapter adapter = new OdbcDataAdapter(cmd); adapter.Fill(set, tblName); } catch (Exception ex) { throw ex; } finally { if (null != conn) { conn.Close(); } } return set; } }
通過C#直接新加hive表
string dns = "DSN=test;UID=root;PWD="; string sql = "show tables"; string sql2 = "create table Employee(ID string,Code string,Name string)"; HiveOdbcClient.Current.ExcuteNoQuery(dns, sql2); Console.WriteLine(HiveOdbcClient.Current.Query(dns, sql));
6.通過bin/hive進入互動式命令,檢視employee新建成功
hive> show tables; OK employee Time taken: 0.62 seconds, Fetched: 1 row(s)