Hadoop(五)C#連線Hive

chester·chen發表於2022-05-04

Hive

Hive將HiveQL(類sql語言)轉為MapReduce,完成資料的查詢與分析,減少了編寫MapReduce的複雜度。它有以下優點:

  • 學習成本低:熟悉sql就能使用
  • 良好的資料分析:底層基於MapReduce實現

同樣存在一些缺點:

  • HiveDL表達能力有限
  • 效率不高
  • Hive調優比較困難

Hive架構

  1. 使用者通過Hive的使用者介面(User Interfaces)與hive互動,常見的使用者介面有CLI,JDBC/ODBC,WEB UI等
  2. Hive將後設資料存在Meta Store中,後設資料包括資料庫、表、列、型別、資料所在目錄等
  3. HiveQL Process Engine實現HiveQL的語法分析、優化生成對應的查詢計劃,存於HDFS中。
  4. 由Execution Engine實現HiveQL Process Engine與MapReduce的結合。最終實現對HDFS中資料的處理。

Hive工作流程

  1. Execute Query:Hive介面,如命令列或Web UI傳送查詢驅動程式(任何資料庫驅動程式,如JDBC,ODBC等)來執行。
  2. Get Plan: 在驅動程式幫助下查詢編譯器,分析查詢檢查語法和查詢計劃或查詢的要求。
  3. Get MetaData:編譯器傳送後設資料請求到Metastore(任何資料庫)。
  4. Send MetaData:Metastore傳送後設資料,以編譯器的響應。
  5. Send Plan:編譯器檢查要求,並重新傳送計劃給驅動程式。到此為止,查詢解析和編譯完成。
  6. Excute Plan:驅動程式傳送的執行計劃到執行引擎。
  7. Excute Job:執行作業的過程是一個MapReduce工作。執行引擎傳送作業給JobTracker,在名稱節點並把它分配作業到TaskTracke。
    1. MetaData Ops:在執行時,執行引擎可以通過Metastore執行後設資料操作。
  8. Fetch Results:執行引擎接收來自資料節點的結果。
  9. Send Results:執行引擎傳送這些結果值給驅動程式。
  10. 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&amp;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)

相關文章