hive詳細介紹

hive是一個基於hadoop的搜索與數據分析引擎,它提供了一種類sql的方式供用戶使用.hive能夠將本地文件映射到一個hive表中 ,同樣hive也能直接將hdfs文件映射到hive中使用。hive自動將sql翻譯成mapreduce

-

hive的安裝

  1. hadoop的安裝
  2. mysql的安裝
  3. 下載hive
wget http://mirror.bit.edu.cn/apache/hive/hive-2.3.0/apache-hive-2.3.0-bin.tar.gz;
tar -zxvf apache-hive-2.3.0-bin.tar.gz
mv apache-hive-2.3.0-bin /usr/local/hive

接下來就是配置環境變量

export JAVA_HOME=/usr/local/java/jdk1.8.0_91
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

tips:如果java hadoop安裝目錄請按自行情況更改
接下來就是配置hive的配置文件

source /etc/profile
cd $HIVE_CONF_DIR
cp hive-default.xml.template hive-site.xml ; cp hive-env.sh.template  hive-env.sh ; 

修改hive-env.sh如下:
修改HADOOP_HOME HIVE_CONF_DIR HIVE_AUX_JARS_PATH


# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/local/hadoop

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/usr/local/hive/conf

# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

修改hive-site.xml

  • 修改javax.jdo.option.ConnectionURL :master:3306爲mysql數據庫的host port
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://master:3306/hive</value>
    <description>
      JDBC connect string for a JDBC metastore.
      To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
      For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
    </description>
  </property>
  • 修改javax.jdo.option.ConnectionDriverName
   <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
  </property>
  • 修改mysql數據庫用戶名,密碼
   <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>hive</value>
    <description>Username to use against metastore database</description>
  </property>
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>hive</value>
    <description>password to use against metastore database</description>
  </property>
  • 修改hive.metastore.warehouse.dir ======> hive內部表的數據存儲位置,可自行修改
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>location of default database for the warehouse</description>
  </property>
  • 強烈建議將${system:java.io.tmpdir}等變量值修改爲hive的安裝路徑

    本人這臺機器修改前後的文件差異 如下:
    這裏寫圖片描述

好了到這裏,hive基本安裝完成了.
運行/usr/local/hive/bin/schematool -initSchema -dbType mysql 初始化hive的metea數據庫。在本文中就是hive ,參見上面的javax.jdo.option.ConnectionURL

mysql連接hive數據庫,運行show tables :可以看到metea的數據庫
這裏寫圖片描述

  • ***metastore元數據庫介紹
表名 用途
BUCKETING_COLS 存儲bucket字段信息,通過SD_ID與其他表關聯
CDS 一個字段CD_ID,與SDS表關聯
COLUMNS_V2 存儲字段信息,通過CD_ID與其他表關聯
DATABASE_PARAMS
DBS 存儲hive的database信息
DELETEME1410257703262
FUNCS
FUNC_RU
GLOBAL_PRIVS 全局變量,與表無關
IDXS
INDEX_PARAMS
PARTITIONS 分區記錄,SD_ID, TBL_ID關聯
PARTITION_KEYS 存儲分區字段,TBL_ID關聯
PARTITION_KEY_VALS 分區的值,通過PART_ID關聯。與PARTITION_KEYS共用同一個字段INTEGER_IDX來標示不同的分區字段。
PARTITION_PARAMS 存儲某分區相關信息,包括文件數,文件大小,記錄條數等。通過PART_ID關聯
PART_COL_PRIVS
PART_COL_STATS
PART_PRIVS
ROLES 角色表,和GLOBAL_PRIVS配合,與表無關
SDS 存儲輸入輸出format等信息,包括表的format和分區的format。關聯字段CD_ID,SERDE_ID
SD_PARAMS
SEQUENCE_TABLE 存儲sqeuence相關信息,與表無關
SERDES 存儲序列化反序列化使用的類
SERDE_PARAMS 序列化反序列化相關信息,通過SERDE_ID關聯
SKEWED_COL_NAMES
SKEWED_COL_VALUE_LOC_MAP
SKEWED_STRING_LIST
SKEWED_STRING_LIST_VALUES
SKEWED_VALUES
SORT_COLS 排序字段,通過SD_ID關聯
TABLE_PARAMS 表相關信息,是否外部表,通過TBL_ID關聯
TAB_COL_STATS
TBLS 存儲表信息,關聯字段DB_ID,SD_ID,
TBL_COL_PRIVS
TBL_PRIVS 表賦權限相關信息,通過TBL_ID關聯
VERSION 版本
VERSION_copy 版本,通過VER_ID關聯

對於我們來說 ,一般先只關注SDS TBLS TABLE_PARAMS就OK了。具體下面再介紹

到這裏,hive就全部安裝配置完成.命令行運行hive
這裏寫圖片描述

hive的使用

本文以linux 上一個文件 /etc/passwd來講述

  • 將本地文件上傳到hive中去

    這裏寫圖片描述

create table test ( id varchar(16) , passwd varchar(16) , uid int ,gid int , info varchar(16) , home varchar(32) , command varchar( 32)) row format delimited fields terminated by ‘:’ ;

之後我們可以用sql來操作test這個表了.
接下類我們看看hive的雲數據庫 meteastore都發生了什麼,mysql進入hive數據庫

select a.TBL_NAME as tablename , b.LOCATION as hdfs_uri ,a.CREATE_TIME as CREATE_TIME  from TBLS a  left join SDS b on a.SD_ID=b.SD_ID ;

我們看到
這裏寫圖片描述

也就說說我們的數據最後是直接存儲到hdfs://master:9000/user/hive/warehouse/test,是不是呢?我們在hdfs中查看下
這裏寫圖片描述

可以看到數據了.HEIHEI!!

  • 從hdfs直接映射到hive中
    很多時候,我們需要的不是從本地把數據文件導進入 我們需要的是把存在現有平臺服務器上的HDFS文件直接映射到hive中,假定我們已經有了一個hdfs文件hdfs://master:9000//test/passwd
    (也可以通過 hdfs dfs -put /etc/passwd /test 來製作這個hdfs文件 )
create  table test1 ( id varchar(16) , passwd varchar(16) , uid int ,gid int , info varchar(16) , home varchar(32) , command varchar( 32)) row format delimited fields terminated by ':' location '/test';

這裏寫圖片描述

按照前面的方法,我們從元數據庫中查看
這裏寫圖片描述

我們可以看到多了一條記錄

test1     | hdfs://master:9000/test                     |  1503647126

這樣我們就把外部的hdfs中數據映射到hive中去了

hive中外部表與內部表

再說一個hive中十分重要的概念,外部表。默認情況下我們建的表是內部表。
那麼什麼是內部表呢?請看下圖
這裏寫圖片描述


這裏寫圖片描述
看到了麼 當test或者test1表刪除後,它對應的數據也刪除了。

在看換成是外部表呢?

這裏寫圖片描述

可以看到刪除test2後 /test1/passwd依然存在.
也是就說我們可以用外部表的方式來實現一份hdfs文件對多個hive表共享。

修改hive的location

兩種方式:

  • hive方式通過修改表DDL:
alter table tablename  set location 'new location'
  • mysql方式 直接修改hive 的meteastore 元數據庫
update `DBS` set `DB_LOCATION_URI` = replace(DB_LOCATION_URI,"oldpath","newpath")

update SDS  set location =replace(location,'oldpath,'newpath')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章