Kudu基本操作及概念
Kudu:
针对 Apache Hadoop 平台而开发的列式存储管理器。
使用场景:
适用于那些既有随机访问,也有批量数据扫描的复合场景。
高计算量的场景。
使用了高性能的存储设备,包括使用更多的内存。
支持数据更新,避免数据反复迁移。
支持跨地域的实时数据备份和查询。
kudu的关键机制:
1.模仿数据库,以二维表的形式组织数据,创建表的时候需要指定schema。所以只支持结构化数据。
2.每个表指定一个或多个主键。
3.支持insert/update/delete,这些修改操作全部要指定主键。
4.read操作,只支持scan原语。
5.一致性模型,默认支持snapshot ,这个可以保证scan和单个客户端 read-you-writes一致性保证。更强的一致性保证,提供manually propagate timestamps between clients或者commit-wait。
6.cluster类似hbase简单的M-S结构,master支持备份。
7.单个表支持水平分割,partitions叫tablets,单行一定在一个tablets里面,支持范围,以及list等更灵活的分区键。
8.使用Raft 协议,可以根据SLA指定备份块数量。
9.列式存储
10.delta flushes,数据先更新到内存中,最后在合并到最终存储中,有专门到后台进程负责。
11.Lazy Materialization ,对一些选择性谓词,可以帮助跳过很多不必要的数据。
12.支持和MR/SPARK/IMPALA等集成,支持Locality ,Columnar Projection ,Predicate pushdown 等。
注意:
1、建表的时候要求所有的tserver节点都活着
2、根据raft机制,允许(replication的副本数-)/ 2宕掉,集群还会正常运行,否则会报错找不到ip:7050(7050是rpc的通信端口号),需要注意一个问题,第一次运行的时候要保证集群处于正常状态下,也就是所有的服务都启动,如果运行过程中,允许(replication的副本数-)/ 2宕掉
3、读操作,只要有一台活着的情况下,就可以运行
maven 依赖:
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-spark2_2.11</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.0</version>
</dependency> <dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client-tools</artifactId>
<version>1.7.0</version>
</dependency>
Java 代码:
import org.apache.kudu.ColumnSchema;
import org.apache.kudu.Schema;
import org.apache.kudu.Type;
import org.apache.kudu.client.*;
import org.apache.kudu.spark.kudu.KuduContext;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.junit.Test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* @Author:Xavier
* @Data:2019-02-22 09:25
**/ public class KuduOption {
// master地址
private static final String KUDU_MASTER = "nn02:7051"; private static String tableName = "KuduTest"; //创建表
@Test
public void CreateTab() {
// 创建kudu的数据库链接
KuduClient client = new KuduClient.KuduClientBuilder(KUDU_MASTER).build(); try {
// 设置表的schema(模式)
List<ColumnSchema> columns = new ArrayList(2);
columns.add(new ColumnSchema.ColumnSchemaBuilder("key", Type.STRING).key(true).build());
columns.add(new ColumnSchema.ColumnSchemaBuilder("value", Type.STRING).build());
Schema schema = new Schema(columns); //创建表时提供的所有选项
CreateTableOptions options = new CreateTableOptions(); // 设置表的replica备份和分区规则
List<String> rangeKeys = new ArrayList<>();
rangeKeys.add("key"); // 一个replica
options.setNumReplicas(1);
// 用列rangeKeys做为分区的参照
options.setRangePartitionColumns(rangeKeys);
client.createTable(tableName, schema, options); // 添加key的hash分区
//options.addHashPartitions(parcols, 3);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
} //向表内插入新数据
@Test
public void InsertData() {
// 创建kudu的数据库链接
KuduClient client = new KuduClient.KuduClientBuilder(KUDU_MASTER).build();
try {
// 打开表
KuduTable table = client.openTable(tableName);
// 创建写session,kudu必须通过session写入
KuduSession session = client.newSession(); // 采取Flush方式 手动刷新
session.setFlushMode(SessionConfiguration.FlushMode.MANUAL_FLUSH);
session.setMutationBufferSpace(3000); System.out.println("-------start--------" + System.currentTimeMillis()); for (int i = 1; i < 6100; i++) {
Insert insert = table.newInsert();
// 设置字段内容
PartialRow row = insert.getRow();
row.addString("key", i+"");
row.addString(1, "value"+i);
session.flush();
session.apply(insert);
}
System.out.println("-------end--------" + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace(); } finally {
try {
client.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
} //更新数据
@Test
public void kuduUpdateTest() {
// 创建kudu的数据库链接
KuduClient client = new KuduClient.KuduClientBuilder(KUDU_MASTER).build();
try {
KuduTable table = client.openTable(tableName);
KuduSession session = client.newSession(); Update update = table.newUpdate();
PartialRow row = update.getRow(); //
row.addString("key", 998 + "");
row.addString("value", "updata Data " + 10);
session.flush();
session.apply(update); // System.out.print(operationResponse.getRowError()); } catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
} } //根据主键删除数据
@Test
public void deleteData(){
KuduClient client=new KuduClient.KuduClientBuilder(KUDU_MASTER).build();
try {
KuduTable table=client.openTable(tableName);
KuduSession session=client.newSession(); Delete delete=table.newDelete();
PartialRow row=delete.getRow();
row.addString("key","992"); session.apply(delete);
} catch (KuduException e) {
e.printStackTrace();
}
} //扫描数据
@Test
public void SearchData() {
// 创建kudu的数据库链接
KuduClient client = new KuduClient.KuduClientBuilder(KUDU_MASTER).build(); try {
KuduTable table = client.openTable(tableName); List<String> projectColumns = new ArrayList<>(1);
projectColumns.add("value");
KuduScanner scanner = client.newScannerBuilder(table)
.setProjectedColumnNames(projectColumns)
.build();
while (scanner.hasMoreRows()) {
RowResultIterator results = scanner.nextRows();
while (results.hasNext()) {
RowResult result = results.next();
System.out.println(result.getString(0));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
} //条件扫描数据
@Test
public void searchDataByCondition(){
KuduClient client =new KuduClient.KuduClientBuilder(KUDU_MASTER).build(); try {
KuduTable table=client.openTable(tableName); KuduScanner.KuduScannerBuilder scannerBuilder=client.newScannerBuilder(table); //设置搜索的条件
KuduPredicate predicate=KuduPredicate.
newComparisonPredicate(
table.getSchema().getColumn("key"),//设置要值的谓词(字段)
KuduPredicate.ComparisonOp.EQUAL,//设置搜索逻辑
"991");//设置搜索条件值
scannerBuilder.addPredicate(predicate); // 开始扫描
KuduScanner scanner=scannerBuilder.build();
while(scanner.hasMoreRows()){
RowResultIterator iterator=scanner.nextRows();
while(iterator.hasNext()){
RowResult result=iterator.next();
System.out.println("输出: "+result.getString(0)+"--"+result.getString("value"));
}
}
} catch (KuduException e) {
e.printStackTrace();
}
} //删除表
@Test
public void DelTab() {
KuduClient client = new KuduClient.KuduClientBuilder(KUDU_MASTER).build();
try {
client.deleteTable(tableName);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
client.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
} //
@Test
public void searchBysparkSql() {
SparkSession sparkSession = getSparkSession();
List<StructField> fields = Arrays.asList(
DataTypes.createStructField("key", DataTypes.StringType, true),
DataTypes.createStructField("value", DataTypes.StringType, true));
StructType schema = DataTypes.createStructType(fields);
Dataset ds = sparkSession.read().format("org.apache.kudu.spark.kudu").
schema(schema).option("kudu.master", "nn02:7051").option("kudu.table", "KuduTest").load();
ds.registerTempTable("abc");
sparkSession.sql("select * from abc").show();
} @Test
public void checkTableExistByKuduContext() {
SparkSession sparkSession = getSparkSession();
KuduContext context = new KuduContext("172.19.224.213:7051", sparkSession.sparkContext());
System.out.println(tableName + " is exist = " + context.tableExists(tableName));
} public SparkSession getSparkSession() {
SparkConf conf = new SparkConf().setAppName("test")
.setMaster("local[*]")
.set("spark.driver.userClassPathFirst", "true"); conf.set("spark.sql.crossJoin.enabled", "true");
SparkContext sparkContext = new SparkContext(conf);
SparkSession sparkSession = SparkSession.builder().sparkContext(sparkContext).getOrCreate();
return sparkSession;
}
}
Kudu基本操作及概念的更多相关文章
- 【原创】大数据基础之Kudu(1)简介、安装、使用
kudu 1.7 官方:https://kudu.apache.org/ 一 简介 kudu有很多概念,有分布式文件系统(HDFS),有一致性算法(Zookeeper),有Table(Hive Tab ...
- java基础知识 多线程
package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...
- 【VB超简单入门】五、基本输出输入
之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...
- Python vtk学习(1)
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...
- BG.Hive - part1
1. Hive架构 What is hive? Facebook,https://en.wikipedia.org/wiki/Apache_Hive a> 一种工具,可以通过SQL轻松的访问数据 ...
- SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )
SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需.SQL数据库有很多,MySQL是一种,本文基本都是SQ ...
- Iptables指南教程收集
iptables对于任何Linux基本都适用,虽然在最新版的CentOS 7和Ubuntu上已经有代替的工具来简化iptables,但是最终还是会把规则写入iptables中. 读教程前先阅读ipta ...
- 看动画学算法之:doublyLinkedList
目录 简介 doublyLinkedList的构建 doublyLinkedList的操作 头部插入 尾部插入 插入给定的位置 删除指定位置的节点 简介 今天我们来学习一下复杂一点的LinkedLis ...
- Monogb基本概念及基本操作
MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...
随机推荐
- 使用plot_importance绘制特征重要性曲线
代码如下所示: # -*- coding: utf-8 -*- #导入需要的包 import matplotlib.pyplot as plt from sklearn import datasets ...
- The component and implementation of a basic gradient descent in python
in my impression, the gradient descent is for finding the independent variable that can get the mini ...
- linux gcc 静态 动态链接库
静态链接库 首先生成依赖函数的目标文件 gcc -c source1.c source2.c; 然后归档目标文件到静态库 ar -rcs libYourID.a obj1.o obj2.o; 然后我们 ...
- IntelliJ IDEA神器使用技巧 慕课
1,高效定位代码:无处不在的跳转. 项目之间的跳转(打开了多个窗口):ctrl+alt+] 或ctrl+alt+[ 查找窗口 shift+ctrl+a 输入recent file 最近打开的文件. ...
- VUE系列一:VUE入门:搭建脚手架CLI(新建自己的一个VUE项目)
一.VUE脚手架介绍 官方说明:Vue 提供了一个官方的 CLI,为单页面应用快速搭建 (SPA) 繁杂的脚手架.它为现代前端工作流提供了 batteries-included 的构建设置.只需要几分 ...
- Centos7下Rinetd安装与应用(转)
Linux下做地址NAT有很多种方法.比如haproxy.nginx的4层代理,linux自带的iptables等都能实现.haproxy.nginx就不说了,配置相对简单:iptables配置复杂, ...
- Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGo
Linux,最早由Linus Benedict Torvalds在1991年开始编写.在这之前,Richard Stallman创建了Free Software Foundation(FSF)组织以及 ...
- MVC ScriptBundle自定义排序。
今天发现MVC的ScriptBundle @Scripts.Render()后是按照我也不知道顺序显示在页面上的,后果就是jquery.min.js被排在了后面(反正我下面那堆默认jquery.min ...
- tornado 基于MongoDB存储 session组件开发
1.开发伊始 根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件 2.开发实现 ...
- 爬虫之进阶 twisted
简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...