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. 使用plot_importance绘制特征重要性曲线

    代码如下所示: # -*- coding: utf-8 -*- #导入需要的包 import matplotlib.pyplot as plt from sklearn import datasets ...

  2. 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 ...

  3. linux gcc 静态 动态链接库

    静态链接库 首先生成依赖函数的目标文件 gcc -c source1.c source2.c; 然后归档目标文件到静态库 ar -rcs libYourID.a obj1.o obj2.o; 然后我们 ...

  4. IntelliJ IDEA神器使用技巧 慕课

    1,高效定位代码:无处不在的跳转. 项目之间的跳转(打开了多个窗口):ctrl+alt+] 或ctrl+alt+[ 查找窗口 shift+ctrl+a  输入recent file 最近打开的文件. ...

  5. VUE系列一:VUE入门:搭建脚手架CLI(新建自己的一个VUE项目)

    一.VUE脚手架介绍 官方说明:Vue 提供了一个官方的 CLI,为单页面应用快速搭建 (SPA) 繁杂的脚手架.它为现代前端工作流提供了 batteries-included 的构建设置.只需要几分 ...

  6. Centos7下Rinetd安装与应用(转)

    Linux下做地址NAT有很多种方法.比如haproxy.nginx的4层代理,linux自带的iptables等都能实现.haproxy.nginx就不说了,配置相对简单:iptables配置复杂, ...

  7. Linux发行版:CentOS、Ubuntu、RedHat、Android、Tizen、MeeGo

    Linux,最早由Linus Benedict Torvalds在1991年开始编写.在这之前,Richard Stallman创建了Free Software Foundation(FSF)组织以及 ...

  8. MVC ScriptBundle自定义排序。

    今天发现MVC的ScriptBundle @Scripts.Render()后是按照我也不知道顺序显示在页面上的,后果就是jquery.min.js被排在了后面(反正我下面那堆默认jquery.min ...

  9. tornado 基于MongoDB存储 session组件开发

    1.开发伊始 根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件 2.开发实现 ...

  10. 爬虫之进阶 twisted

    简介 Twisted是用Python实现的基于事件驱动的网络引擎框架.Twisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库.Twi ...