2021-02-05 大数据课程笔记 day16

时间煮雨
@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-UserDocumentation在这里插入图片描述HiveServer2(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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值