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基本操作及概念的更多相关文章

  1. 【原创】大数据基础之Kudu(1)简介、安装、使用

    kudu 1.7 官方:https://kudu.apache.org/ 一 简介 kudu有很多概念,有分布式文件系统(HDFS),有一致性算法(Zookeeper),有Table(Hive Tab ...

  2. java基础知识 多线程

    package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...

  3. 【VB超简单入门】五、基本输出输入

    之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...

  4. Python vtk学习(1)

    Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有 ...

  5. BG.Hive - part1

    1. Hive架构 What is hive? Facebook,https://en.wikipedia.org/wiki/Apache_Hive a> 一种工具,可以通过SQL轻松的访问数据 ...

  6. SQL快速入门 ( MySQL快速入门, MySQL参考, MySQL快速回顾 )

    SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需.SQL数据库有很多,MySQL是一种,本文基本都是SQ ...

  7. Iptables指南教程收集

    iptables对于任何Linux基本都适用,虽然在最新版的CentOS 7和Ubuntu上已经有代替的工具来简化iptables,但是最终还是会把规则写入iptables中. 读教程前先阅读ipta ...

  8. 看动画学算法之:doublyLinkedList

    目录 简介 doublyLinkedList的构建 doublyLinkedList的操作 头部插入 尾部插入 插入给定的位置 删除指定位置的节点 简介 今天我们来学习一下复杂一点的LinkedLis ...

  9. Monogb基本概念及基本操作

    MongoDB是面向文档的数据库. 索引:MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的.复合的和地理空间索引能力. 存储JavaScript:开发人员不必使用存储过程了,可以直接在 ...

随机推荐

  1. 使用Keras训练大规模数据集

    官方提供的.flow_from_directory(directory)函数可以读取并训练大规模训练数据,基本可以满足大部分需求.但是在有些场合下,需要自己读取大规模数据以及对应标签,下面提供一种方法 ...

  2. win10、Ubuntu14.04双系统正确卸载Ubuntu的方法

    参考博客:http://www.cnblogs.com/xia-Autumn/p/6294055.html 问题描述:由于python问题Ubuntu系统崩了,登录之后无法进入桌面.重装桌面时报错,无 ...

  3. java.lang.StackOverflowError

    在开发中经常会遇到内存溢出的情况,大部分原因是因为:代码中有死循环.过度递归等情况 解决办法:看报错 找到是因为死循环还是过度递归,改掉即可 我的报错原因是使用了 new Gson.().toJson ...

  4. MongoDB(3)--Java 操作 MongoDB 的 API

    引入mongoDb 依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-j ...

  5. 201772020113 李清华《面向对象程序设计(java)》第17周学习总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 2.实验内容和步骤 实验1:测试程序并进行代码注释. 测试程序1: l  在Elipse环境下调试教材651页程序 ...

  6. Verilog笔记——Verilog数字系统设计(第二版)夏宇闻

    本片记录Verilog学习笔记,主要是和以往用的C语言的不同之处,以例子.代码的形式记录.学习以<Verilog数字系统设计>(第二版)为参考资料,援助作者夏宇闻. 1. C语言和Veri ...

  7. Vsftpd服务重启、暂停命令

    VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全. 在使用Vsftp服务是经常需要启动.停 ...

  8. mount.cifs permission denied

    [root@dev ~]# mount.cifs //192.168.9.155/APP /mnt/APP/ -o user=administrator,pass=dsff#$TTT 在检查帐号密码权 ...

  9. 根据设备width(375)动态设置font-size

    根据html的font-size使用rem来优化移动端页面 (function () { var w = window, d = document.documentElement, t; var re ...

  10. 3.搭建Samba服务器

    1.在CentOS7上yum安装samba服务: yum -y install samba 2.目前我是直接共享已经存在的目录,如果您需要共享一个未曾创建的目录,需要您新创建一个目录: vim /et ...