@R星校长
Hive SQL
Hive SerDe
Hive SerDe - Serializer and Deserializer
SerDe 用于做序列化和反序列化。
构建在数据存储和执行引擎之间,对两者实现解耦。
Hive 通过 ROW FORMAT DELIMITED 以及 SERDE 进行内容的读写。
row_format
: DELIMITED
[FIELDS TERMINATED BY char [ESCAPED BY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
:SERDE serde_name [WITH SERDEPROPERTIES (property_name=
property_value,property_name=property_value, ...)]
Hive 正则匹配
CREATE TABLE logtbl (
host STRING,
identity STRING,
t_user STRING,
time STRING,
request STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)"
)
STORED AS TEXTFILE;
使用 “笔记/localhost_access_log.2016-02-29.txt” 导入。
192.168.57.4 - - [29/Feb/2016:18:14:35 +0800] "GET /bg-upper.png HTTP/1.1"
304 -
将该文件上传到 node4 的 /root/data 目录
[root@node4 data]# pwd
/root/data
[root@node4 data]# ls
localhost_access_log.2016-02-29.txt person01.txt person02.txt
[root@node4 data]# mv localhost_access_log.2016-02-29.txt logtbl.txt
[root@node4 data]# ls
logtbl.txt person01.txt person02.txt
Node4 hive load 数据到对应的表中
hive> load data local inpath '/root/data/logtbl.txt' into table logtbl;
Loading data to table default.logtbl
Table default.logtbl stats: [numFiles=1, totalSize=1759]
OK
Time taken: 0.463 seconds
hive> select * from logtbl;
Hive Beeline
Beeline 要与 HiveServer2 配合使用
https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentationHiveServer2(HS2)是一种使客户端能够对 Hive 执行查询的服务。 HiveServer2 是已被废弃的 HiveServer1 (仅支持单客户端访问)的继承者。HS2 支持多客户端并发和身份验证。它旨在为 JDBC 和 ODBC 等开放 API 客户端提供更好的支持。HS2 是一个作为复合服务运行的进程,它包括基于 Thrift 的 Hive 服务(TCP 或 HTTP)和 WebUI 的 Jetty Web 服务器。
服务端启动 hiveserver2
如果让让该进程在后台执行:
nohup hiveserver2 & #关闭的话通过kill -9 pid
客户的通过 beeline 两种方式连接到 hive
1、方式一:
beeline -u jdbc:hive2://node3:10000/default [-n hiveuser -p pass]
[root@node4 ~]# beeline -u jdbc:hive2://node3:10000/default -n root -p 123
0: jdbc:hive2://node3:10000/default> !quit #退出
2、方式二:
% bin/beeline
beeline> !connect jdbc:hive2://<host>:<port>/<db>;auth=noSasl hiveuser pass
beeline
beeline> !connect jdbc:hive2://node3:10000/default root 123
默认 用户名、密码不验证,可以是任意内容,但是不能不写。
The Beeline Shell 工作在嵌入式模式和远程模式.在嵌入式模式下,它运行嵌入式 Hive(类似于 HiveCLI),而远程模式是用于在 Thrift 上连接到单独的HiveServer2 进程。从 Hive0.14 开始,当 Beeline 与 HiveServer2 一起使用时,它还会打印来自 HiveServer2 的日志消息,以供它执行到 STDERR 的查询。远程 HiveServer2 模式推荐用于生产使用,因为它更安全,不需要为用户授予直接 HDFS/metastore 访问权限。
生产环境启动方式:1. 结束掉 node3 上的 hiveserver2 进程,通过如下命令启动 hive 元数据服务
hive --service metastore
2.在 node4 上启动 hiveserver2
3.分为开发人员和运营人员:
(1) 开发人员:再打开一个 xshell 连接到 node4 上,然后通过 hive 命令启动,通过命令行模式进行开发与调试。
(2) 运营人员:使用开发好的项目(可以通过 javaweb 项目,使用 jdbc 方法 node4 上提供的接口,设计成 BS 架构的项目),通过浏览器进行操作。
扩展案例:node2 上如何通过 beeline 向表中 load 本地文件中的数据?
假设文件中的数据如下:
11,小明11,lol-book-movie,beijing:xisanqi-shanghai:pudong
12,小明12,lol-book-movie,beijing:xisanqi-shanghai:pudong
13,小明13,lol-book-movie,beijing:xisanqi-shanghai:pudong
14,小明14,lol-book-movie,beijing:xisanqi-shanghai:pudong
15,小明15,lol-movie,beijing:xisanqi-shanghai:pudong
操作步骤:
A. node2 上的数据准备工作
[root@node2 ~]# mkdir data
[root@node2 ~]# cd data
[root@node2 data]# vim data3
将数据放入该文件
B. Beeline 连接
[root@node2 data]# beeline -u jdbc:hive2://node4:10000/default -n root -p 123
C. Load本地数据:
0: jdbc:hive2://node4:10000/default> load data local inpath '/root/data/data3' into table person;
Error: Error while compiling statement: FAILED: SemanticException Line 1:23 Invalid path ''/root/data/data3'': No files matching path file:/root/data/data3 (state=42000,code=40000)
明明存在 /root/data/data3 啊,为何会有这样的提示呢?这是因为 beeline 通常被用来执行 sql 操作,如果非要通过它实现加载本地文件,需要再对应的hiveserver2 服务器(也就是 node4)上,存在 /root/data/data3 文件。
D. 将 data3 文件从 node2 拷贝到 node4 对应目录下,然后在 node2 上再次执行 load 操作。
先拷贝文件
[root@node2 ~]# scp /root/data/data3 node4:/root/data/
data3
避免 node2 上文件困扰,也可以将 node2 上的 /root/data/data3 删除
再次执行 load
E. 再次执行 load ,抛出以下异常:
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=anonymous, access=WRITE, inode="/user/hive_remote/warehouse/person":root:supergroup:drwxr-xr-x
这是因为默认通过匿名用户登录的,权限不足。解决办法,beeline 连接断开,然后以 root 用户登录,再次执行 load 即可。
[root@node2 data]# beeline -u jdbc:hive2://node4:10000/default -n root
0: jdbc:hive2://node4:10000/default> load data local inpath '/root/data/data3' into table person;
INFO : Loading data to table default.person from file:/root/data/data3
INFO : Table default.person stats: [numFiles=1, numRows=0, totalSize=290, rawDataSize=0]
No rows affected (1.419 seconds)
0: jdbc:hive2://node4:10000/default> select * from person;
+------------+--------------+-------------------------+--------------------------------------------+--+
| person.id | person.name | person.likes | person.address |
+------------+--------------+-------------------------+--------------------------------------------+--+
| 11 | 小明11 | ["lol","book","movie"] | {
"beijing":"xisanqi","shanghai":"pudong"} |
| 12 | 小明12 | ["lol","book","movie"] | {
"beijing":"xisanqi","shanghai":"pudong"} |
| 13 | 小明13 | ["lol","book","movie"] | {
"beijing":"xisanqi","shanghai":"pudong"} |
| 14 | 小明14 | ["lol"