首页 > 编程语言 >2、Apache Kudu-java api操作kudu详细示例以及kudu的三种实现示例

2、Apache Kudu-java api操作kudu详细示例以及kudu的三种实现示例

时间:2023-06-28 13:31:53浏览次数:56  
标签:java 示例 分区 add new kudu columnSchemas Type

Apache Kudu 系列文章

1、Apache Kudu介绍及架构、工作原理、两种部署方式、使用限制详解 2、Apache Kudu-java api操作kudu详细示例以及kudu的三种实现示例 3、Apache Kudu集成impala(shell和java操作)的详细操作


(文章目录)


本文介绍了java api操作kudu详细示例以及kudu的三种实现示例。 本文依赖是kudu环境好用。 本分分为3个部分,即maven依赖、入门示例和kudu的三种分区示例。

一、maven依赖

<dependencies>
		<dependency>
			<groupId>org.apache.kudu</groupId>
			<artifactId>kudu-client</artifactId>
			<version>1.9.0</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
</dependencies>

二、入门示例-CRUD

本示例仅仅演示java api操作kudu的基本功能,即增删查改。

import java.util.ArrayList;

import org.apache.kudu.ColumnSchema;
import org.apache.kudu.Schema;
import org.apache.kudu.Type;
import org.apache.kudu.client.CreateTableOptions;
import org.apache.kudu.client.Delete;
import org.apache.kudu.client.Insert;
import org.apache.kudu.client.KuduClient;
import org.apache.kudu.client.KuduException;
import org.apache.kudu.client.KuduScanner;
import org.apache.kudu.client.KuduSession;
import org.apache.kudu.client.KuduTable;
import org.apache.kudu.client.PartialRow;
import org.apache.kudu.client.RowResult;
import org.apache.kudu.client.RowResultIterator;
import org.apache.kudu.client.SessionConfiguration;
import org.apache.kudu.client.Upsert;
import org.junit.Before;
import org.junit.Test;

public class App {
	// 声明全局变量 KuduClient后期通过它来操作kudu表
	private KuduClient kuduClient;
	// 指定kuduMaster地址
	private String kuduMaster;
	// 指定表名
	private String tableName;

	@Before
	public void init() {
		// 初始化操作
		kuduMaster = "server6:7051,server7:7051";
		// 指定表名
		tableName = "student";
		KuduClient.KuduClientBuilder kuduClientBuilder = new KuduClient.KuduClientBuilder(kuduMaster);
		kuduClientBuilder.defaultSocketReadTimeoutMs(10000);
		kuduClient = kuduClientBuilder.build();
	}

	@Test
	public void createTable() throws KuduException {
		// 判断表是否存在,不存在就构建
		if (!kuduClient.tableExists(tableName)) {
			// 构建创建表的schema信息-----就是表的字段和类型
			ArrayList<ColumnSchema> columnSchemas = new ArrayList<ColumnSchema>();
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("id", Type.INT32).key(true).build());
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("name", Type.STRING).build());
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("age", Type.INT32).build());
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("sex", Type.INT32).build());
			Schema schema = new Schema(columnSchemas);
			// 指定创建表的相关属性
			CreateTableOptions options = new CreateTableOptions();
			ArrayList<String> partitionList = new ArrayList<String>();
			// 指定kudu表的分区字段是什么
			partitionList.add("id"); // 按照 id.hashcode % 分区数 = 分区号
			options.addHashPartitions(partitionList, 6);
			kuduClient.createTable(tableName, schema, options);
		}
	}

	@Test
	public void insertTable() throws KuduException {
		// 向表加载数据需要一个kuduSession对象
		KuduSession kuduSession = kuduClient.newSession();
		kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);
		// 需要使用kuduTable来构建Operation的子类实例对象
		KuduTable kuduTable = kuduClient.openTable(tableName);
		for (int i = 1; i <= 10; i++) {
			Insert insert = kuduTable.newInsert();
			PartialRow row = insert.getRow();
			row.addInt("id", i);
			row.addString("name", "zhangsan-" + i);
			row.addInt("age", 20 + i);
			row.addInt("sex", i % 2);
			kuduSession.apply(insert);// 最后实现执行数据的加载操作
		}
	}

	@Test
	public void queryData() throws KuduException {
		// 构建一个查询的扫描器
		KuduScanner.KuduScannerBuilder kuduScannerBuilder = kuduClient.newScannerBuilder(kuduClient.openTable(tableName));
		ArrayList<String> columnsList = new ArrayList<String>();
		columnsList.add("id");
		columnsList.add("name");
		columnsList.add("age");
		columnsList.add("sex");
		kuduScannerBuilder.setProjectedColumnNames(columnsList);
		// 返回结果集
		KuduScanner kuduScanner = kuduScannerBuilder.build();
		// 遍历
		while (kuduScanner.hasMoreRows()) {
			RowResultIterator rowResults = kuduScanner.nextRows();
			while (rowResults.hasNext()) {
				RowResult row = rowResults.next();
				int id = row.getInt("id");
				String name = row.getString("name");
				int age = row.getInt("age");
				int sex = row.getInt("sex");
				System.out.println("id=" + id + "  name=" + name + "  age=" + age + "  sex=" + sex);
			}
		}
	}

	@Test
	public void updateData() throws KuduException {
		// 修改表的数据需要一个kuduSession对象
		KuduSession kuduSession = kuduClient.newSession();
		kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);

		// 需要使用kuduTable来构建Operation的子类实例对象
		KuduTable kuduTable = kuduClient.openTable(tableName);

		// Update update = kuduTable.newUpdate();
		Upsert upsert = kuduTable.newUpsert(); // 如果id存在就表示修改,不存在就新增
		PartialRow row = upsert.getRow();
		row.addInt("id", 100);
		row.addString("name", "zhangsan-100");
		row.addInt("age", 100);
		row.addInt("sex", 0);

		kuduSession.apply(upsert);// 最后实现执行数据的修改操作
	}

	@Test
	public void deleteData() throws KuduException {
		// 删除表的数据需要一个kuduSession对象
		KuduSession kuduSession = kuduClient.newSession();
		kuduSession.setFlushMode(SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC);

		// 需要使用kuduTable来构建Operation的子类实例对象
		KuduTable kuduTable = kuduClient.openTable(tableName);

		Delete delete = kuduTable.newDelete();
		PartialRow row = delete.getRow();
		row.addInt("id", 100);

		kuduSession.apply(delete);// 最后实现执行数据的删除操作
	}

	@Test
	public void dropTable() throws KuduException {
		if (kuduClient.tableExists(tableName)) {
			kuduClient.deleteTable(tableName);
		}
	}

}

三、kudu分区方式

为了提供可扩展性,Kudu 的table被划分为称为 tablet 的单元,并分布在许多 tablet servers 上。行是属于单个tablet ,将行分配给 tablet 的方法由在表创建期间设置的表的分区决定。 kudu提供了3种分区方式。

1、Range Partitioning ( 范围分区 )

范围分区可以根据存入数据的数据量,均衡的存储到各个机器上,防止机器出现负载不均衡现象

@Test
    public void testRangePartition() throws KuduException {
        //设置表的schema
        LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
        columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
        columnSchemas.add(newColumn("WorkId", Type.INT32,false));
        columnSchemas.add(newColumn("Name", Type.STRING,false));
        columnSchemas.add(newColumn("Gender", Type.STRING,false));
        columnSchemas.add(newColumn("Photo", Type.STRING,false));
 
        //创建schema
        Schema schema = new Schema(columnSchemas);
 
        //创建表时提供的所有选项
        CreateTableOptions tableOptions = new CreateTableOptions();
        //设置副本数
        tableOptions.setNumReplicas(1);
        //设置范围分区的规则
        LinkedList<String> parcols = new LinkedList<String>();
        parcols.add("CompanyId");
        //设置按照那个字段进行range分区
        tableOptions.setRangePartitionColumns(parcols);
 
        /**
         * range
         *  0 < value < 10
         * 10 <= value < 20
         * 20 <= value < 30
         * ........
         * 80 <= value < 90
         * */
        int count=0;
        for(int i =0;i<10;i++){
            //范围开始
            PartialRow lower = schema.newPartialRow();
            lower.addInt("CompanyId",count);
 
            //范围结束
            PartialRow upper = schema.newPartialRow();
            count +=10;
            upper.addInt("CompanyId",count);
 
            //设置每一个分区的范围
            tableOptions.addRangePartition(lower,upper);
        }
 
        try {
            kuduClient.createTable("student",schema,tableOptions);
        } catch (KuduException e) {
            e.printStackTrace();
        }
         kuduClient.close();
    }

2、Hash Partitioning ( 哈希分区 )

哈希分区通过哈希值将行分配到许多 buckets ( 存储桶 )之一 哈希分区是一种有效的策略,当不需要对表进行有序访问时 哈希分区对于在 tablet 之间随机散布这些功能是有效的,这有助于减轻热点和 tablet 大小不均匀

	/**
     * 测试分区:
     * hash分区
     */
    @Test
    public void testHashPartition() throws KuduException {
        //设置表的schema
        LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
        columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
        columnSchemas.add(newColumn("WorkId", Type.INT32,false));
        columnSchemas.add(newColumn("Name", Type.STRING,false));
        columnSchemas.add(newColumn("Gender", Type.STRING,false));
        columnSchemas.add(newColumn("Photo", Type.STRING,false));
 
        //创建schema
        Schema schema = new Schema(columnSchemas);
 
        //创建表时提供的所有选项
        CreateTableOptions tableOptions = new CreateTableOptions();
        //设置副本数
        tableOptions.setNumReplicas(1);
        //设置范围分区的规则
        LinkedList<String> parcols = new LinkedList<String>();
        parcols.add("CompanyId");
        //设置按照那个字段进行range分区
        tableOptions.addHashPartitions(parcols,6);
        try {
            kuduClient.createTable("dog",schema,tableOptions);
        } catch (KuduException e) {
            e.printStackTrace();
        }
 
        kuduClient.close();
    }

3、Multilevel Partitioning ( 多级分区 )

Kudu 允许一个表在单个表上组合多级分区。 当正确使用时,多级分区可以保留各个分区类型的优点,同时减少每个分区的缺点

/**
     * 测试分区:
     * 多级分区
     * Multilevel Partition
     * 混合使用hash分区和range分区
     *
     * 哈希分区有利于提高写入数据的吞吐量,而范围分区可以避免tablet无限增长问题,
     * hash分区和range分区结合,可以极大的提升kudu的性能
     */
    @Test
    public void testMultilevelPartition() throws KuduException {
        //设置表的schema
        LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
        columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
        columnSchemas.add(newColumn("WorkId", Type.INT32,false));
        columnSchemas.add(newColumn("Name", Type.STRING,false));
        columnSchemas.add(newColumn("Gender", Type.STRING,false));
        columnSchemas.add(newColumn("Photo", Type.STRING,false));
 
        //创建schema
        Schema schema = new Schema(columnSchemas);
        //创建表时提供的所有选项
        CreateTableOptions tableOptions = new CreateTableOptions();
        //设置副本数
        tableOptions.setNumReplicas(1);
        //设置范围分区的规则
        LinkedList<String> parcols = new LinkedList<String>();
        parcols.add("CompanyId");
 
        //hash分区
        tableOptions.addHashPartitions(parcols,5);
 
        //range分区
        int count=0;
        for(int i=0;i<10;i++){
            PartialRow lower = schema.newPartialRow();
            lower.addInt("CompanyId",count);
            count+=10;
 
            PartialRow upper = schema.newPartialRow();
            upper.addInt("CompanyId",count);
            tableOptions.addRangePartition(lower,upper);
        }
 
        try {
            kuduClient.createTable("cat",schema,tableOptions);
        } catch (KuduException e) {
            e.printStackTrace();
        }
        kuduClient.close();
    }

以上,本文介绍了java api操作kudu详细示例以及kudu的三种实现示例。

标签:java,示例,分区,add,new,kudu,columnSchemas,Type
From: https://blog.51cto.com/alanchan2win/6570888

相关文章

  • JAVA常用类---静态内部类
    publicclassOuter{privateStringname="李四";privateStringsex="男";//静态类和外部类权限一样/*外部调用Outer.Interinter=newOuter.Inter();Outer.Inter仅表示包含关系,如果是成员类应为Outer.Interinter=newOuter().Inter();还需要导......
  • 使用 IntelliJ IDEA 开发 Azure Function APP (Java)
    使用IntelellJIDEA开发AzureFunctionAPP(Java)前提Azure账户并有可食用的订阅。创建免费的Azure账户。Azure支持的JavaDevelopmentKit(JDK),JDK8或JDK11。IntelliJIDEA无限制版本或社区版本均可。Maven3.5+最新的FunctionCoreTools安装插件并登......
  • java基础
    一、注释、标识符、关键字注释(comments)代码量少的时候我们能看懂,项目结构复杂的时候我们需要用到注释,使项目具有更好的可读性。注释并不会被执行,是写给我们人看的书写注释是一个非常好的习惯Java中的注释有三种单行注释:“//注释一行”多行注释:“/**/注释多......
  • Android 中高级面试原理:热修复与插件化基础—Java与Android虚拟机
    一、Java虚拟机(JVM)1、JVM整体结构使用javac将java文件编译成class文件。类加载器(ClassLoader)将class字节码加载进JVM对应的内存中。JVM将内存分配给方法区、堆区、栈区、本地方式栈4个部分,这4个部分分别存储字节码不同的部分。垃圾回收器(gc)会管理整个内存空间中的垃圾。2、Java代码......
  • Excel JavaScript object model in Office Add-ins
    ExcelJavaScriptobjectmodelinOfficeAdd-ins-OfficeAdd-ins|MicrosoftLearnOffice.jsAPIforExcelExcel加载项使用 OfficeJavaScriptAPI 与Excel中的对象进行交互,其中包括两个JavaScript对象模型:ExcelJavaScriptAPI:随Office2016一起引入的Exc......
  • Java中的异常处理
    Java异常类层次结构图 在Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable:有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。 Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数......
  • java联合索引(复合索引)的好处包括:
    联合索引(复合索引)的好处包括:支持多列查询:联合索引可以用于满足多个列的查询条件,避免了在多个单列索引之间的多次查找和合并。覆盖索引优化:如果联合索引包含了查询需要的所有列,即成为覆盖索引,可以避免回表操作,减少IO开销,提高查询性能。有序性优势:联合索引的顺序可以影响查询的性能。......
  • linux 安装java环境
    第一步:下载jdkhttps://www.oracle.com/java/technologies/downloads/#java8需要登录才能下载第二步:创建jdk安装文件夹#在/usr/local下创建java文件夹cd/usr/localmkdirjava#进入java文件夹目录下cdjava第三步:上传下载好的J......
  • Java学习——变量和常量的相关知识
    变量inta=1,b=2,c=3;//不推荐Stringname="徐菲菲";charx='X';doublepi=3.14;变量作用域类变量(静态变量)定义在类中、方法之外的变量,并且使用static关键字修饰,作用域为整个类,可以被类中的任何方法、构造方法和语句块访问,静态变量的值在程序运行期间只有一个副本。......
  • java调用python
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassDemo1{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubProcessproc;try{proc=Runti......