天天看點

[喵咪大資料]Hive2搭建和基本操作

說的Hadoop生态有一個不得不提的元件那就是,Hive是基于Hadoop結構化存儲引擎,能夠存儲海量的資料,Hive提供了類SQL的方式對資料進行查詢檢索彙總,大大減少了早期需要使用MapReduce程式設計的煩擾,今天就和筆者一起來探索Hive的實際應用場景吧.

附上:

HIVE官網位址:

Apache Hive TM 喵了個咪的部落格: w-blog.cn

1.環境配置

hadoop叢集環境需要提前配置好,可以在master上進行搭建也可以單獨一台機器進行搭建這裡使用一台獨立的centos7.X 64位伺服器進行Hive服務搭建并且連接配接到之前的Hadoop叢集

通過oneinstack配置環境

> mkdir -p /app/install && cd /app/install
> wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz
> tar -zxvf oneinstack-full.tar.gz 
# 安裝選擇mysql5.7 密碼為 hive666
> cd oneinstack && ./install.sh           

關閉防火牆(端口通訊會被攔截)

> systemctl stop firewalld.service    # 關閉firewall
> systemctl disable firewalld.service # 禁止firewall開機啟動           

分别修改伺服器的主機名

# 最後主機名會全小寫狀态顯示
> hostnamectl set-hostname hive           

修改伺服器的host 和hadoop節點建立關聯

> vim /etc/hosts
192.168.1.101 hadoop-1
192.168.1.102 hadoop-2
192.168.1.103 hadoop-3           

使用 Hive 需要Java 和 hadoop 環境 我們從之前的 hadoop-1 把相對應的包複制過來

> scp -r /usr/local/jdk1.8 [email protected]:/usr/local/jdk1.8
> scp -r /usr/local/hadoop-2.7.3 [email protected]:/usr/local/hadoop-2.7.3           

增加java和hadoop的環境變量

# java
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=/usr/local/jdk1.8/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH

# hadoop
export HADOOP_HOME=/usr/local/hadoop-2.7.3
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH           

準備hive軟體包 之後需要Hive和Hbase進行結構上的管理和與Spark關聯進行查詢上的效率提高這裡選用Hive2.3.0版本

apache-hive-2.3.0-bin.tar.gz           

建立hadoop使用者

> useradd -m hadoop -s /bin/bash
> passwd hadoop           

2.安裝配置

安裝HIVE

解壓安裝Hive

> cd /app/install
> tar -zxvf apache-hive-2.3.0-bin.tar.gz
> mv apache-hive-2.3.0-bin /usr/local/hive-2.3.0           

設定 Hive環境變量

> vim /etc/profile
# hive
export HIVE_HOME=/usr/local/hive-2.3.0
export PATH=$PATH:$HIVE_HOME/bin
# 讓配置生效
> source /etc/profile           

配置Hive2.X

配置檔案重命名

在運作 Hive 之前需要使用以下指令修改配置檔案:

> cd /usr/local/hive-2.3.0/conf
> cp hive-env.sh.template hive-env.sh
> cp hive-default.xml.template hive-site.xml
> cp hive-log4j2.properties.template hive-log4j2.properties
> cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties           

修改hive-env.sh因為 Hive 使用了 Hadoop, 需要在 hive-env.sh 檔案中指定 Hadoop 安裝路徑:

> vim hive-env.sh
export JAVA_HOME=/usr/local/jdk1.8   ##Java路徑
export HADOOP_HOME=/usr/local/hadoop-2.7.3   ##Hadoop安裝路徑
export HIVE_HOME=/usr/local/hive-2.3.0    ##Hive安裝路徑
export HIVE_CONF_DIR=/usr/local/hive-2.3.0/conf    ##Hive配置檔案路徑           

在hive機器切換到hadoop使用者建立hive資料存放目錄

> su hadoop
# 建立HDFS目錄
> hdfs dfs -mkdir -p /hive
> hdfs dfs -chmod 777  /hive
> hdfs dfs -mkdir -p /hive/warehouse
> hdfs dfs -mkdir -p /hive/tmp
> hdfs dfs -mkdir -p /hive/log
> hdfs dfs -chmod 777 /hive/warehouse
> hdfs dfs -chmod 777 /hive/tmp
> hdfs dfs -chmod 777 /hive/log           

一些複雜的查詢或操作會使用的MR程式,應為執行MR程式需要tmp目錄中的yarn權限所有如果不是以hadoop使用者權限執行不然會有如下異常

org.apache.hadoop.security.AccessControlException: Permission denied: user=hive, access=EXECUTE, inode="/tmp/hadoop-yarn/staging/hive/.staging":hadoop:supergroup:drwx------
# 解決方式
> hdfs dfs -chmod -R 777 /tmp           

将 hive-site.xml 檔案中以下幾個配置項的值設定成上一步中建立的幾個路徑。

> vim /usr/local/hive-2.3.0/conf/hive-site.xml
<property>
    <name>hive.exec.scratchdir</name>
    <value>/hive/tmp</value>
    <description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/&lt;username&gt; is created, with ${hive.scratch.dir.permission}.</description>
  </property>
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>
<property>
    <name>hive.querylog.location</name>
    <value>/hive/log</value>
    <description>Location of Hive run time structured log file</description>
  </property>           

Hive Metastore

預設情況下, Hive 的中繼資料儲存在内嵌的 Derby 資料庫裡, 但一般情況下生産環境會使用 MySQL 來存放 Hive 中繼資料。

建立資料庫和使用者

假定你已經安裝好 MySQL。下面建立一個 hive 資料庫用來存儲 Hive 中繼資料,且資料庫通路的使用者名和密碼都為 hive。

mysql -u root -p
mysql> CREATE DATABASE hive;
mysql> USE hive;
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
mysql> FLUSH PRIVILEGES;
mysql> quit;           

修改hive-site.xml需要在 hive-site.xml 檔案中配置 MySQL 資料庫連接配接資訊。

> vim /usr/local/hive-2.3.0/conf/hive-site.xml
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
  </property>           

初始化Hive

在指令行運作 hive 指令時必須保證以下兩點:

HDFS 已經啟動。

MySQL Java 連接配接器添加到 $HIVE_HOME/lib 目錄下。我安裝時使用的是 mysql-connector-java-5.1.42.jar。

> cd /usr/local/hive-2.3.0/lib
> wget http://download.softagency.net/mysql/Downloads/Connector-J/mysql-connector-java-5.1.42.zip
> unzip mysql-connector-java-5.1.42.zip
> cp mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar /usr/local/hive-2.3.0/lib/
> rm -rf mysql-connector-java-5.1.42.zip           

從 Hive 2.1 版本開始, 我們需要先運作 schematool 指令來執行初始化操作。

schematool -dbType mysql -initSchema           

最後會輸出

schemaTool completed           

我們可以通過資料庫檢視終端檢視hive庫中已經存在部分内容

要使用 Hive CLI(Hive command line interface), 可以在終端輸入以下指令:

hive> show tables;
OK
Time taken: 0.839 seconds           

如果報出異常

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D           

需要将 hive-site.xml 中的 ${system:java.io.tmpdir} 和 ${system:user.name} 分别替換成 /tmp 和 ${user.name}

3.基本操作

建立庫

CREATE DATABASE語句

// 建立庫如果存在則不建立
CREATE DATABASE IF NOT EXISTS userdb;m
// 建立資料庫如果存在則會報錯
CREATE SCHEMA userdb;           

下面的查詢用于驗證資料庫清單:

hive> SHOW DATABASES;
default
userdb           

删除資料庫

// 删除庫如果存在則不删除
DROP DATABASE IF EXISTS userdb;
// 删除資料庫必須要删除完其中的表草能删除
DROP DATABASE IF EXISTS userdb CASCADE;
// 删除資料庫
DROP SCHEMA userdb;           

選擇資料庫

USE userdb;           

Hive建立表

最簡單的方式建立表

CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String);           

通過COMMENT可以增加一個備注可以給整表或字段

CREATE TABLE IF NOT EXISTS employee ( eid int COMMENT 'eid details', name String, salary String, destination String)
COMMENT 'Employee details';           
CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)
COMMENT 'Employee details'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
STORED AS TEXTFILE;           

通過TERMINATED可以指定了字段的分隔符為t分列是n,是以load資料的時候,load的文本也要為t分隔n分行,否則加載後為NULL。hive隻支援單個字元的分隔符,hive預設的分隔符是001

存儲類型Hive具有三類自帶存儲類型TEXTFILE和SEQUENCEFILE,RCFILE可以通過STORED指定

  • TEXTFIEL:預設格式,資料不做壓縮,磁盤開銷大,資料解析開銷大。
  • SEQUENCEFILE:SequenceFile是Hadoop API提供的一種二進制檔案支援,其具有使用友善、可分割、可壓縮的特點。
  • RCFILE:RCFILE是一種行列存儲相結合的存儲方式。首先,其将資料按行分塊,保證同一個record在一個塊上,避免讀一個記錄需要讀取多個block。其次,塊資料列式存儲,有利于資料壓縮和快速的列存取。RCFILE檔案示例:

    相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存儲方式,資料加載時性能消耗較大,但是具有較好的壓縮比和查詢響應。資料倉庫的特點是一次寫入、多次讀取,是以,整體來看,RCFILE相比其餘兩種格式具有較明顯的優勢

下面的查詢用于檢視目前庫表清單:

hive> SHOW TABLES;
OK
employee           

檢視表資訊

desc formatted employee;
desc employee;           

删除表

DROP TABLE IF EXISTS employee;           

Alter Table 語句

修改表名稱

ALTER TABLE employee RENAME TO emp;           

Change 語句

修改字段名稱和字段類型

# 修改name為ename 類型不變還是String
ALTER TABLE employee CHANGE name ename String;
# 修改salary名稱不變 類型修改為Double
ALTER TABLE employee CHANGE salary salary Double;           

增加了一個列名dept在employee表中

ALTER TABLE employee ADD COLUMNS ( dept STRING COMMENT 'Department name');           

插入資料

重新建立employee表,在本地檔案系統準備文本sample.txt

vim /home/hive/sample.txt
1201 Gopal 45000 Technicalmanager
1202 Manisha 45000 Proofreader
1203 Masthanvali 40000 Technicalwriter
1204 Kiran 40000 HrAdmin
1205 Kranthi 30000 OpAdmin           

加載給定文本插入表中(LOAD DATA隻是把檔案複制到指定的目錄下,多次操作隻會保留最後一次)

LOAD DATA LOCAL INPATH '/home/hive/sample.txt'
OVERWRITE INTO TABLE employee;           

插入單條資料(消耗時間很長,可以結合Hbase來達到實時增加資料)

INSERT INTO TABLE employee values(12,"1","1","1");           

查詢是否插入成功

select * from employee;
OK
12      1       1       1
1201    Gopal   45000   Technicalmanager
1202    Manisha 45000   Proofreader
1203    Masthanvali     40000   Technicalwriter
1204    Kiran   40000   HrAdmin
1205    Kranthi 30000   OpAdmin
Time taken: 0.063 seconds, Fetched: 5 row(s)           

Select

相關查詢操作可以參考

Hive内置運算符 - Hive教程™ Hive内置函數 - Hive教程™ Hive視圖和索引 - Hive教程™ HiveQL Select Where - Hive教程™ HiveQL Select Order By - Hive教程™ HiveQL Select Group By - Hive教程™ HiveQL Select Join - Hive教程™

4 總結

Hive可以以結構化的方式來存儲資料還可以使用SQL的方式來檢索出你所需要的資料集給開發人員帶來了不少友善,但是Hive也存在問題,單條記錄增加繁瑣,速度相對比較慢,但是在Hadoop生态中還有一個大家經常使用到的元件那就是Hbase,下節我們就一同來學習Hbase的使用.

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!