本文章首发于博客园,转载请标明出处

经过前两篇文章(环境篇身份验证),我们已经有了nifi可以运行的基础,今天就来实现一个案例吧。

假设我们要从ftp上获取一个zip包,里面有两个csv文件,一个是manufacture.csv,一个是brand.csv.然后要把这两个文件导入到sqlserver数据库中。其中brand是manufacture的下一级,但是brand里没有manufacture的主键,必须要通过一些关键字段的匹配来找出它们。

在实现这个场景之前,我们需要认识一下nifi中的几个重要组件。

Processor : 主要用来处理flowfile,也就是我们的数据。nifi提供了上百个不同功能的processor,一般的需求都能满足。当然它也支持自定义processor,需要用java自行开发。

Processor Group :简单地理解就是把processor的流程组合成一个整体。只有Processor Group有version,所以它对于后续流程的迁移很重要。

Input Port,Output Port : 这两个主要是用于联接group.

有这些了解后就开始吧!

先看看流程的整体吧

  1. 首先拖拽一个group在画布中,并为这个group命名为Import,如下图



    双击group进入。再建一个group,命名为getfiles.这个group主要负责从ftp上获取文件,并解压。



    GetFTP:主要填以下几个属性。





    Delete Origianl默认为true,会删除ftp上的文件,所以最好设置为false.类似的Processor还有getfile,使用时一定要注意。

    因为我们获取的是一个zip包,所以需要解压。这个比较简单,默认就行了。如果压缩文件有密码,设置一下password属性就好了。



    接下来就有点复杂了。因为我们的manufacture和brand是要进不同的表,所以就要路由了。这里就要用到route的processor,我用的是RouteText,也可以用RouteOnAttribute,只是一些设置不同。后面我也会用到。



    添加了两个路由属性:fabricantes,modelos.这个名字你可以随便取。如果filename包含manufacture就走fabricantes分支,包含brand就走modelos分支。

    后面我做了一个延时,大家可以根据实际情况自由选择。这里我也介绍一下。



    先用UpdateAttribute添加一个属性delay,值为当前时间加20s.



    再用RouteOnAttribute来在规定时间内死循环,直到当前时间大于规定时间。

    最后用两个output port结束当前group.
  2. 将brand的数据存储到SQL SERVER的一张临时表里。



    建立一个group,名为tmp_barnd.这个group一开始必须是input port,用于接收上一个group传出的数据。

    SplitRecord:



    这里用到两个controller service: CSVReader,JsonRecordSetWriter.



    根据实际情况修改一下相应属性。我觉得比较重要的是Value Separator(默认是","但是很自定义的csv可能是";""),Character Set(默认是UTF-8,比如我的文档里有特殊符号,用的是ISO-8859-1)。



    因为是进数据库,所以为了防止SQL注入,需要先做一些准备工作。

    经过上一步,数据已经被拆分成一条条的json,现在就用EvaluateJsonPath提取相应的字段



    再用UpateAttribute组装成Sql语句需要的参数。关于sql.args.[*].type的值,请参考java.sql.Types



    最后就是执行SQL语句了。这里有很多选择,可以用PutSQL,ExcuteSQL等。



    SQL Statement是这样的:
点击查看代码
if not EXISTS (SELECT 1 FROM tmp_modelos
WHERE MODELO=? AND FABRICANTE=? AND DESCRIPCION=? AND TIPO_VEHICULO=?)
INSERT INTO tmp_modelos (MODELO, FABRICANTE, DESCRIPCION, DESCRIPCION_ADDICIONAL, TIPO_VEHICULO) VALUES (?, ?, ?, ?, ?);

?代表参数,有多少?,sql.args属性就相对有几个,否则执行时会报参数不匹配。

DBCPConnectionPool的设置如下:



整个流程上要用的processor和controller service差不多就是上面这些,剩下的就是大家按需求组合了。

我剩下两个group里的流程是这样的。

还有一个很重要的,就是nifi所用的表达式,大家可以参考一下官方文档

好了,至此,我们的流程就已经画完了。接下来就是运行调试了。下篇再见!

nifi从入门到实战(保姆级教程)——flow的更多相关文章

  1. ElasticSearch入门篇(保姆级教程)

    本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...

  2. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  3. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  4. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  5. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...

  6. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  7. nifi从入门到实战(保姆级教程)——环境篇

    背景: 公司领导决定将各种基础数据的导入从代码中分离出来,用Apache Nifi替换.使开发者们更关注在业务上,而不用关心基础的由来. Apache Nifi对于整个团队都是一个全新的工具,之前大家 ...

  8. nifi从入门到实战(保姆级教程)——身份认证

    上一篇我们搭建好了nifi的运行环境了 但是每次登陆那一串随机字符串的用户名和密码是不是让人很头疼,那是人类能记住的吗?当然不是!!!! 那么今天我们就来消灭这些难看又难记的字符串. windows( ...

  9. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!

    作者简介 Jimmy Guerrero,在开发者关系团队和开源社区拥有20多年的经验.他目前领导YugabyteDB的社区和市场团队. 本文来自Rancher Labs Longhorn是Kubern ...

随机推荐

  1. GO语言学习——基本数据类型字符串

    字符串 Go语言中的字符串以原生数据类型出现. Go 语言里的字符串的内部实现使用UTF-8编码. 字符串的值为双引号(")中的内容,可以在Go语言的源码中直接添加非ASCII码字符 GO语 ...

  2. Python标准库tempfile的使用总结

    Python标准库tempfile的使用总结 临时文件是计算机程序存储临时数据的文件,它的扩展名通常是".temp".本文用于记录使用Python提供的临时文件API解决实际问题的 ...

  3. RAID5加热备盘

    RAID 5加热备盘 RAID 10磁盘阵列中最多允许50%的硬盘设备发生故障,但是存在这样一种极端情况,即同一RAID 1磁盘阵列中的硬盘设备若全部损坏,也会导致数据丢失.换句话说,在RAID 10 ...

  4. CTO 说了,如果发现谁用 kill -9 关闭程序就开除

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 来源:blog.csdn.net/qq_33220089          正文    kil ...

  5. keepalived安装及配置文件详解

    一个执着于技术的公众号 在上一篇文章中,我们对Keepalived进行了简单入门学习: Keepalived入门学习 今天我们继续学习Keepalived服务. 一.安装Keepalived服务 两种 ...

  6. Docker容器网络-基础篇

    开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...

  7. 1.ArrayList和LinkedList区别

    说⼀下ArrayList和LinkedList区别 具体区别 1.1. ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的 1.2. 由于底 ...

  8. 公司官网建站笔记(一):腾讯云服务器装CentOS8.2系统、重置密码、远程ssh登陆、sftp传递文件以及新建开发者账户

    前言   本篇使用的是腾讯云服务器,讲解了部署安装服务器CentOS8.2系统,重置密码,添加用户,远程登陆,远程传递文件等基本流程.   前提条件   购买了腾讯云服务器,如下图:     云服务器 ...

  9. 查重工具Jplag的使用

    目录 前言 一.Jplag是什么? 二.使用步骤 1.下载包 2.java环境配置 3.如何使用 三.总结 前言 说明一下本文章针对最新版本Jplag3.0使用JplagAPI 一.Jplag是什么? ...

  10. mapboxgl 中插值表达式的应用场景

    目录 一.前言 二.语法 三.对地图颜色进行拉伸渲染 1. 热力图 2. 轨迹图 2. 模型网格渲染 四.随着地图缩放对图形属性进行插值 五.interpolate的高阶用法 六.总结 一.前言 in ...