Hive入門(二)
- Hive客戶端與服務端
- Hive Shell
- beeline與hiveserver2
- 配置用戶授權
- 關閉HDFS和YARN:
- 修改core-site.xml
- 分發
- 啟動HDFS和YARN
- 復制standalone包
- 啟動
- JDBC連接server2
- Hive啟動腳本
- Hive服務端啟動腳本
- Metastore啟動腳本
- HiveServer2啟動腳本
- 客戶端Beeline啟動腳本
- 修改權限
- Hive的SQL腳本
- 命令列啟動SQL
- 檔案中啟動SQL
- 定時任務
- SQL腳本中傳遞變數
- Hive常用命令
- Hive日志配置
- 日志
- 日志存盤配置
- 重命名組態檔
- 修改配置
Hive入門(一)
Hive客戶端與服務端
Hive Shell
客戶端與服務端是一體的,互動為純文本,對新手極不友好,用于封裝SQL腳本,直接使用hive命令即可啟動,
由于多人操作時會開啟多個客戶端與多個配套的服務端,可能導致資源搶占等問題,正常的方式應該是1個服務端多個客戶端的一主多從結構,這種方式使用不多,
beeline與hiveserver2
beeline是純客戶端,hiveserver2是Hive中獨立的服務端行程,
先結束掉Hive,切換目錄到hive,并且查看bin目錄下的檔案:
[root@node3 ~]# cd /export/server/hive-2.1.0-bin/
[root@node3 hive-2.1.0-bin]# ll ./bin
總用量 64
-rwxr-xr-x 1 root root 1436 6月 3 2016 beeline
-rwxr-xr-x 1 root root 2553 6月 3 2016 beeline.cmd
drwxr-xr-x 3 root root 4096 5月 1 21:31 ext
-rwxr-xr-x 1 root root 8692 6月 17 2016 hive
-rwxr-xr-x 1 root root 8823 6月 3 2016 hive.cmd
-rwxr-xr-x 1 root root 1584 6月 3 2016 hive-config.cmd
-rwxr-xr-x 1 root root 1900 6月 3 2016 hive-config.sh
-rwxr-xr-x 1 root root 885 6月 3 2016 hiveserver2
-rwxr-xr-x 1 root root 1030 6月 3 2016 hplsql
-rwxr-xr-x 1 root root 2278 6月 3 2016 hplsql.cmd
-rwxr-xr-x 1 root root 832 6月 3 2016 metatool
-rwxr-xr-x 1 root root 884 6月 3 2016 schematool
自帶了啟動命令,
啟動beeline可以這樣:
beeline -u jdbc地址 -n 用戶名 -p 密碼
或者這樣(就像MySQL也可以一步輸入賬號密碼或者密碼作為第二次輸入,,,beeline也可以分多次輸入內容):
beeline
!connect jdbc地址
用戶名
密碼
啟動hiveserver2可以:
hive --service hiveserver2
或者直接:
hiveserver2
當前狀態metastore服務已經開啟,如果讀者的該服務未開啟,使用:
hive --service metastore
之后再換一個命令列啟動hiveserver2:
hiveserver2
再新建個命令列,使用jps查看行程:
[root@node3 ~]# jps
5670 Jps
5529 RunJar
4858 NodeManager
4491 DataNode
4747 ResourceManager
3820 RunJar
這貨一般是用10000埠:
[root@node3 ~]# netstat -atunlp |grep 10000
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 5529/java
偶爾會有用10001埠的情況,但是協議不同,,,也能用,,,
服務端啟動了,但是沒有客戶端,形同虛設,,,
配置用戶授權
當前情況沒辦法使用客戶端,,,
命令列多按幾次esc和ctrl+c先結束掉之前開啟的hiveserver前臺程式,,,
老規矩,為了防止意外故障,,,
關閉HDFS和YARN:
stop-dfs.sh
stop-yarn.sh
使用jps查看,確保3個節點的無關行程都已退出,
修改core-site.xml
在node1:
cd /export/server/hadoop-2.7.5/etc/hadoop/
vim core-site.xml
找個空插入:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
記得保存,
分發
node1使用:
scp core-site.xml node2:$PWD
scp core-site.xml node3:$PWD
啟動HDFS和YARN
start-dfs.sh
start-yarn.sh
復制standalone包
[root@node3 hive-2.1.0-bin]# cd /export/server/hive-2.1.0-bin
[root@node3 hive-2.1.0-bin]# ll
總用量 112
drwxr-xr-x 3 root root 209 5月 1 21:31 bin
drwxr-xr-x 2 root root 4096 5月 2 19:52 conf
drwxr-xr-x 4 root root 34 5月 1 21:31 examples
drwxr-xr-x 7 root root 68 5月 1 21:31 hcatalog
drwxr-xr-x 2 root root 44 5月 1 21:31 jdbc
drwxr-xr-x 4 root root 8192 5月 1 21:59 lib
-rw-r--r-- 1 root root 29003 6月 3 2016 LICENSE
-rw-r--r-- 1 root root 513 6月 3 2016 NOTICE
-rw-r--r-- 1 root root 4122 6月 3 2016 README.txt
-rw-r--r-- 1 root root 50294 6月 17 2016 RELEASE_NOTES.txt
drwxr-xr-x 4 root root 35 5月 1 21:31 scripts
[root@node3 hive-2.1.0-bin]# ll ./jdbc/
總用量 17084
-rw-r--r-- 1 root root 17491833 6月 17 2016 hive-jdbc-2.1.0-standalone.jar
可以看到歪果仁腦回路比較新奇,,,這個jar包是依賴庫而不是可執行腳本,放錯了位置,,,
還是node3:
cd /export/server/hive-2.1.0-bin
cp jdbc/hive-jdbc-2.1.0-standalone.jar lib/
啟動
先啟動metastore:
hive --service metastore
再啟動hiveserver2:
hiveserver2
由于都是前臺程式,只好開第三個命令列,,,
[root@node3 ~]# beeline
which: no hbase in (::/export/server/jdk1.8.0_241/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/export/server/hadoop-2.7.5/bin:/export/server/hadoop-2.7.5/sbin:/export/server/hive-2.1.0-bin/bin:/root/bin)
Beeline version 2.1.0 by Apache Hive
beeline> !connect jdbc:hive2://node3:10000
Connecting to jdbc:hive2://node3:10000
Enter username for jdbc:hive2://node3:10000: root
Enter password for jdbc:hive2://node3:10000: ******
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/export/server/hive-2.1.0-bin/lib/hive-jdbc-2.1.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hive-2.1.0-bin/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/export/server/hadoop-2.7.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Connected to: Apache Hive (version 2.1.0)
Driver: Hive JDBC (version 2.1.0)
21/05/02 22:01:16 [main]: WARN jdbc.HiveConnection: Request to set autoCommit to false; Hive does not support autoCommit=false.
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://node3:10000>
或者:
beeline -u jdbc:hive2://node3:10000 -n root -p 123456
都可以進入,
還可以查看下資料庫:
0: jdbc:hive2://node3:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| aaa |
| default |
+----------------+--+
2 rows selected (1.603 seconds)
0: jdbc:hive2://node3:10000>
由于是客戶端直連服務端,并由metastore服務直接讀取資料庫,比起用Hive的SQL還是要快不少的,,,
JDBC連接server2
在新專案的pom.xml配置:
<properties>
<hadoop.version>2.7.5</hadoop.version>
<mysql.version>5.1.38</mysql.version>
<hive.version>2.1.0</hive.version>
</properties>
<dependencies>
<!--引入單元測驗-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Hadoop Client 依賴 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<!-- MySQL Client 依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Hive依賴 -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-common</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-cli</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
使用代碼:
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
//使用JDBC訪問Hive資料的客戶端
public class HiveJdbcClient {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
Connection con = DriverManager.getConnection("jdbc:hive2://node3:10000/default", "root", "123456");
Statement stmt = con.createStatement();
String tableName = "tb_house";
String sql = "select region,t_price,s_price from " + tableName +" limit 100";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1) + "\t" + res.getInt(2)+ "\t" + res.getInt(3));
}
}
}
成功讀取出所需資料:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Program%20Files/apache-maven-3.3.9/Maven_Repository/org/slf4j/slf4j-log4j12/1.7.10/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Program%20Files/apache-maven-3.3.9/Maven_Repository/org/apache/logging/log4j/log4j-slf4j-impl/2.4.1/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Running: select region,t_price,s_price from tb_house limit 100
浦東 472 60629
Process finished with exit code 0
(資料太多沒什么用,此處為了節省篇幅全刪了,,,)
Hive啟動腳本
很多操作是例外不方便,,,使用腳本可以實作自動化,解放人力,,,
由于Hive是安裝在node3,腳本當然也應該在node3,,,又得開個新的命令列,,,安裝Linux時沒有安裝GUI,出現前臺應用是真的煩,,,
Hive服務端啟動腳本
mkdir /export/server/hive-2.1.0-bin/logs
Metastore啟動腳本
vim /export/server/hive-2.1.0-bin/bin/start-metastore.sh
#!/bin/bash
#HIVE_HOME
HIVE_HOME=/export/server/hive-2.1.0-bin
#run metastore
$HIVE_HOME/bin/hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &
這個腳本最后的&代表后臺運行,>>代表輸出重定向,2>&1是把錯誤的日志也寫入日志中(否則會輸出到前臺的命令列),,,
HiveServer2啟動腳本
vim /export/server/hive-2.1.0-bin/bin/start-hiveserver2.sh
#!/bin/bash
#HIVE_HOME
HIVE_HOME=/export/server/hive-2.1.0-bin
#run hiveserver2
$HIVE_HOME/bin/hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
客戶端Beeline啟動腳本
vim /export/server/hive-2.1.0-bin/bin/start-beeline.sh
#!/bin/bash
#HIVE_HOME
HIVE_HOME=/export/server/hive-2.1.0-bin
#run beeline
$HIVE_HOME/bin/beeline -u jdbc:hive2://node3:10000 -n root -p 123456
修改權限
chmod u+x /export/server/hive-2.1.0-bin/bin/start-*
Hive的SQL腳本
很多時候需要讓腳本自動運行以節省人力,但是shell并不能自動跑Hive的SQL腳本,,,
使用:
hive -h
Unrecognized option: -h
usage: hive
-d,--define <key=value> Variable subsitution to apply to hive
commands. e.g. -d A=B or --define A=B
--database <databasename> Specify the database to use
-e <quoted-query-string> SQL from command line
-f <filename> SQL from files
-H,--help Print help information
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
顯然需要-e和-f的命令,
-e:執行命令列中的SQL陳述句,直接執行命令列中提供的SQL陳述句,適合要執行比較少的單條SQL陳述句,
-f:執行一個SQL檔案,
例如:
命令列啟動SQL
hive -e 'show databases;'
雖然很慢,但還是:
Logging initialized using configuration in jar:file:/export/server/hive-2.1.0-bin/lib/hive-common-2.1.0.jar!/hive-log4j2.properties Async: true
OK
aaa
default
Time taken: 1.561 seconds, Fetched: 2 row(s)
成功顯示出正確結果,,,
檔案中啟動SQL
創建個SQL檔案:
vim /export/data/hive.sql
show databases;
use default;
select region,s_price,area from tb_house limit 10;
執行SQL:
hive -f /export/data/hive.sql
定時任務
#!/bin/bash
#定義變數
HIVE_HOME=/export/server/hive-2.1.0-bin
#運行SQL陳述句
#$HIVE_HOME/bin/hive -e 'show databases;'
$HIVE_HOME/bin/hive -f /export/data/hive.sql
借助Crontab,配置:
01 00 * * * bash /export/data/exec.sh
可以實作定時啟動,
SQL腳本中傳遞變數
很多時候腳本的引數是變化的,不能寫死,,,這種情況需要:
–hiveconf:用于定義Hive中屬性的值或者定義Hive中的變數,
例如:
shell腳本:
#!/bin/bash
#獲取昨天的日期
yesterday=`date -d '-1 day' +%Y%m%d`
#定義變數
HIVE_HOME=/export/server/hive-2.1.0-bin
#運行SQL陳述句
#$HIVE_HOME/bin/hive -e 'select count(*) from table where daystr = '${yesterday}';'
$HIVE_HOME/bin/hive --hiveconf yester=${yesterday} -f /export/data/hive.sql
SQL檔案:
select count(*) from table where daystr = '${hiveconf:yester}';
經過了變數傳遞,將shell的變數傳到了檔案中,
Hive常用命令
很多和dfs命令很像,例如:
0: jdbc:hive2://node3:10000> dfs -ls /;
+--------------------------------------------------------------------------+--+
| DFS Output |
+--------------------------------------------------------------------------+--+
| Found 5 items |
| drwxr-xr-x - killer supergroup 0 2021-04-25 22:56 /bigdata |
| drwxr-xr-x - root supergroup 0 2021-05-01 23:05 /export |
| drwx-w---- - root supergroup 0 2021-05-01 22:30 /tmp |
| drwx------ - root supergroup 0 2021-05-01 22:15 /user |
| drwxr-xr-x - root supergroup 0 2021-04-26 20:23 /wordcount |
+--------------------------------------------------------------------------+--+
6 rows selected (0.039 seconds)
0: jdbc:hive2://node3:10000>
由于是客戶端直連,速度很快,
0: jdbc:hive2://node3:10000> set hive.exec.mode.local.auto
. . . . . . . . . . . . . .> ;
+----------------------------------+--+
| set |
+----------------------------------+--+
| hive.exec.mode.local.auto=false |
+----------------------------------+--+
1 row selected (0.016 seconds)
0: jdbc:hive2://node3:10000>
使用set hive.exec.mode.local.auto可以設定模式,默認false為完全分布式,使用:
set hive.exec.mode.local.auto=true;
即可設定為本地模式,單機跑MapReduce測驗邏輯的正確性(小資料量的MR程式運行的比較快,不提交給YARN),,,
MapTask的個數不允許超過4個,
ReduceTask個數不允許超過1個,
輸入資料量不允許超過128M,
可以使用add添加jar包/檔案到Hive的環境變數:
add jar xxx.jar;
add file xxx
可以使用list列舉添加的檔案/jar包:
list files
list jars
還可以使用delete洗掉添加的檔案或者jar包,
Hive日志配置
日志
DEBUG:詳細的日志級別,
INFO:顯示的資訊會包含主要的日志資訊,
WARN:只記錄警告級別的日志,
ERROR:只記錄錯誤級別的日志,
日志存盤配置
重命名組態檔
cd /export/server/hive-2.1.0-bin/conf/
mv hive-log4j2.properties.template hive-log4j2.properties
修改配置
vim hive-log4j2.properties
注釋/直接修改24行:
property.hive.log.dir = /export/server/hive-2.1.0-bin/logs

還需要重啟Hive的服務器node3才能生效,,,
使用ctrl+c干掉前臺行程,clear清空內容,使用jps查看行程,確保Hive程式已經關閉,
node1:
stop-dfs.sh
node3:
stop-yarn.sh
使用jps查看行程,確保關閉后使用reboot重啟或者poweroff掉電,筆者選擇掉電,先拍個快照再說!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282892.html
標籤:其他
上一篇:Flink-Source,Transfrom,Sink鏈路掛載流程
下一篇:Hive基礎知識 01
