Hadoop(四)C#連接Hive
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
//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
//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版本)
//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)