Flink是目前流计算的隐形王者,在国际国内有有庞大的拥趸。

Nebula是国产图数据库的后起之秀,在DBEngines中排名也逐年上升。

将两者进行结合,可以产生很多应用场景:比如实时计算服务链路调用关系并将结果存到Nebula中、实时计算业务访问风控情况并将结果存到Nebula中、实时计算预警发生情况并将结果存到Nebula中等。

将Flink计算完毕后的结果,Sink到Nebula,Nebula官方提供了一个Flink Connector,但是很不易用。

笔者根据项目实际应用情况,写了一个更简洁直接的Sink,作为抛砖引玉,欢迎各位Flink及Nebula爱好者共同交流。

一、NebulaUtil

由于Nebula提供的Java Client是非线程安全的,所以我们首先封装一个单例的NebulaUtil,主要代码如下:

import lombok.val;
import lombok.var;
/**
* Nebula工具类
*/
public class NebulaUtil {
// Nebula会话
private Session session = null;
// Nebula连接池
private NebulaPool pool = new NebulaPool();/**
* 获得Nebula工具类单例
*
* @return NebulaUtil
*/
public static NebulaUtil getInstance() {
return NebulaUtilHolder.instance;
} /**
* 执行NGQL
*
* @param nGQL NGQL
* @return 返回执行结果
*/
public ResultSet execute(String nGQL) {
try {
if (session != null) {
return session.execute(nGQL);
}
} catch (IOErrorException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} return null;
}
/**
* 释放会话
*/
public void releaseSession() {
// 释放连接
if (session != null) {
session.release();
} // 关闭连接池
pool.close();
} private static class NebulaUtilHolder {
private static final NebulaUtil instance = new NebulaUtil();
} private NebulaUtil() {
initSession();
} /**
* 初始化会话
*/
private void initSession() {// 连接地址,多个间用逗号“,”隔开
val host = "127.0.0.1";
val port = 9669;
val user = "user";
val password = "password";
val space = "MySpace"; var nebulaPoolConfig = new NebulaPoolConfig();
nebulaPoolConfig.setMaxConnSize(100); var hostAddressList = new ArrayList<HostAddress>(); val hostArray = host.split(","); for (val hostAddress : hostArray) {
hostAddressList.add(new HostAddress(hostAddress, port));
} try {
pool.init(hostAddressList, nebulaPoolConfig);
} catch (UnknownHostException e) {
e.printStackTrace();
} try {
session = pool.getSession(user, password, false);
} catch (NotValidConnectionException e) {
e.printStackTrace();
} catch (IOErrorException e) {
e.printStackTrace();
} catch (AuthFailedException e) {
e.printStackTrace();
} // 切换图空间
val resp = execute(String.format("USE %s;", space)); if (resp == null || !resp.isSucceeded()) {
System.out.println("切换图空间失败!" + space);
}
}
}

二、NebulaSink

有了NebulaUtil,实现NebulaSink就非常简单了,每个方法里只有几行代码:

import lombok.val;/**
* Sink到Nebula数据库
*/
public class NebulaSink extends RichSinkFunction<List<String>> {
/**
* 打开连接
*
* @param parameters 配置参数
*/
@Override
public void open(Configuration parameters) {
} /**
* 调用
*
* @param nGQLList NGQL列表
* @param context 上下文
*/
@Override
public void invoke(List<String> nGQLList, Context context) {
for (val nGQL : nGQLList) {
NebulaUtil.getInstance().execute(nGQL);
}
} /**
* 关闭连接
*/
@Override
public void close() throws Exception {
super.close(); NebulaUtil.getInstance().releaseSession();
}
}

三、将Vertex及Edge数据组装成NGQL语句

有了NebulaUtil以及NebulaSink后,Sink到Nebula之前,我们主要的工作就是将Vertex及Edge数据,组装对应的NGQL语句即可。

将Flink计算完毕后的数据Sink到Nebula的更多相关文章

  1. 如何用Flink把数据sink到kafka多个(成百上千)topic中

    需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...

  2. 如何用Flink把数据sink到kafka多个不同(成百上千)topic中

    需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...

  3. 使用flume将kafka数据sink到HBase【转】

    1. hbase sink介绍 1.1 HbaseSink 1.2 AsyncHbaseSink 2. 配置flume 3. 运行测试flume 4. 使用RegexHbaseEventSeriali ...

  4. Flink学习笔记-新一代Flink计算引擎

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

  5. 6.Flink实时项目之业务数据分流

    在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...

  6. SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good

    一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用. 2 IETF( ...

  7. 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB

    探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB 前言:        从Oracle 12c開始,引入了容器数据库的概念,能够实现数据库插拔操作,例如以下图: 如今我们 ...

  8. 数据库主库从库宕机重启后binlog数据同步

    由于阿里云经典网络迁移到专用网络,一不小心没有先预备方案调整网段, 导致实例无法以内网IP形式访问数据库,被迫进行数据库停机后网络网段调整,导致宕机了几个小时...被客户各种投诉爆了.. 基于这次数据 ...

  9. C# 本进程执行完毕后再执行下一线程

    最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...

随机推荐

  1. queryset惰性与缓存

    https://blog.csdn.net/zhu6201976/article/details/83550461

  2. mysql多线程备份与还原工具mydumper

    (一)mydumper介绍 之前我们已经学过如何使用mysqldump备份恢复数据库:<mysql逻辑备份与还原工具mysqldump>,就目前来说,mysqldump是使用最广泛的MyS ...

  3. golang:TCP总结

    在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程."IP地址+端口号"就对应一个socket.欲建立连接的两个进程各自有一个 ...

  4. [Qt] 信号和槽

    信号与槽:是一种对象间的通信机制 观察者模式:当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就 ...

  5. Hive 默认分隔符

    引言 Hive 中的默认分隔符是 ^A (\001) ,这是一种特殊的分隔符,使用的是 ASCII 编码的值,键盘是打不出来的 查看 Hive 默认分隔符文件 Linux 上的文件 以 \001 作为 ...

  6. IT菜鸟之虚拟机VMware的安装

    老师说过,如果想学好Linux,最好不要在实体机上安装Linux,因为学习需要经常折腾,在实体机上做实验,出现故障就要重新安装,这样绝大多数时间都会浪费在安装上. 这时我们需要一个工具,它就是虚拟机. ...

  7. 分布式存储ceph---部署ceph(2)

    一.部署准备 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用: 1台部署节点(配一块硬盘,运行ceph-depoly) 3 ...

  8. 5.6 date:显示与设置系统时间

    date命令 用于显示当前的系统时间或设置系统时间. date [选项] +[日期格式]   date命令的参数选项及说明 OPTION参数选项-d 时间字符串 显示指定字符串所描述的时间,而非当前时 ...

  9. pyqt安装

    一.安装PyQt5 pip install PyQt5 二.安装PyQt-tools pip install PyQt-tools *注:mac不需要安装PyQt-tools,能够正常使用,只支持Wi ...

  10. Crontab 的使用方法

    第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4列月1-12第5列星期0-6(0表示星期天)第6列要运行的命令 下面是crontab的格式:分 时 日 月 星期 要运行的命令 这 ...