Kudu数据库详解

news2024/10/5 18:27:23

文章目录

    • 1、概要
    • 2、 Kudu产品特点:
    • 3 、Kudu架构
    • 4、 基础概念
    • 5、 服务端口
    • 6、 启停命令
    • 7 、kudu与impala结合
    • 8、 使用限制
    • 9、 使用kudu-client操作kudu

1、概要

Apache Kudu 是由 Cloudera开源的列式存储系统,可以同时提供低延迟的随机读写和高效的数据分析能力。Kudu在 HDFS 和 HBase 这两个产品中平衡了随机读写和批量分析的性能。 Kudu 支持水平扩展,并且与 Cloudera Impala 和Apache Spark等当前流行的大数据查询和分析工具结合紧密。适用于既要随机读写,又需要批量分析的大数据分析(OLAP)场景。
在这里插入图片描述

2、 Kudu产品特点:

  • 同时提供低延迟的随机读写和高效的数据分析能力
  • Kudu支持水平扩展
  • 与Impala和Spark等当前流行的大数据查询和分析工具无缝结合
  • Kudu提供了行级的插入、更新、删除API
  • 提供了接近Parquet性能的批量扫描操作
  • 使用同一份存储,既可以进行随机读写,也可以满足数据分析的要求

3 、Kudu架构

Kudu采用了Master-Slave形式的中心节点架构,管理节点被称作Kudu Master,数据节点被称作Tablet Server。master主要负责:管理元数据信息,监听server,当server宕机后负责tablet的重分配。Tablet server主要负责tablet的存储与和数据的增删改查。一个表的数据,被分割成1个或多个Tablet,Tablet被部署在Tablet Server来提供数据读写服务。
在这里插入图片描述
上图显示了一个具有三个 master 和多个tablet server的Kudu集群,每个服务器都支持多个tablet。Tablet server 和 Master 使用 Raft Consensus Algorithm 来保证节点的高可用。此外,tablet server 可以成为某些 tablet 的 leader,也可以是其他 tablet follower。leader以金色显示,而 follower 则显示为蓝色。

4、 基础概念

  • Table(表):一张table是数据存储在kudu的位置。Table具有schema和全局有序的primary key(主键)。Table被分为很多段,也就是tablets.

  • Tablet (段):一个tablet是一张table连续的segment,与其他数据存储引擎或关系型数据的partition相似。Tablet存在副本机制,其中一个副本为leader tablet。任何副本都可以对读取进行服务,并且写入时需要在所有副本对应的tablet server之间达成一致性。

  • Tablet server:存储tablet和为tablet向client提供服务。对于给定的tablet,一个tablet server充当leader,其他tablet server充当该tablet的follower副本。只有leader服务写请求,leader与follower为每个服务提供读请求。

  • Master:主要用来管理元数据(元数据存储在只有一个tablet的catalog table中),即tablet与表的基本信息,监听tserver的状态

  • Catalog Table: 元数据表,用来存储table(schema、locations、states)与tablet(现有的tablet列表,每个tablet及其副本所处tserver,tablet当前状态以及开始和结束键)的信息。

  • 分区: Range Partitioning ( 范围分区 ), Hash Partitioning ( 哈希分区 ), Multilevel Partitioning ( 多级分区 )
    哈希分区有利于最大限度地提高写入吞吐量,而范围分区可避免 tablet 无限增长的问题;hash分区和range分区结合,可提升kudu性能

5、 服务端口

Master server WEB UI界面地址http://10.68.8.65:8051/
Tablet server WEB UI界面地址http://10.68.8.65:8050/
客户端与Master通信端口7051
客户端与tablet节点的通信端口7050

6、 启停命令

systemctl start kudu-master.service
systemctl start kudu-tserver.service
systemctl stop kudu-master.service
systemctl stop kudu-tserver.service
注意:每个节点都需要用命令挨个启动

7 、kudu与impala结合

kudu与impala结合可以使用sql对kudu进行操作,简化

${IMPALA_HOME}/shell/impala-shell
创建内部表
CREATE TABLE my_table1
( id BIGINT,name STRING,PRIMARY KEY(id))
PARTITION BY HASH PARTITIONS 16
STORED AS KUDU
TBLPROPERTIES(‘kudu.master_addresses’ = ‘10.68.7.xx:7051’
);
创建外部表
CREATE EXTERNAL TABLE ys_user STORED AS KUDU
TBLPROPERTIES( ‘kudu.table_name’ = ‘ys_user’, ‘kudu.master_addresses’ = ‘10.68.7.xx:7051’);
查询语句
select * from default_vals;
merge语句示例:
upsert into default_vals(id,name,address,age) values(102,‘hello2’,‘山东’,22);

8、 使用限制

  • 表最多可以有300列
  • 单个单元格的值在编码或压缩前不能大于64KB
  • 行的大小:虽然单个单元可能高达64KB,而Kudu最多支持300列,但建议单行不要大于几百KB。
  • 有效的标识符:表名和列名等标识符必须是有效的UTF-8序列且不超过256个字节。
  • 不可变的主键(Immutable Primary Keys):kudu不允许更新一行的主键列
  • 不可更改的主键(Non-alterable Primary Key):Kudu不允许在创建表后更改主键列。
  • 不可更改的分区(Non-alterable Partitioning):Kudu不允许在创建表后更改表的分区方式,删除和增加范围分区除外
  • 不可更改的列类型(Non-alterable Column Types):Kudu不允许修改列的类型
  • 仅支持行级事务, 不支持多行事务操作
  • 主键有索引,不支持二级索引(Secondary indexes)。

9、 使用kudu-client操作kudu

创建表

	public static void testCreateTable(KuduClient client, String tableName) throws KuduException {
		if (!client.tableExists(tableName)) {
			ArrayList<ColumnSchema> columnSchemas = new ArrayList<>();
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("id", Type.STRING).key(true).build());
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("int_value", Type.INT64).build());
			columnSchemas.add(new ColumnSchema.ColumnSchemaBuilder("bigint_value", Type.INT64).build());
			Schema schema = new Schema(columnSchemas);

			CreateTableOptions options = new CreateTableOptions();
			List<String> partitionList = new ArrayList<>();
			// kudu表的分区字段是什么 TODO
			partitionList.add("id");
			// 按照id.hashcode % 分区数 = 分区号
			options.addHashPartitions(partitionList, 3);

			client.createTable(tableName, schema, options);
		}
	}

插入数据

	public static void testInsert() throws KuduException {
		String master = "kudu1:7051,kudu2:7051,kudu3:7051";
		KuduSession session = null;
		try {
			KuduClient client = new KuduClient.KuduClientBuilder(master).build();
			String tableName = "my_first2";
			testCreateTable(client, tableName);
			session = client.newSession();

			KuduTable table = client.openTable(tableName);

			SessionConfiguration.FlushMode mode;
			Timestamp d1 = null;
			Timestamp d2 = null;
			long millis;
			long seconds;
			int recordCount = 100000;
			mode = SessionConfiguration.FlushMode.MANUAL_FLUSH;
			d1 = new Timestamp(System.currentTimeMillis());
//	            insertManual(session, table,  recordCount);
			insertInAutoSync(session, table, recordCount);
			d2 = new Timestamp(System.currentTimeMillis());
			millis = d2.getTime() - d1.getTime();
			seconds = millis / 1000 % 60;
			System.out.println(mode.name() + "耗时秒数:" + seconds);

		} catch (KuduException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}
		// 仅支持自动flush的测试用例
	public static void insertInAutoSync(KuduSession session, KuduTable table, int recordCount) throws Exception {
		// SessionConfiguration.FlushMode.AUTO_FLUSH_BACKGROUND
		// SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC
		// SessionConfiguration.FlushMode.MANUAL_FLUSH
		SessionConfiguration.FlushMode mode = SessionConfiguration.FlushMode.AUTO_FLUSH_SYNC;
		// 如果不设置,默认是1000
		session.setFlushMode(mode);

		for (int i = 0; i < recordCount; i++) {
			Insert insert = table.newInsert();
			PartialRow row = insert.getRow();
			UUID uuid = UUID.randomUUID();
			row.addString("id", uuid.toString());
			row.addLong("int_value", 20000L+i);
			row.addLong("bigint_value", 20000L);
			session.apply(insert);
		}
	}

查询数据

	public static void query() throws KuduException {
		String master = "kudu1:7051,kudu2:7051,kudu3:7051";
		String tableName = "my_first2";
		KuduPredicate predicate1;
		//创建KuduClient 
		KuduClient client = new KuduClient.KuduClientBuilder(master).build();
		KuduTable table = client.openTable(tableName);
		KuduScannerBuilder kuduScannerBuilder = client.newScannerBuilder(client.openTable(tableName));
		List<String> columns = Arrays.asList("id", "int_value", "bigint_value");
		kuduScannerBuilder.setProjectedColumnNames(columns);

		//查询
		KuduScanner kuduScanner = kuduScannerBuilder.build();
		while (kuduScanner.hasMoreRows()) {
			RowResultIterator rowResults = kuduScanner.nextRows();
			int numRows = rowResults.getNumRows();
			totalRows=totalRows+numRows;
			System.out.println("numRows count is : " + numRows);
			Long end=System.currentTimeMillis();
			System.out.println("totalRows "+totalRows);
		}
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运行程序时出现“无效类”的解决方法

最近做开发时&#xff0c;遇到了一个奇怪的问题&#xff0c;打开的烧录软件突然出现了“无效类”的字样&#xff0c;以前打开却时正常的&#xff0c;真的是莫名其妙。 然后找了很久的解决办法&#xff0c;终于在某一天运行一个系统软件出现了同样的问题&#xff0c;有提示到WMI…

JS 异常处理

1、抛出异常 throw 1.throw抛出异常信息&#xff0c;程序也会终止执行 2.throw后面跟的是错误提示信息 3.Error对象配合 throw使用&#xff0c;能够设置更详细的错误信息 示例 function fn(x, y) {if (!x || !y) {throw new Error(没有参数传进来) }return x y } fn()打印结果…

0201-2-进程的描述与控制

第二章进程的描述与控制 前驱图和程序执行 程序并发执行 程序的并发执行 程序并发执行时的特征 间断性失去封闭性不可再现性 进程的描述 进程的定义 进程是程序的一次执行进程是一个程序及其数据在处理机上顺序执行时所发生的活动进程是具有独立功能的程序在一个数据集合…

业务流程自动化平台在制造业应用案例,助力业务自动化、智能化

捷昌驱动成立于2000年&#xff0c;并于2018年9月在上海证券交易所上市&#xff0c;是一家专注于线性驱动产品研发、生产及销售的科技集团。 公司整合全球资源&#xff0c;为智慧办公、医疗康护、智能家居、工业自动化等关联产业提供驱动及智能控制解决方案&#xff0c;以科技驱…

华为手机滚屏翻译:双指长按屏幕,快速翻译屏幕上的一屏或多屏内容,自动检测英日法韩西俄等10种语言

翻译作为沟通工具&#xff0c;能够帮助跨越各种语言的障碍&#xff0c;让人们能够与来自不同文化背景的人有效交流。翻译也是文化传播的重要途径&#xff0c;它允许不同语言和文化的故事、思想、知识和艺术形式被广泛传播&#xff0c;增进了人们对异域文化的理解和尊重。 在手机…

「C/C++」常见注释格式

✨博客主页何曾参静谧的博客📌文章专栏「C/C++」C/C++程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

使用 PyTorch 构建 NLP 聊天机器人

一、说明 聊天机器人提供自动对话&#xff0c;可以帮助用户完成任务或寻求信息。随着深度学习的最新进展&#xff0c;聊天机器人正变得越来越具有对话性和实用性。这个全面的教程将利用 PyTorch 和 Python 从头开始构建聊天机器人&#xff0c;涵盖模型架构、数据准备、训练循环…

妤带皇冠必承其重:刘芊妤从模特到演员的蜕变

刘芊妤自2015年至2017年参加了十几场国内外的知名模特大赛&#xff0c;选美大赛&#xff0c;多次荣获冠军&#xff0c;十佳以及单项奖&#xff0c;2017年赴台湾和埃及&#xff0c;赴土耳其参加国际赛事&#xff0c;荣获奖项, 为国争光&#xff0c;她聪明睿智&#xff0c;乘风破…

基于Java SSM框架实现智能快递分拣系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现智能快递分拣系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

CV论文--2024.2.2

1、Motion Guidance: Diffusion-Based Image Editing with Differentiable Motion Estimators 中文标题&#xff1a;运动引导&#xff1a;利用可微分运动估计器进行基于扩散的图像编辑 简介&#xff1a;当根据文本描述生成图像时&#xff0c;扩散模型能够产生引人注目的图像&…

Kafka常见生产问题详解

目录 生产环境常见问题分析 消息零丢失方案 1、生产者发消息到Broker不丢失 2、Broker端保存消息不丢失 3、消费者端防止异步处理丢失消息 消息积压如何处理 如何保证消息顺序 ​问题一、如何保证Producer发到Partition上的消息是有序的 问题二&#xff1a;Partition中…

IDEA 配置和缓存目录 设置

IDEA系列产品&#xff0c;一般会在用户目录创建 配置 和 缓存 目录&#xff1a; %APPDATA%\JetBrains%LOCALAPPDATA%\JetBrains 一般会展示为&#xff1a; C:\Users\<username>\AppData\Roaming\JetBrainsC:\Users\<username>\AppData\Local\JetBrains 一般占用…

为啥监管层要打击量化交易?

&#xff08;1&#xff09;李鬼量化交易&#xff1a;程序化交易 我先讲讲李鬼。它本来不属于量化交易&#xff0c;但是人们说它是量化交易&#xff0c;好吧&#xff0c;三人成虎众口铄金&#xff0c;既然大家说鹿就是马&#xff0c;那鹿就是马&#xff0c;至于鹿是不是马&#…

中国文化之光:微博数据的探索与可视化分析

大家好&#xff0c;我是八块腹肌的小胖 下面我们针对主题“中国文化”相关的微博数据进行爬取 使用LDA、情感分析、情感演化、词云等可视化操作进行相关的展示 1、导包 第一步我们开始导包工作 下面这段代码&#xff0c;首先&#xff0c;pandas被请来了&#xff0c;因为它是…

睿尔曼超轻量仿人机械臂——外置按钮一键启停程序配置

在睿尔曼超轻量仿人机械臂—外置按钮盒使用说明一文中&#xff0c;介绍了外置按钮盒的安装及使用。它能够使机械臂的使用变得更加编辑&#xff0c;仅需按钮即可完成运动程序的启停等控制&#xff0c;而无需进入示教界面操作。 在示教界面中&#xff0c;我们可以完成运动程序的…

从用户行为到数据:数据采集全景解析【主流电商平台API接口数据采集方式】

电商数据采集是数据体系建设的最上游&#xff0c;是非常重要的一个环节&#xff0c;除了专业的数据人员&#xff0c;人们普遍对数据采集的认知度不高。如果你提起埋点&#xff0c;应该很多人都熟悉它。它应该也是绝大部分人对数据采集的认知了。数据上报其实是一个系统性工程&a…

vmware网络配置,VMware的三种网络模式详解与配置

vmware为我们提供了三种网络工作模式 vmware为我们提供了三种网络工作模式, 它们分别是: Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 VMware虚拟机的三种网络类型的适用场景如下…

设备的层次结构 - 驱动程序的垂直层次结构

Windows操作系统是分层调用。其实在驱动程序中也可以是分层调用的。 驱动程序的垂直层次结构 不仅是WDM驱动&#xff0c;NT式驱动也可以分层&#xff0c;这主要是通过一个设备附加在另一个设备之上。因此&#xff0c;可以将WDM驱动模型看成是NT驱动模型的延伸。 设备的创建顺序…

一文掌握SpringBoot注解之@Configuration知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Flink 1.18.1的基本使用

系统示例应用 /usr/local/flink-1.18.1/bin/flink run /usr/local/flies/streaming/SocketWindowWordCount.jar --port 9010nc -l 9010 asd asd sdfsf sdf sdfsdagd sdf单次统计示例工程 cd C:\Dev\IdeaProjectsmvn archetype:generate -DarchetypeGroupIdorg.apache.flink -…