将Flink计算完毕后的数据Sink到Nebula
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的更多相关文章
- 如何用Flink把数据sink到kafka多个(成百上千)topic中
需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...
- 如何用Flink把数据sink到kafka多个不同(成百上千)topic中
需求与场景 上游某业务数据量特别大,进入到kafka一个topic中(当然了这个topic的partition数必然多,有人肯定疑问为什么非要把如此庞大的数据写入到1个topic里,历史留下的问题,现 ...
- 使用flume将kafka数据sink到HBase【转】
1. hbase sink介绍 1.1 HbaseSink 1.2 AsyncHbaseSink 2. 配置flume 3. 运行测试flume 4. 使用RegexHbaseEventSeriali ...
- Flink学习笔记-新一代Flink计算引擎
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- 6.Flink实时项目之业务数据分流
在上一篇文章中,我们已经获取到了业务数据的输出流,分别是dim层维度数据的输出流,及dwd层事实数据的输出流,接下来我们要做的就是把这些输出流分别再流向对应的数据介质中,dim层流向hbase中,dw ...
- SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good
一 前言 首先要澄清一下名字的混淆: 1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用. 2 IETF( ...
- 探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB
探索Oracle之数据库升级七 11gR2 to 12c 升级完毕后插入PDB 前言: 从Oracle 12c開始,引入了容器数据库的概念,能够实现数据库插拔操作,例如以下图: 如今我们 ...
- 数据库主库从库宕机重启后binlog数据同步
由于阿里云经典网络迁移到专用网络,一不小心没有先预备方案调整网段, 导致实例无法以内网IP形式访问数据库,被迫进行数据库停机后网络网段调整,导致宕机了几个小时...被客户各种投诉爆了.. 基于这次数据 ...
- C# 本进程执行完毕后再执行下一线程
最近做了一套MES集成系统,由上料到成品使自动化运行,其中生产过程是逐步的,但是每一个动作都需要独立的线程进行数据监听,那么就需要实现线程等待. 代码: using System; using Sys ...
随机推荐
- 技能Get·将浏览器已安装程序打包
阅文时长 | 0.51分钟 字数统计 | 820字符 主要内容 | 1.前言&环境说明&预备知识 2.详细步骤 3.声明与参考资料 『技能Get·将浏览器已安装程序打包』 编写人 | ...
- Windows系统下consul的安装、启动、配置
阅读时长:3分钟 操作系统:Windows10 一.consul的安装 首先在consul.exe文件目录下的地址栏中输入cmd. 接着输入consul指令,敲击回车安装consul. 安装成功后会有 ...
- Linux GCC lib库相互引用,互相依赖(交叉引用)链接解决办法
Linux GCC中,如果lib a依赖b,b又依赖a,链接的时候无论a放在前,还是b放在前,都会提示unrefrence. 解决办法就是: 链接的时候a链接两次,即: -la -lb -la
- Mycat调优启用useOffHeapForMerge报java.lang.NumberFormatException异常解决(附源码)
come from : https://blog.csdn.net/u013716179/article/details/89886452
- 利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶
一.准备!!! 1.使用拥有足够权限的IAM账号登录AWS控制台 2.创建S3存储桶,给存储桶命名如"my-bucket"(如果使用已有存储桶,本步骤可略过) 3.有该S3存储桶访 ...
- Linux中的防火墙
firewalld 一.防火墙安全概述 firewalld支持命令行也支持GUI设置,相对于iptables,firewalld配置更加的方便.在底层的命令都是iptables, firewalld ...
- 关于STM32的可编程电压检测器的使用方法
关于STM32的可编程电压检测器的使用方法 思维导图总览: 代码: 1 #include "sys.h" 2 #include "delay.h" 3 #inc ...
- Git 分支基本命令
1. 查看当前分支 (git branch) 2. 创建分支 (git branch 分支名) 3.切换分支(git checkout 分支名) 4.分支上的常规操作 5.分支的合并 (git che ...
- GO学习-(36) Go语言在select语句中实现优先级
Go语言在select语句中实现优先级 Go语言在select语句中实现优先级 select语句介绍 Go 语言中的 select语句用于监控并选择一组case语句执行相应的代码.它看起来类似于swi ...
- Go语言标准库log介绍
Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实现了简单的日志服 ...