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. FastDFS依赖无法导入

    FastDFS依赖无法导入 fastdfs-client-java 导入爆红 <!-- FastDFS--> <dependency> <groupId>org.c ...

  2. markerdown基础

    标题 用#+空格 字体 加粗两边两个** 斜体两边* 斜体加粗三个* 引用 '>' 分割线 三个---或者三个*** 图片 ![截图]() 超链接 点击跳转到文章 []+() 列表 1 + 点+ ...

  3. 关于flume中涉及到时间戳的错误解决,Expected timestamp in the Flume even

    在搭建flume集群收集日志写入hdfs时发生了下面的错误: java.lang.NullPointerException: Expected timestamp in the Flume event ...

  4. 笔记本用HDMI转VGA 使用双屏办公 听语音

    笔记本用HDMI转VGA 使用双屏办公 听语音 原创 | 浏览:1212 | 更新:2019-11-12 12:16 1 2 3 4 5 6 7 分步阅读 笔记本使用 转接头扩展出一块屏幕.使用多屏办 ...

  5. Python基础之PyCharm快捷键大全

    Pycharm中打开Help->Keymap Reference可查看默认快捷键帮助文档 一.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + A ...

  6. JavaWeb Session 状态管理

    引言 HTTP 协议是一个无状态的协议,简单理解就是两次请求/响应无法记录或保存状态信息.但是动态 Web 项目开发是需要保存请求状态的,比如用户的登录状态,但 HTTP 协议层不支持状态保存,所以需 ...

  7. javascript数组排序之冒泡排序

    冒泡排序 作为一名程序员数组的排序算法是必须要掌握的,今天来说最简单的一种数组排序----冒泡排序 冒泡排序原理 冒泡排序算法是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如 ...

  8. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视频 ...

  9. ARM CPU自动调度神经网络

    ARM CPU自动调度神经网络 对特定设备和工作负载进行自动调度,对于获得最佳性能至关重要.通过RPC使用自动调度器为ARM CPU调度整个神经网络. 为了自动调度神经网络,将网络划分为小的子图,进行 ...

  10. MindSpore部署图像分割示例程序

    MindSpore部署图像分割示例程序 本端侧图像分割Android示例程序使用Java实现,Java层主要通过Android Camera 2 API实现摄像头获取图像帧,进行相应的图像处理,之后调 ...