开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第三阶段):KuduSpark_Impala 访问 Kudu】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/678/detail/11788
KuduSpark_Impala 访问 Kudu
上一课时介绍了很多和 Kudu 进行交互的方式,因为可能在业务系统中通过 java 来操作 Kudu,甚至在业务系统当中通过 python 来操作 Kudu,也可能会通过其他的语言来操作 Kudu,比如 C++ 。Kudu 对外提供了很多 API ,介绍了 java 如何操作 Kudu,因为 Kudu 里面存放很大量的数据,所以可能很多时候要使用 Spark 来操作 Kudu,所有介绍了如何使用 Spark.KuduContext 来进行表的一些数据定义,也介绍了如何进行增删改数据,以及如何使用 data frame 来进行 Kudu 的改和查。
Kudu 和 Impala 都来自于同一个公司 Cloudera,Cloudera是大数据领域三驾马车当中的其中之一,在全球非常知名的一家做数据解决方案的公司,既然是同一个公司的产品,那么 Impala 和 Kudu 经常需要来配合进行操作,在这之前还是要了解一下 Impala 的场景。
一、Impala 的场景
Impala 的作用并不是在业务系统或者在程序当中通过 JDBC 来访问的,主要作用并不是编写代码来通过 JDBC 访问的。Impala 提供 JDBC 的接口更大的意义可能是给外部系统进行整合和操作使用,不是直接写代码就操作了。Impala 主要是提供给数据分析人员来进行数据分析和查询的,Impala 的作用类似于 Hive。Impala 和 Hive 的区别,第一,Impala 速度比 Hive 要快得多,Hive 是直接使用 map reduce,使用这个样来执行调度哪操作 HDFS 上的文件,执行计划使用 MR;Impala 有自己的执行计划,Impala 是一个 MPP 架构,MPP 又称之为大规模并行式数据库访问,MPP 架构往往会将节点分开,比如 MPP 架构当中会有很多节点,每个节点对应每个数据存储的位置。
首先在 MPP 架构上它首先对外提供一个 API 的服务器,可以称之为 API server,提供了一个 API server 以后要大规模并行的去处理数据,可以把这个数据库拆成多份,每一份独立部署运行在不同的机器上,没有内存的共享的,当来一个请求的时候,它把请求分发给不同的数据库,然后它会集成很多数据库,这就称之为叫做 MPP 架构,而 Impala 就是这样的一个架构。Impala 对应了 HDFS,
比如这是HDFS的一个 data node,这又是一个 data node,画三个 data node,接下来 Impala 就会运行多个 Impala D,这是第一个 Impala D,这是第二个Impala D,这是第三个 Impala D,D 就是守护进程的意思,这样每个 Impala D 就对应了一个 data node,每一个 Impala D 就和一个 data node 进行交互。如果有一个客户端来访问 Impala的时候,比如这个东西称之为 Sell,那么 Sell 会访问其中某一个 Impala D,它把 SQL 语句传过来, SQL 语句会在某一个 Impala D 上被解析,随后被分发给其他的 Impala D,最后一起执行这个 SQL 语句,因为 Impala D 靠近了数据存储的位置,所以 SQL 就会得到大规模的并行被处理,并且 Impala 是使用 C++ 编写的,所以省去了 GC 的成本,省去垃圾处理机制的成本,那么 Impala 整体的性能比 hive 要高很多。
但是要注意,Hive 使用了 MR,MR 专门为了大规模的数据处理分析而设计,也就是 MR 在数据规模上有显著优势,Impala 虽说能提升运行速度,但是有些时候1 G 的数据的查询,用 Impala 可能要比 Hive 快太多了,但是10 T 的数据用 Impala 也要执行很久,Impala 的架构决定了无法执行长时间的 SQL 语句。有一些数据量就是很大,用 Impala 也不能很快的处理完,就应该使用 hive,因为 Hive 在特别大的数据规模上有它的优势,Hive 首先数据吞吐量比较大,其次它能够更好的去处理数据,更好的支持大规模的数据处理,因为 hive 后面还有一个样,在早期的时候,hadoop1.0 阶段没有样这样的集群调度工具,hadoop 的规模怎么都做不上来,怎么做都感觉会有一点点别扭,那个时候的 hadoop架构跟现在的 Impala 会稍微相似,后来觉得问题出现在没有一个独立的集群管理工具,所以在 hadoop2.0 最重要的一个更新,就是拆开了 map reduse 和样,样作为独立的集群调度工具,样后来得到了非常长足的发展,所以 hadoop 在特别长时间的任务执行上,2.0比1.0有显著的优势,相比于 Impala 来说也会有显著的优势。所以 Impala 和 Kudu 进行整合的目的是通过使用 Hive 表来操作 Kudu,要明确 Impala 和 Hive 是强依赖关系,也就是没有 Hive , Impala 就装不到集群里,因为 Impala 依赖Hive 的 Metastore,Impala 虽然也有自己的 Metastore,但还是依赖于 Hive 的 Metastore,也就是 Hive 里面有一张表 Impala 是可以访问的,Impala 创建一张表 Hive 里面也有,所以它们之间的 Metastore 是相互的进行同步的。这就是 Impala 和 Kudu 的整合,Impala 和 Kudu 的整合的最主要目的就是使用 Impala 来访问 Kudu 当中的数据。要开启 Impala,使用 Impala Shell 这个命令
[ root@cdh0l ~]# impala- shell
Starting Impala Shell without Kerberos authentication
Error connecting: TTransportException, Could not connect to cdh01. itcast.cn:21000
welcome to the Impala shell.
(Impala Shell v2.12.0-cdh5.16.1 (4a3775e) built on Wed Nov 21 21:02:28 PST 2018)
The SET command shows the current value of all shell and query options.
[Not connected] > connect cdh02;
Connected to cdh02: 21000
Server version:impaladversion2.12.0cdh5.16.1RELEASE(build4a3775ef6781301af81b23bca45a9faec a5e761d)
[cdh02:21000]
➢create database kudu;
Query: create database kudu
ERROR: Analys isException: Syntax error in line 1
create database kudu
Encountered: KUDU
Expected: DEFAULT, EXTENDED, FORMATTED, IF, IDENTIFIER
CAUSED BY: Exception: Syntax error I
[ cdh02:21000] > create database kudu db;
Query: create database kudu db
Fetched 0 row(s) in 0.72s
[cdh02:21000] > show dataabases;
Query: show dataabases
ERROR: Analys isException: Syntax error in Line 1
show dataabases
Encountered: IDENTIFIER
Expected: AGGREGATE, ANALYTIC, COLUMN, CREATE, CURRENT, DATA, DATABASES, FILES, FUNCTIONS, GRANT, PARTITIONS, RANGE,
ROLE, ROLES, SCHEMAS, TABLE
,TABLES
CAUSED BY: Exception: Syntax error
[cdh02:21000] > show databases ;
Query: show databases
Fetched 3 row(s) in 0.01s
[cdh02:21000] > use kudu_db;
Query: use kudu db
[cdh02:21000] > create external table students stored as kudu
>tblproperties()
>;
Query: create external table students stored as kudu
tblproperties ()
ERROR: AnalysisException: Syntax error in line 2:
tblproperties()
Encountered:( )
Expected: STRING LITERAL
CAUSED BY: Exception: Syntax error
[cdh02:21000] > create external table students stored as kudu
tblproperties( 'kudu. table name' = 'students'
,' kudu.masteraddresses'=cdh02:7051,cdh03: 7051, cdh01:7051');
Query: create external table students stored as kudu
tblproperties( 'kudu. table name' = 'students', ' kudu.masteraddresses'='cdh02:7051,cdh03: 7051,cdh01:7051' )
因为在 cdh01上没有运行 Impala D,也就是 Impala server,所以没有办法连接 cdh01的21000这个端口,cdh1上没有,但是 cdh2上有,可以使用 connect cdh02来接上 Impala 连接 cdh02的端口,但是这个时候会说一个报错,无法连接 cdh02,可以进入到 cdh02上去启动 Impala D server,因为 Impala 有的时候会因为一些错误自动终止运行,那么再启动一下,启动它以后可能一开始会连不上,稍等个一分钟。连上了 cdh02,因为机型的配置稍微有点低,所以运行一阵后有可能会出现宕机的现象,如果出现了这种现象,那么就去重启 Impala server 的服务,就又可以被访问了,这是 Impala。
接下来配合 Kudu 稍微做一个整合,其实只有一个 default 这样一个库,所以可以创建一个 database 叫做 Kudu,但是这个地方会稍微有一点问题,因为 Kudu 在这是一个关键字,所以它不让创建这样的一个数据库,可以create database kudu_db,再 show databasis,这个时候发现有一个 kudu db 这样的数据库了,那么就可以 use kudu_db,这个时候就使用了这样的一个数据库,之后可以在这个数据库当中去创建相应的连接 kudu 的一张 Impala 表。同时如果现在去 Hive 里面去查看的会发现 hive 里面也有这样的一个库,如果创建了一个表,hive 里面也有这张表,这个表其实存在于 hive 的 Metastore 当中。可以这样来玩,首先 create external table,叫 students,然后 Stored as kudu,另起一行,可以设置 table 的 properties,Table 的 properties 里至少要给如下的几个参数,第一要去指定 kudu 的 table name,table name 就是 student,接下来逗号一下,指定 kudu 的 master,master不指定也是可以的,不一定非要指定,之后是 master address,address 指定为 cdh02:7051,cdh03:7051,cdh01:7051,这个时候就创建了对应的 kudu 表。
回顾一下这就是非常标准的建表语句,首先 Create external table student,这个地方的符号是type 键,也就是1旁边的那一个符号,是一个点,不是一个引号,stored as kudu 就是一张 kudu 的表,设置一些参数,首先这个表名叫做 students,其次 Maste address 可以不设置,因为 Impala 的配置文件里面配置过了 kudu 的 master,所以这张可以直接去创建,只需要等待它的创建完成即可。