hive是一個基於hadoop的搜索與數據分析引擎,它提供了一種類sql的方式供用戶使用.hive能夠將本地文件映射到一個hive表中 ,同樣hive也能直接將hdfs文件映射到hive中使用。hive自動將sql翻譯成mapreduce
-
hive的安裝
- hadoop的安裝
- mysql的安裝
- 下載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')