开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第三阶段):Kudu 使用_Java API_创建表】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/678/detail/11781
Kudu 使用_Java API_创建表
内容介绍:
一、创建表
二、总结
一、创建表
Java API 部分,第一,如何创建一张 Kudu 的表,了解 Kudu 的表,使用 Java 的API 该怎么创建,接下来进入工程中,在工程中要做的第一件事情是创建文件,先创建一个文件夹 Scala
然后在 test 目录下也创建一个文件夹 scala,
创建好以后再去添加 Scala 的 Framework Support,选中 Scala 这一项,点击 OK
这时可以直接创建对应的 Java 包,但是在 Windows 版本里要把目录标记为 Sources Root,在其他版本不需要,因为配置过 source 和 test 的目录。
接下来在 Scala 目录下创建一个包 cn.itcast.kudu,
这时先创建一个文件,这个文件是一个 Scala Class,叫 KuduAPI,
接下来可以创建一个方法,这个方法是 test 的方法,名字叫 create table。
@Test
def createTable(): Unit = {
//1.创建 API 入口
val KUDU_ MASTER = "192.168.169.101:7051"
val kuduClient = new KuduClientBuilder(KUDU_ MASTER).build()
// 2.创建表的 Schema
val columns = List(
new ColumnSchemaBuilder(name = "key", Type.STRING).key(key = true). build(),
new columnschemaBuilder(name = "value", Type.STRING).key(key = false).build()
}
import scala.collection.JavaConverters._
val schema = new Schema(columns.asJava)
// 3.指定分区
val options = new CreateTableOptions()
.setRangePartitionColumns(List("key").asJava)
// Tablet 是存储数据的位置,Tablet 是不是可以有多个,有主从的概念
.setNumReplicas(1)
// 4.创建表
kuduClient.createTable(name = "simple", schema, options)
}
}
接下来导入 junit.Test,如果要去操作 kudu,第一步,先去创建 API 入口,第二步,创建出来创建表所必需的 Schema,为什么要创建 Schema?因为 kudu 也是表的形态,表是有结构的,要把结构先告诉 kudu。第三步,定义各种的一些列,然后指定分区,第四步,创建表。大致就是这样的步骤,这四步比较好理解,其实也可以直接从第四步开始,可以直接创建表,看表的 API,里面需要什么就创建什么。但是在这之前要先创建 API 的入口,直接 new 出来一个 kudu,叫做 KuduClient,KuduClient new 出来的时候需要给它指定一个 Builder,需要给它指定一个 master 的地址,接下来直接 build(),就可以去创建相应的内容,创建出来这个东西以后继续向下走,KuduClientBuilder 需要接收 master 列表,那么就把 master 表示出来叫做 kudu,KUDU__MASTER 可以直接连192.168.169.101:7051,然后把 KUDU__MASTER 传进来就可以进行 build,接下来就拿到了 val kuduClient,这个时候拿到 kuduclient 以后可以直接通过 kuduclient 去 createTable,这时 create table里接收四个参数。
先查看项目都需要创建什么内容,首先要创建一个表要提供一个表名,其次要提供表的结构信息,再其次要封装一些分区信息、参数等等,这样一些内容。
三大参数,第一个可以直接给,剩下两个要手动去创建,切回 Kudu API.scala 类当中,定义创建表的 Schema,可以直接 new 一个 Schema,之后就导入相应的 kudu 的 Schema 包,这个类,然后 Schema 当中接收一些参数,接收 Java 的 Schema 的一个表示,注意有一个 columns 必须要给,并且需要注意这个地方用的 list 它构造函数里面所接收的这个 list 是 java 的 list,也就是它接收的并不是 Scala 的 list,接下来需要把 Scala 的 list 转为 Java 的 list 才能传给 Schema 的构造函数。继续往下做,这个时候 Schema 怎么传呢?先创建 columns = List,这个 list 是 Scala 的 list 而不是 java 的 list,等会儿要进行转换的。list 中接收的是一个又一个的 ColumnSchemaBuilder,这个 ColumnSchemaBuilder 里面要去接收对应的这一列的,每一个Column 对应的是一个列的信息,这样要把列名传进来叫 key,类型是 Type,这个 Type 需要进行打包,注意打的是 kudu 的包,往下是一个 STRING 类型的对象,接下来要去指定一个 Key,必须要指定一个 Key,也就是说一张表当中假如给了两个 Schema,要有一个是 Key,另外一个可以不是,所以要告诉它这个是不是 Key,告诉是否是 Key 以后就可以 build,build 以后第一个列的 Schema 已经给出了,然后再去创建第二个列的 schema,当中再给一个 value,对应的 Type 还是 STRING,再给一个Key,直接 build,两个 schema 创建出来了。
注意这个地方还没有导入任何 spark 的东西,所以 ColumnSchema 是 kudu 的 schema,而这个 schema 也是 kudu 的 schema,是 kudu 这个包下的类。接下来需要把 columns 传进来,乍一看没有问题,但是还是会报错,问题非常明确,现在要一个 Java 的 util 下的 list,但是给的是 Scala 当中的 list,这是不对的。可以直接通过 as.Java 这样的 API 把 Scala 的 list 转为 Java 的 list,但是使用这个 API 之前必须先去导入一个隐式转换,这个隐式转换在 Scala 当中叫做 collection 包下的 Javaconverters,接下来再点_,这时这个 as.Java 就可以用了,并且把它也转成了 java 的 Schema,继续往下走,就用一个 Schema 来保留这个内容,这一步解决了,可以去指定对应的分区了。分区其实就是创建的对象叫做 new CreateTableOptions,options 创建出来以后,直接 setRangePartitionColumns,这个RangePartitionColumns 是一个分区的方式,是一个范围分区,这个范围分区会按照 Key 的范围进行分区,这是 range 分区方式,这个分区方式在项目当中具体介绍。
kudu 当中有几种分区方式,这一部分需要告诉它这个 Key 按照什么 Key 来进行分区,然后指定一个 list,这个 list 当中接收,按照 key 这一列进行分区即可,这个分区可以这样理解,一张表给了1万条数据,要分发到不同的节点,按照什么样的规则,按照哪一列来进行分发的,这个列的列名要传进来。因为 kudu 是 Java 的 API,所以接收的都是 Java 的 list,要转为as.java。不仅要设置分区,还要设置 kudu 当中默认的 Replica,默认的分区方式是三个分区,复制因子是三,也就是 Tablet 是最终存储数据的位置,Tablet 可以有多个,有主从的概念。默认的复制因子是三,所以要去设置复制因子,因为 tablet server 总共只有两个,那么使用三这个复制因子明显不科学,所以指定这个复制因子是1。
接下来就得到了一个 options,之后就可以创建表了,第一个参数接收的是一个表名,第二个参数接收的是 Schema,第三个参数接收的是 options,这样整个表就创建好了,只要知道创建表使用的方法叫做 create table 即可,至于 create table 里面接收什么参数,要什么拼装什么就可以。这样表已经创建出来了,先去运行一下。
运行结束,但是报了一个错,如果排查这个错的时候从第一个错开始看,那么看一天估计也不知道这个错是怎么产生的,所以一定要有意识的去看报错信息,通过报错信息来解决代码当中的问题,所以看报错信息的时候应该从最后一条开始看。
这个最后一条说的很明确,就是connection disconnected,就是如果这个它连接不上,那么 disconnect 也并不是说它一开始就连接不上,有可能是它连接着然后被中断掉了。再往上去看,
这个连接错误最终导致了一个叫做 NoLeaderFoundException,就是没有找到 master leader。如果出现这个错误,就应该跟随这个步骤来进行配置,这个配置是什么意思呢?这是刚才创建表的步骤,
// Kudu 的 Master 地址
val KUDU_ MASTER = "node01:7051"
//创建 KuduClient 入口
val kuduClient = new KuduClientBuilder (KUDU_ MASTER).build()
//创建列定义的 List
val columns = List(
new ColumnSchemaBuilder("key", Type. STRING) . key(true) . build(),
new ColumnSchemaBuilder("value", Type . STRING) . key(false) . build()
//因为是 Java 的API,所以在使用 List 的时候要转为 Java 中的 List
import scala. collect ion.JavaConverters._
val javaColumns = columns.asJava
//创建 Schema
val schema = new Schema(javaColumns )
//因为 Kudu 必须要指定分区,所以先创建一个分区键设置
val keys = List("key").asJava
val options = new CreateTableOptions().setRangePartitionColumns (keys).setNumReplicas(1)
//通过 Schema 创建表
kuduClient.createTable("simple", schema, options )
直接按照这个代码来写即可。
如果运行程序的时候发现报错 Kudu master has no leader,说明 Kudu 的Master server 拒绝了这次连接,主要是 Kudu 安全策略的原因,想要大家配的是 trusted_ subnets,就是信任的一些子网,做法是复制如下配置:
- -unlock_ unsafe_ flags=true
- -allow_ unsafe_ replication_ factor-true
- -default_ num_ replicas=1
- -rpc_ negotiation_ timeout_ ms=9000
- -rpc -encryption=disabled
- -rpc_ authentication=disabled
- -trusted_ subnets=0.0.0.0/0
这段配置配了几个东西,第一个默认的 replicas 给定是1,然后大家可能会想是不是 replicas 是3就没有问题了,部署3个 tablet server,部署3个 master 是不是就没有这种问题了,其实还有。继续往下看,最后一个配置,最重要就是要信任的一些子网,在所有的子网都信任。当然所有子网都信任在生产环境里其实不是特别的好,但如果把程序跑在服务器里就不会出现这种问题。
复制这几行配置,然后进入服务,就是窗口当中,然后直接修改 etc 下的 kudu下的 conf 下的 master 这个配置文件,然后在这另起一行粘贴这几行配置,
粘贴过来以后保存并且退出,之后就去 service kudu-master restart,重启一下。然后在 cdh02上修改一下 etc/kudu/conf/tserver.gflagfile 这样一个配置文件,3个配置文件都要改。然后再粘过来刚才的这一部分内容,粘过来以后保存并且退出,然后在这里service kudu-tserver restart,然后重启即可。对于 cdh03一样的操作,etc 下的 kudu下的 conf 下的这个配置文件修改一下,接下来另起一行粘贴内容,
# DO not modify these two Lines. If you wish to change these variables
粘贴过来以后保存并且退出,然后 service kudu-tserver restart,重启一下 tserver。
Cdh01
报了一个错,Failed to start Kudu Master Server. Return value: 1 [FAILED]
肯定是启动的时候报错了。那么就去看一下它启动报了什么样的错,cd/var/log/kudu 中,然后看里面的文件,
有一个文件叫做 WARNING,这个地方重启失败,但是没有任何报错信息。再去重新启动 service,
这时它就启动成功了。接下来再看 cdh02上,它也是 failed,但是再重新启动,cdh03上也是 failed,再重新启动。有的时候就是要重启多次。重启完成后,为了验证它有没有问题,通过 service kudu-master status 查看运行状态,is running 没有问题,这时回到代码当中,再去运行这段代码。
这时运行已经成功了,这就是向 kudu 当中添加表的步骤。
二、总结
回顾一下步骤,首先,如果要操作 kudu 的 API,那么 KuduClientBuilder 必须要去创建 kuduclient,然后通过kuduclient 直接 create table,但是也不能创建,因为缺少两个参数,一个叫做 schema,所以去 new 出 schema,还有一个是 options,那就去 new 出 option,option 必须要指定一下分区,因为 kudu 当中创建表,必须要指定分区方式,跟 hive 不太一样,hive 不指定也可以创建。还有一点要注意,这个 schema 和 spark 当中的 schema 是不一样的,这是一个单独的对象,它们最主要的区别就是 kudu 的 schema 当中是可以说是 key 的。还有一个小细节,就是可以使用 Java,就是 Scala 为提供了一个叫做 as.Java 的方法,将 scala 的 list 的转成 Java 的 list。