Hive學習筆記

  • Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
  • 解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
  • Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。

Hive的數據類型

  • primitive_type:
    | array_type
    | map_type
    | struct_type
  • primitive_type:
    |TINYINT
    | SMALLINT
    | INT
    | BIGINT
    | BOOLEAN
    | FLOAT
    | DOUBLE
    | STRING

Hive內部表與外部表的區別

未被external修飾的是內部表(managed table),被external修飾的爲外部表(external table)。

  • 內部表數據由Hive自身管理,外部表數據由HDFS管理;
  • 內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse),外部表數據的存儲位置由自己制定;
  • 刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除;
    對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

hive搭建-單用戶模式

  1. 安裝mysql;
  2. 上傳apache-hive-3.1.1-bin.tar.gz並解壓到/opt/目錄下
tar -zxvf  apache-hive-3.1.1-bin.tar.gz -C /opt/
  1. 環境配置
vi /etc/profile

export HIVE_HOME=/opt/apache-hive-3.1.1-bin
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEPPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin

  1. 修改hive-site.xml
    切換到/opt/apache-hive-3.1.1-bin/conf目錄下,將hive-default.xml.template 拷貝一份,並重命名爲hive-site.xml
    然後編輯hive-site.xml文件。
cp hive-default.xml.template hive-site.xml
vi hive-site.xml
<!-- 指定HDFS中的hive倉庫地址 -->  
<property>  
  <name>hive.metastore.warehouse.dir</name>  
  <value>/root/hive/warehouse</value>  
</property>  
   
<property>  
  <name>hive.metastore.local</name>  
  <value>true</value>  
</property>  

<!-- 指定mysql的連接 -->
<property>  
  <name>javax.jdo.option.ConnectionURL</name>  
  <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionDriverName</name>  
  <value>com.mysql.jdbc.Driver</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionUserName</name>  
  <value>root</value>  
</property>  
   
<property>  
  <name>javax.jdo.option.ConnectionPassword</name>  
  <value>password</value>  
</property> 

注: hive-site.xml 文件中的配置過多,配置自己所需的即可,其他的可以刪除。

  1. 添加數據驅動包
    將mysql 的驅動包上傳到 /opt/apache-hive-3.1.1-bin/lib。

  2. 初始化數據庫
    記得先啓動mysql服務

schematool  -initSchema -dbType mysql

執行成功之後,可以看到hive數據庫和一堆表已經創建成功了。

  1. 進入hive
    hive的數據存儲在hdfs中,因此要先啓動hdfs,啓動順序如下:

    • 先在zookeeper節點上啓動zk服務:zkServer.sh start

    • 在主namenode上啓動hdfs:start-dfs.sh

    • 啓動yarn:start-yarn.sh,通過jps查看是否全部啓動成功;

    • 啓動hive:

      • 輸入hive進入hive窗口。hive命令默認是啓動client服務,相當於
      hive --service cli
      

      此方式不需要啓動server,使用本地的metastore,可以直接做一些簡單的數據操作和測試。

      • 使用遠程的metastore,metastore可以和hive客戶端不在一個機器上。
      服務器1啓動metastore服務
      
      hive --service metastore
      

      如上啓動,會啓動端口號默認9083的metastore服務,也可以通過-p指定端口號。

      hive --service metastore -p 9083
      
      服務器2作爲客戶端做如下配置,可使其連接服務器1的metastore.
      
      <property>  
        <name>hive.metastore.local</name>  
        <value>false</value>  
      </property>
      
      <property>
         <name>hive.metastore.uris</name>
         <value>thrift://node01:9083</value><!-- 此處是服務器1的ip -->
      </property>
      
      

      然後服務器2直接輸入 hive 啓動cli即可。此時不需要啓動server,使用遠程的metastore。

  2. hive基本操作

    • 創建庫:
    create database db_hive_test;
    
    • 創建表:
    create table db_hive_test.student(id int,name string) row format delimited fields terminated by '\t';
    

    說明: terminated by ‘\t’ 表示文本分隔符要使用Tab,行與行之間不能有空格。

    • 準備數據文件
    vim /home/hive/student.txt
    中間的空格符使用Tab建
    
    1001    zhangsan
    1002    lisi
    1003    wangwu
    
    • 加載數據
    load data local inpath '/home/hive/student.txt'  into table db_hivetest.student;
    
    select * from db_hiveTest.student;
    

wordcount案例

  • 建表
create table docs(line string);

create table wc(word string, num int);
  • 加載數據
1、建數據
vi /home/temp/wc

hadoop java
hello lemon hadoop
java lemon
lemon

2、加載數據
load data local inpath '/home/temp/wc' into table docs;

  • 統計單詞個數
from (select explode(split(line, ' ')) as word from docs) w 
insert into table wc 
  select word, count(1) as num 
  group by word 
  order by word;

  • 查詢結果
select * from wc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章