03.01 「喵咪大數據」Hive2搭建和基本操作

「喵咪大數據」Hive2搭建和基本操作

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

附上:HIVE官網地址:https://hive.apache.org/喵了個咪的博客:w-blog.cn

1.環境配置

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

通過oneinstack配置環境

<code>> 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/<code>

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

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

分別修改服務器的主機名

<code># 最後主機名會全小寫狀態顯示> hostnamectl set-hostname hive/<code>

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

<code>> vim /etc/hosts192.168.1.101 hadoop-1192.168.1.102 hadoop-2192.168.1.103 hadoop-3/<code> 

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

<code>> 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/<code>

增加java和hadoop的環境變量

<code># javaexport JAVA_HOME=/usr/local/jdk1.8export JRE_HOME=/usr/local/jdk1.8/jreexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$PATH# hadoopexport HADOOP_HOME=/usr/local/hadoop-2.7.3export HADOOP_INSTALL=$HADOOP_HOMEexport HADOOP_MAPRED_HOME=$HADOOP_HOMEexport HADOOP_COMMON_HOME=$HADOOP_HOMEexport HADOOP_HDFS_HOME=$HADOOP_HOMEexport YARN_HOME=$HADOOP_HOMEexport HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/nativeexport PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH/<code>

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

<code>apache-hive-2.3.0-bin.tar.gz/<code>

創建hadoop用戶

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


2.安裝配置


安裝HIVE

解壓安裝Hive

<code>> 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/<code>

設置 Hive環境變量

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


配置Hive2.X

配置文件重命名在運行 Hive 之前需要使用以下命令修改配置文件:

<code>> 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/<code>

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

<code>> vim hive-env.shexport 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配置文件路徑/<code>

在hive機器切換到hadoop用戶創建hive數據存放目錄

<code>> 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/<code>


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

<code>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/<code>


將 hive-site.xml 文件中以下幾個配置項的值設置成上一步中創建的幾個路徑。

<code>> 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}/<username> is created, with ${hive.scratch.dir.permission}./<username>/<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>/<code>


Hive Metastore

默認情況下, Hive 的元數據保存在內嵌的 Derby 數據庫裡, 但一般情況下生產環境會使用 MySQL 來存放 Hive 元數據。創建數據庫和用戶假定你已經安裝好 MySQL。下面創建一個 hive 數據庫用來存儲 Hive 元數據,且數據庫訪問的用戶名和密碼都為 hive。

<code>mysql -u root -pmysql> 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;/<code>

修改hive-site.xml需要在 hive-site.xml 文件中配置 MySQL 數據庫連接信息。

<code>> 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&characterEncoding=UTF-8&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>/<code>


初始化Hive

在命令行運行 hive 命令時必須保證以下兩點:HDFS 已經啟動。MySQL Java 連接器添加到 $HIVE_HOME/lib 目錄下。我安裝時使用的是 mysql-connector-java-5.1.42.jar。

<code>> 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/<code>

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

<code>schematool -dbType mysql -initSchema/<code>

最後會輸出

<code>schemaTool completed/<code>

我們可以通過數據庫查看終端查看hive庫中已經存在部分內容要使用 Hive CLI(Hive command line interface), 可以在終端輸入以下命令:

<code>hive> show tables;OKTime taken: 0.839 seconds/<code>

如果報出異常

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

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


3.基本操作


創建庫

CREATE DATABASE語句

<code>// 創建庫如果存在則不創建CREATE DATABASE IF NOT EXISTS userdb;m// 創建數據庫如果存在則會報錯CREATE SCHEMA userdb;/<code>

下面的查詢用於驗證數據庫列表:

<code>hive> SHOW DATABASES;defaultuserdb/<code>


刪除數據庫


<code>// 刪除庫如果存在則不刪除DROP DATABASE IF EXISTS userdb;// 刪除數據庫必須要刪除完其中的表草能刪除DROP DATABASE IF EXISTS userdb CASCADE;// 刪除數據庫DROP SCHEMA userdb;/<code>


選擇數據庫


<code>USE userdb;/<code>


Hive創建表

最簡單的方式創建表

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

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

<code>CREATE TABLE IF NOT EXISTS employee ( eid int COMMENT 'eid details', name String, salary String, destination String)COMMENT 'Employee details';/<code>


<code>CREATE TABLE IF NOT EXISTS employee ( eid int, name String, salary String, destination String)COMMENT 'Employee details'ROW FORMAT DELIMITEDFIELDS TERMINATED BY ' 'STORED AS TEXTFILE;/<code>

通過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相比其餘兩種格式具有較明顯的優勢

下面的查詢用於查看當前庫表列表:

<code>hive> SHOW TABLES;OKemployee/<code>


查看錶信息


<code>desc formatted employee;desc employee;/<code>


刪除表


<code>DROP TABLE IF EXISTS employee;/<code>


Alter Table 語句

修改表名稱

<code>ALTER TABLE employee RENAME TO emp;/<code>


Change 語句

修改字段名稱和字段類型

<code># 修改name為ename 類型不變還是StringALTER TABLE employee CHANGE name ename String;# 修改salary名稱不變 類型修改為DoubleALTER TABLE employee CHANGE salary salary Double;/<code>

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

<code>ALTER TABLE employee ADD COLUMNS ( dept STRING COMMENT 'Department name');/<code>


插入數據

重新創建employee表,在本地文件系統準備文本sample.txt

<code>vim /home/hive/sample.txt1201 Gopal 45000 Technicalmanager1202 Manisha 45000 Proofreader1203 Masthanvali 40000 Technicalwriter1204 Kiran 40000 HrAdmin1205 Kranthi 30000 OpAdmin/<code>

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

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

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

<code>INSERT INTO TABLE employee values(12,"1","1","1");/<code>

查詢是否插入成功

<code>select * from employee;OK12      1       1       11201    Gopal   45000   Technicalmanager1202    Manisha 45000   Proofreader1203    Masthanvali     40000   Technicalwriter1204    Kiran   40000   HrAdmin1205    Kranthi 30000   OpAdminTime taken: 0.063 seconds, Fetched: 5 row(s)/<code>


Select

相關查詢操作可以參考http://www.yiibai.com/hive/hive_built_in_operators.htmlhttp://www.yiibai.com/hive/hive_built_in_functions.htmlhttp://www.yiibai.com/hive/hive_views_and_indexes.htmlhttp://www.yiibai.com/hive/hiveql_select_where.htmlhttp://www.yiibai.com/hive/hiveql_select_order_by.htmlhttp://www.yiibai.com/hive/hiveql_group_by.htmlhttp://www.yiibai.com/hive/hiveql_joins.html

4 總結

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

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


分享到:


相關文章: