1. 程式人生 > 其它 >第四章 Hive安裝及配置

第四章 Hive安裝及配置

4.1環境準備

4.1.1 啟動Hadoop

4.1.2 安裝MySQL

1、安裝包

將安裝包複製到目錄/usr/local/,當前使用版本如下:

mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

解壓:

#tar xzvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz

修改名稱:

#mv mysql-5.7.22-linux-glibc2.12-x86_64 mysql

建立mysql使用者組和使用者:

# groupadd mysql
# useradd -r -g mysql mysql

2、在/usr/local/mysql目錄下建立data目錄

#mkdir /usr/local/mysql/data

3、更改mysql目錄下所有的目錄及資料夾所屬的使用者組和使用者,以及許可權

# chown -R mysql:mysql /usr/local/mysql
# chmod -R 755 /usr/local/mysql

4、編譯安裝並初始化mysql,務必記住初始化輸出日誌末尾的密碼(資料庫管理員臨時密碼)

#cd /usr/local/mysql/bin
#./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql

5、執行初始化命令成功後,輸出日誌如下:

記錄日誌最末尾位置root@localhost:後的字串,此字串為mysql管理員臨時登入密碼。如當前為:ykmpcILAR7=_

6、編輯配置檔案my.cnf,新增配置如下

#  vi /etc/my.cnf

7、啟動mysql伺服器

# /usr/local/mysql/support-files/mysql.server start

顯示如下結果,說明資料庫安裝成功

8、新增軟連線,並重啟mysql服務

#ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
#ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
#service mysql restart

9、登入mysql,修改密碼(密碼為步驟5生成的臨時密碼)

#mysql -u root -p
Enter password:
mysql>set password for root@localhost = password('yourpass');

10、開放遠端連線

mysql>use mysql;
msyql>update user set user.Host='%' where user.User='root';
mysql>flush privileges;

11、設定開機自動啟動

  • 將服務檔案拷貝到init.d下,並重命名為mysql
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
  • 賦予可執行許可權
# chmod +x /etc/init.d/mysqld
  • 新增服務
# chkconfig --add mysqld
  • 顯示服務列表
# chkconfig --list

12、驗證mysql資料庫是否可用

所用命令或程式碼如下,此命令要在mysql安裝目錄下的bin資料夾下輸入:

# mysql –u root –p

實驗操作演示:

4.2安裝並配置hive

4.2.1 apache官網下載Hive安裝包

安裝包已經存放到/usr/local目錄下,在/usr/local目錄下解壓Hive安裝包,所用命令或程式碼:

# cd /usr/local   
# tar zxvf apache-hive-3.1.2-bin.tar.gz  
# mv apache-hive-3.1.2-bin hive

4.2.2 配置環境變數

修改環境變數,所用命令或程式碼:

# vim /etc/profile

加入hive相關的環境變數

export HIVE_HOME=/usr/local/hive
export PATH=$HIVE_HOME/bin:$HIVE_HOME/conf:$PATH

使修改檔案生效:

# source /etc/profile

4.2.3 準備Hive的配置檔案

進入hive 配置檔案目錄:

# cd /usr/local/hive/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

實驗操作演示:

4.2.4 修改hive-env.sh

在該檔案新增以下四個環境變數的配置:

#jdk目錄
export JAVA_HOME=/usr/local/jdk 
#hadoop安裝目錄
export HADOOP_HOME=/usr/local/hadoop
##Hive安裝路徑
export HIVE_HOME=/usr/local/hive
##Hive配置檔案路徑
export HIVE_CONF_DIR=${HIVE_HOME}/conf

實驗操作演示:

4.2.4 配置hive,使用mysql存放hive的元資料

1、複製mysql驅動程式到hive的lib目錄下

mysql驅動包已經放在local目錄下,複製過程如下。

注意:其他版本的驅動不一定相容

# cp mysql-connector-java-5.1.17.jar /usr/local/hive/lib/

實驗操作演示:

2、配置hive-site.xml

  • l${system:...字樣替換成具體路徑,具體修改項如下:
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive</value>
    <description>hive作業的暫存空間</description>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/hive/downloads</value>
    <description>遠端新增資原始檔的臨時目錄 </description>
</property> 
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/querylog</value>
    <description>Location of Hive run time structured log file</description>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/local/hive/server2_logs</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
  • l hive-site.xml 檔案中配置 MySQL 資料庫連線資訊。
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://192.168.11.130:3306/hive</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>111</value>
</property>

4.2.5 msyql中建立存放hive資訊的資料庫

命令如下:

mysql>create database hive;

實驗操作演示:

4.2.6 初始化hive的元資料(表結構)到mysql中

所用命令或程式碼:

# cd /usr/local/hive/bin
# schematool -dbType mysql –initSchema

實驗操作演示:

4.3 Hive的訪問

所用命令或程式碼:

# hive –v

實驗操作演示:

4.4 HiveQL:資料定義

4.4.1 應用HiveQL建立資料庫

1)進入Hive命令模式

所用命令或程式碼:(如果已經進入Hive命令模式則略過此步驟)

# hive

實驗操作演示:

2)建立資料庫hive

所用命令或程式碼:

hive> create database hive;

實驗操作演示:

如果hive資料庫已經存在,則會丟擲異常,可以加上if not exists關鍵字,則不會丟擲異常。

hive> create database if not exists hive;

3)檢視建立好的資料庫

所用命令或程式碼:

hive> show databases;

實驗操作演示:

4)使用建立好的資料庫

所用命令或程式碼:

hive>use hive;

實驗操作演示:

4.4.2 應用HiveQL建立表

1)建立usr表

hive資料庫中,建立表usr,含三個屬性id,name,age。

所用命令或程式碼:

hive>create table if not exists usr(id bigint,name string,age int);

實驗操作演示:

2)建立表時定義分隔符

所使用命令:

# create table employee (id int,name string,salary int,position string) row  format  delimited  fields  terminated  by '\t' ;

3)複製表

a、複製表結構和資料

所使用命令:

# create table employee2 as select * from employee ;

查詢結果:

b、複製表結構

所使用命令:

# create table employee3 like employee;

查詢結果:

4.4.3應用HiveQL建立分割槽表

分割槽表可以從目錄的層面控制搜尋資料的範圍。

1、建立分割槽表

所使用命令:

# CREATE TABLE t(id int,name string,age int) PARTITIONED BY (Year INT, Month INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

2、新增分割槽,建立目錄

# alter table t add partition (year=2014, month=11) partition (year=2014, month=12);

3、顯式表的分割槽資訊

所使用命令:

# SHOW PARTITIONS t;

4、刪除分割槽

所使用命令:

# ALTER TABLE t DROP IF EXISTS PARTITION (year=2014, month=12);

5、檢視分割槽結構

如上圖所示:

/user/hive/warehouse/hive.db/t/year=2014/month=11

/user/hive/warehouse/hive.db/t/year=2014/month=12

所使用命令:

# dfs -lsr /;

6、查看錶結構

所使用命令:

# desc employee;

4.4.4應用HiveQL建立檢視

1、建立檢視

建立檢視little_usr,只包含usr表中id,age屬性

實驗操作演示:

所用命令或程式碼:

hive>create view little_usr as select id,age from usr;

2、檢視所有的表和檢視

實驗操作演示:

所用命令或程式碼:

hive> show tables;

3、檢視以u開頭的所有表和檢視

實驗操作演示:

所用命令或程式碼:

hive> show tables in hive like 'u*';

4.5 HiveQL:資料操作

4.5.1 實驗準備

  • 本地/usr/local/data目錄下建立檔案sample.txt,並插入以下內容:
1201 Gopal 45000 Technical manager
1202 Manis 45000 Proof reader
1203 Masth 40000 Technical writer
1204  Kiran 40000  Hr Admin
1205 Kranthi 30000 Op Admin
  • 建立employee表

所用命令或程式碼:

# create table employee (id int,name string,salary int,position string) row  format  delimited  fields  terminated  by '\t' ;

4.5.2 應用LOAD DATA語句向資料表內載入檔案

將本地/usr/local/data目錄下檔案sample.txt內容裝載到employee表中:

所用命令或程式碼:

#  LOAD DATA LOCAL INPATH '/usr/local/data/sample.txt' overwrite into table employee;

查詢表內資料:

所使用命令程式碼:

# select * from employee;

4.5.3 應用INSERT語句將查詢結果插入資料表

  • insertinto方式插入一條資料:

所使用命令程式碼:

# insert into employee(id,name,salary ,position ) values(1206,'tom',50000,'admin');

查詢插入結果:

  • 應用INSERT語句將查詢結果插入資料表:

建立備份表employee1:

所使用命令:

# create table employee1 (id int,name string,salary int,position string) row  format  delimited  fields  terminated  by '\t' ;

將查詢結果追加到表:

所使用命令:

# INSERT INTO  TABLE employee1 select * from employee;

查詢插入結果:

再次插入資料:

查詢結果顯示:

4.5.4 應用INSERT語句將查詢結果覆蓋資料表

應用INSERT語句將查詢結果覆蓋目的資料表

所使用命令:

# INSERT overwrite  TABLE employee1 select * from employee;

查詢結果顯示:

INSERT語句後跟overwrite將覆蓋目的資料表的資料。

4.6 HiveQL:資料查詢

4.6.1 基本的Select 操作

  • 基本查詢

查詢employee表中資料:

所使用命令:

# select * from employee;

或者

# select t.id,t.name,t.salary,t.position from employee t;
  • limit

所使用命令:

# select * from employee limit 3;
  • 區間查詢between and

所使用命令:

# select * from employee t where t.salary between 40000 and 45000;
  • 空查詢is null

所使用命令:

# select t.id no,t.name,t.salary from employee  t where t.id is null;
  • 不空查詢is not null

所使用命令:

# select t.id no,t.name,t.salary from employee  t where t.id is not null;
  • 集合查詢in

所使用命令:

# select t.id no,t.name,t.salary from employee t where t.name in (‘tom’,’Gopal’);
  • 不在集合範圍內notin

所使用命令:

# select t.id no,t.name,t.salary from employee t where t.name not in (‘tom’,’Gopal’);
  • 函式查詢

最高工資max

所使用命令:

# select max(e.salary) from employee e;

最低工資min

所使用命令:

# select min(salary) from employee  e;  

總人數count

所使用命令:

# select count(*) from employee  e;

公司月總支出sum

所使用命令:

# select sum(salary) from employee  e;

平均工資avg

所使用命令:

# select avg(salary) from employee  e;  
  • ORDER BY與SORT BY

ORDER BY的使用:

所使用的命令:

# select * from employee e order by e.salary;

SORT BY的使用:

# select * from employee e sort by e.salary;

4.6.2 基於分割槽的查詢

載入資料到表分割槽,以第五章建立的表t為例。

1)載入資料到分割槽

在/usr/local/data/資料夾下建立customer.txt檔案,其內容為:

載入資料到分割槽:

所使用命令:

# load data local inpath ‘/usr/local/data/customer.txt' into table t partition(year=2014,month=11);

查詢結果:

載入資料到分割槽(year=2014,month=12)和查詢結果:

2)基於分割槽的查詢

所使用命令:

# select * from t where month=12 and name like ‘tom%’;

4.6.3 基於Join的查詢

兩個表進行連線,例如有兩個表m n ,m表中的一條記錄和n表中的一條記錄組成一條記錄。

1)實驗準備:

/usr/local/data目錄下建立兩個資料檔案:

建立員工表和部門表:

所使用命令如下:

# create table emp (id int,depno int,name string,salary int,position string) row  format  delimited  fields  terminated  by '\t' ;
# create table dep (id int,name string) row  format  delimited  fields  terminated  by '\t' ;

匯入資料:

所使用命令如下:

# LOAD DATA LOCAL INPATH '/usr/local/data/emp.txt' overwrite into table emp;
# LOAD DATA LOCAL INPATH '/usr/local/data/dep.txt' overwrite into table dep;

2)join on :等值連線

所使用命令:

# select e.id,e.name, d.id,d.name from emp e join dep d on e.depno = d.id;

3)left join:左連線

左連線表示以join左邊資料為主,若join右邊的資料不存在則補空。

所使用命令:

# select e.id,e.name, d.id,d.name from emp e left join  dep d on e.depno = d.id;

4)right join:右連線

右連線表示以join右邊資料為主,若join左邊的資料不存在則補空。

所使用命令:

# select e.id,e.name, d.id,d.name from emp e right join  dep d on e.depno = d.id;