Kudu 使用_Java API_创建表 | 学习笔记

简介: 快速学习 Kudu 使用_Java API_创建表

开发者学堂课程【2020版大数据实战项目之 DMP 广告系统(第三阶段)Kudu 使用_Java API_创建表学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/678/detail/11781


Kudu 使用_Java API_创建表


内容介绍:

一、创建表

二、总结

 

一、创建表

Java API 部分,第一,如何创建一张 Kudu 的表,了解 Kudu 的表,使用 Java API 该怎么创建,接下来进入工程中,在工程中要做的第一件事情是创建文件,先创建一个文件夹 Scala

image.png

然后在 test 目录下也创建一个文件夹 scala

image.png

创建好以后再去添加 Scala Framework Support,选中 Scala 这一项,点击 OK

image.png

这时可以直接创建对应的 Java 包,但是在 Windows 版本里要把目录标记为 Sources Root,在其他版本不需要,因为配置过 source test 的目录。

接下来在 Scala 目录下创建一个包 cn.itcast.kudu

image.png

这时先创建一个文件,这个文件是一个 Scala Class,叫 KuduAPI

image.png

接下来可以创建一个方法,这个方法是 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,叫做 KuduClientKuduClient new 出来的时候需要给它指定一个 Builder,需要给它指定一个 master 的地址,接下来直接 build(),就可以去创建相应的内容,创建出来这个东西以后继续向下走,KuduClientBuilder 需要接收 master 列表,那么就把 master 表示出来叫做 kuduKUDU__MASTER 可以直接连192.168.169.1017051,然后把 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 以后就可以 buildbuild 以后第一个列的 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 CreateTableOptionsoptions 创建出来以后,直接 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 里面接收什么参数,要什么拼装什么就可以。这样表已经创建出来了,先去运行一下。

image.png

运行结束,但是报了一个错,如果排查这个错的时候从第一个错开始看,那么看一天估计也不知道这个错是怎么产生的,所以一定要有意识的去看报错信息,通过报错信息来解决代码当中的问题,所以看报错信息的时候应该从最后一条开始看。

image.png

这个最后一条说的很明确,就是connection disconnected,就是如果这个它连接不上,那么 disconnect 也并不是说它一开始就连接不上,有可能是它连接着然后被中断掉了。再往上去看,

image.png

这个连接错误最终导致了一个叫做 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,部署3master 是不是就没有这种问题了,其实还有。继续往下看,最后一个配置,最重要就是要信任的一些子网,在所有的子网都信任。当然所有子网都信任在生产环境里其实不是特别的好,但如果把程序跑在服务器里就不会出现这种问题。

复制这几行配置,然后进入服务,就是窗口当中,然后直接修改 etc 下的 kudu下的 conf 下的 master 这个配置文件,然后在这另起一行粘贴这几行配置,

image.png

粘贴过来以后保存并且退出,之后就去 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

image.png

粘贴过来以后保存并且退出,然后 service kudu-tserver restart,重启一下 tserver

image.png

Cdh01报了一个错,Failed to start Kudu Master Server. Return value: 1   [FAILED]

肯定是启动的时候报错了。那么就去看一下它启动报了什么样的错,cd/var/log/kudu 中,然后看里面的文件,

image.png

有一个文件叫做 WARNING,这个地方重启失败,但是没有任何报错信息。再去重新启动 service

image.png

这时它就启动成功了。接下来再看 cdh02上,它也是 failed,但是再重新启动,cdh03上也是 failed,再重新启动。有的时候就是要重启多次。重启完成后,为了验证它有没有问题,通过 service kudu-master status 查看运行状态,is running 没有问题,这时回到代码当中,再去运行这段代码。

image.png

这时运行已经成功了,这就是向 kudu 当中添加表的步骤。

 

二、总结

回顾一下步骤,首先,如果要操作 kudu API,那么 KuduClientBuilder 必须要去创建 kuduclient,然后通过kuduclient 直接 create table,但是也不能创建,因为缺少两个参数,一个叫做 schema,所以去 new schema,还有一个是 options,那就去 new optionoption 必须要指定一下分区,因为 kudu 当中创建表,必须要指定分区方式,跟 hive 不太一样,hive 不指定也可以创建。还有一点要注意,这个 schema spark 当中的 schema 是不一样的,这是一个单独的对象,它们最主要的区别就是 kudu schema 当中是可以说是 key 的。还有一个小细节,就是可以使用 Java,就是 Scala 为提供了一个叫做 as.Java 的方法,将 scala list 的转成 Java list

相关文章
|
8天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
28 2
|
15天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
42 4
|
23天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
29天前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
1月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
32 1
|
1月前
|
SQL Java API
深入探索Java的持久化技术——JPA(Java Persistence API)
【10月更文挑战第10天】深入探索Java的持久化技术——JPA(Java Persistence API)
32 0
|
1月前
|
Java API 数据库
深入探索Java的持久化技术——JPA(Java Persistence API)
【10月更文挑战第10天】深入探索Java的持久化技术——JPA(Java Persistence API)
42 0
|
1月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
33 0
|
1月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
35 0
|
5天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
下一篇
无影云桌面