1.概述

Apache官方发布HBase2已经有一段时间了,HBase2中包含了许多个Features,从官方JIRA来看,大约有4500+个ISSUES(查看地址),从版本上来看是一个非常大的版本了。本篇博客将为大家介绍HBase2的新特性,以及如何在实战中与Flink、Kafka等组件进行整合。

2.内容

HBase2有哪些新特性值得我们去关注,这里给大家列举部分特定。

2.1 部分新特性预览

2.1.1 Region分配优化

在HBase中遇到比较频繁的问题就是RIT问题,而在新特性中,对于Region的管理和分配有了新的调整。AssignmentManager基于ProcedureV2实现,可以快速的分配Region,另外维护Region的State存储不再依赖Zookeeper,能够更好的面对Region长时间的RIT问题。

具体参考JIRA单:[HBASE-14614]、[HBASE-17844]、[HBASE-14350]

2.1.2 Offheap优化

在HBase2中减少了对Heap内存的使用,改为Offheap内存,减少垃圾的产生,以及减少GC的停顿时间。

参考JIRA单:[HBASE-11425]

2.1.3 Compaction优化

在HBase2中,引入了MemStore新的实现类CompactingMemstore,这个类和默认的DefaultMemStore类的区别在于实现了在内存中进行Compaction。

CompactingMemstore中,数据是通过Segment作为单位进行组织的,一个MemStore中包含多个Segment。数据最开始写入时会进入到一个处理Active状态的Segment中,这个Segment是可以被修改的。当该Active状态的Segment中的数据达到阀值后,不是直接Flush到HDFS的HFile文件中,而是先Flush到内存中的一个不可修改的Segment中。CompactingMemstore会在后台将多个不可修改的Segment合并为一个更大、更紧凑的Segment。

如果RegionServer需要把MemStore中的数据Flush到磁盘,会先选择其他类型的MemStore,然后在选择CompactingMemstore。这是由于CompactingMemstore对内存的管理更加高效,所以延长CompactingMemstore的生命周期可以减少总的I/O。当CompactingMemstore被Flush到磁盘时,不可修改的Segment会被移到一个快照中进行合并,然后写入HFile。

参考JIRA单:[HBASE-15991]

2.1.4 RegionServer Group

在引入RegionServer Group之前,HBase默认使用StochasticLoadBalancer策略将表的Region移到到RegionServer里面。在HBase2中,可以将RegionServer划分到多个逻辑组中,这样可以提供多租户的能力。

参考JIRA单:[HBASE-6721]、[HBASE-16430]、[HBASE-17589]、[HBASE-17350]、[HBASE-17349]

2.1.5 Add new AsyncRpcClient

在HBase2中,客户端请求改为异步RPC机制,不再是同步Wait,这样能大大有效的提高客户端请求的并发量,有效的提高资源利用率。

参考JIRA单:[HBASE-13784]、[HBASE-12684]

3.实战整合

了解了HBase2的一些新特性之后,如何将HBase2运用到实际项目中去,下面将为大家介绍如何将HBase整合到Flink和Kafka中。数据流向如下图所示:

3.1 基础环境

整合环境如下所示:

  • JDK1.8
  • HBase-2.1.1
  • Flink-1.7.1
  • Kafka-2.1.0

3.1.1 依赖JAR

整合实战项目,需要依赖的JAR信息如下:

<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.11_2.12</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-hbase_2.12</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-core</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.4</version>
</dependency>

建议使用Maven来管理,可以很方便的将上述依赖信息配置到pom.xml文件中。

3.2 数据准备

准备数据源,将数据写入到Kafka集群,通过Flink进行消费,进行业务逻辑处理,然后将处理后的结果写入到HBase进行落地。数据准备的实现代码如下:

public class JProducer extends Thread {

    public static void main(String[] args) {
JProducer jproducer = new JProducer();
jproducer.start();
} @Override
public void run() {
producer();
} private void producer() {
Properties props = config();
Producer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 10; i++) {
String json = "{\"id\":" + i + ",\"ip\":\"192.168.0." + i + "\",\"date\":" + new Date().toString() + "}";
String k = "key" + i;
producer.send(new ProducerRecord<String, String>("flink_topic", k, json));
}
producer.close();
} private Properties config() {
Properties props = new Properties();
props.put("bootstrap.servers", "dn1:9092,dn2:9092,dn3:9092");
props.put("acks", "1");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("partitioner.class", "org.smartloli.kafka.connector.flink.producer.TestSimplePartitioner");
return props;
}
}

通过上述应用程序,将生产的消息数据写入到Kafka的Topic中,准备好数据源。

3.3 处理数据并落地到HBase

使用Flink消费Kafka集群中刚刚准备好的数据源,然后进行逻辑处理后,将结果写入到HBase集群进行存储,具体实现代码如下:

public class FlinkHBase {

    private static String zkServer = "dn1,dn2,dn3";
private static String port = "2181";
private static TableName tableName = TableName.valueOf("testflink");
private static final String cf = "ke";
private static final String topic = "flink_topic"; public static void main(String[] args) {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(1000);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); DataStream<String> transction = env.addSource(new FlinkKafkaConsumer010<String>(topic, new SimpleStringSchema(), configByKafka()));
transction.rebalance().map(new MapFunction<String, Object>() {
private static final long serialVersionUID = 1L; public String map(String value) throws IOException {
write2HBase(value);
return value;
}
}).print();
try {
env.execute();
} catch (Exception ex) {
ex.printStackTrace();
}
} public static Properties configByKafka() {
Properties props = new Properties();
props.put("bootstrap.servers", "dn1:9092,dn2:9092,dn3:9092");
props.put("group.id", "kv_flink");
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
return props;
} public static void write2HBase(String value) throws IOException {
Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", zkServer);
config.set("hbase.zookeeper.property.clientPort", port);
config.setInt("hbase.rpc.timeout", 30000);
config.setInt("hbase.client.operation.timeout", 30000);
config.setInt("hbase.client.scanner.timeout.period", 30000); Connection connect = ConnectionFactory.createConnection(config);
Admin admin = connect.getAdmin();
if (!admin.tableExists(tableName)) {
admin.createTable(new HTableDescriptor(tableName).addFamily(new HColumnDescriptor(cf)));
}
Table table = connect.getTable(tableName);
TimeStamp ts = new TimeStamp(new Date());
Date date = ts.getDate();
Put put = new Put(Bytes.toBytes(date.getTime()));
put.addColumn(Bytes.toBytes(cf), Bytes.toBytes("test"), Bytes.toBytes(value));
table.put(put);
table.close();
connect.close();
}
}

将该应用程序提交到Flink集群,通过Flink消费Kafka集群中的数据,成功执行该应用程序后,可以到HBase集群进行验证,看数据是否有写入成功。

3.4 数据验证

进入到HBase集群,执行hbase shell命令进入到Console界面,然后执行如下命令查看数据是否有写入成功:

hbase(main):009:0> scan 'testflink',LIMIT=>2

执行上述命令,结果如下所示:

4.总结

HBase2发布的新特性很有必要去研究和剖析,对于优化HBase集群或多或少有些许帮助。通过研究这些新特性,来帮助我们有效的应用到实战项目中。

5.结束语

这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

另外,博主出书了《Kafka并不难学》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。

HBase2实战:HBase Flink和Kafka整合的更多相关文章

  1. Flink-Kafka-Connector Flink结合Kafka实战

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  2. Flink+Kafka整合的实例

    Flink+Kafka整合实例 1.使用工具Intellig IDEA新建一个maven项目,为项目命名为kafka01. 2.我的pom.xml文件配置如下. <?xml version=&q ...

  3. Flink的sink实战之二:kafka

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. Flink消费Kafka到HDFS实现及详解

    1.概述 最近有同学留言咨询,Flink消费Kafka的一些问题,今天笔者将用一个小案例来为大家介绍如何将Kafka中的数据,通过Flink任务来消费并存储到HDFS上. 2.内容 这里举个消费Kaf ...

  5. 【转】Kafka实战-Flume到Kafka

    Kafka实战-Flume到Kafka Kafka   2015-07-03 08:46:24 发布 您的评价:       0.0   收藏     2收藏 1.概述 前面给大家介绍了整个Kafka ...

  6. flume与kafka整合

    flume与kafka整合 前提: flume安装和测试通过,可参考:http://www.cnblogs.com/rwxwsblog/p/5800300.html kafka安装和测试通过,可参考: ...

  7. 5 kafka整合storm

    本博文的主要内容有 .kafka整合storm   .storm-kafka工程  .storm + kafka的具体应用场景有哪些? 要想kafka整合storm,则必须要把这个storm-kafk ...

  8. hbase安装配置(整合到hadoop)

    hbase安装配置(整合到hadoop) 如果想详细了解hbase的安装:http://abloz.com/hbase/book.html 和官网http://hbase.apache.org/ 1. ...

  9. 【转】Spark Streaming和Kafka整合开发指南

    基于Receivers的方法 这个方法使用了Receivers来接收数据.Receivers的实现使用到Kafka高层次的消费者API.对于所有的Receivers,接收到的数据将会保存在Spark ...

随机推荐

  1. 展开被 SpringBoot 玩的日子 《 一 》入门篇

    SpringBoot 已经是久闻大名了,因各种原因导致迟迟未展开学习SpringBoot,今天,我将会逐渐展开被SpringBoot 玩的历程,有兴趣的,可以跟我一起来~~~~~~~ 什么是sprin ...

  2. 第k个素因子只有3 5 7 的数

    题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测试样例: 3 返回:7 int findKth(int ...

  3. #工具 Intellij IDEA中自定义的Maven Archetype管理

    背景,手贱在输入自定义的 archetype时后面多输入了一个空格 解决:自定义的Archetype 会保存在Windows下面的文件中 C:\Users\<user>\.IntelliJ ...

  4. ZOJ4043 : Virtual Singers

    将所有$A$和$B$混在一起排序,那么每个$B$要匹配一个$A$,从左往右依次考虑每个数: 如果是一个$B$: 如果左边没有多余的$A$,那么将其放入堆$q_C$中,表示这个$B$还未匹配. 否则选择 ...

  5. jquery固定表头和列头

    1.对网上的开源方法稍作了些修改 <script type="text/javascript">// <![CDATA[ function FixTable(Ta ...

  6. python学习:元组和嵌套

    tuple(元组):只是可读,不可以修改# tup1 = () #空元组# tup2 = (20,) #元组内有一个元素,需要在元素后添加逗号 a = (1,2,3,4)print(a[1])a[1] ...

  7. java常用数据类型使用Day008

    1,java常用数据类型使用 package cn.edu.fhj.day008; import java.util.ArrayList; import java.util.HashMap; impo ...

  8. Android手机ROM刷机简介

    这一段时间刷了一堆ROM,安卓系列.CM.Hero.OldMos.隔壁新出的Android2.0,反正都尝了一下鲜,手机的照相机也刷得再也启不来了(不知道什么原因,杯具).有话说:"久病成良 ...

  9. Jvm 内存模型 —— GC

    一.Jvm 原理 二.Jvm 运行时数据区( Run-Time Data Areas ) (主要是关于 non-stack 区域的详细划分) 从上图可以清楚地看到:程序计数器.Jvm 栈.本地方法栈 ...

  10. CentOS7 防火墙(firewall)的操作命令(转)

    安装:yum install firewalld 1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firew ...