Apache NiFi 典型案例

NIFI典型案例

课程目标

1、离线同步Mysql数据到DFS

2、Json内容转换为Hive支持的文本格式

3、实时同步Mysql数据到Hive

4、Kafka的使用

1.离线同步Mysql数据到hdfs

大数据数据仓库系统中,经常需要进行数据同步操作,可以使用nifi来进行灵活的全流程操作。

准备工作:

  1. 启动Mysql服务(5.7版本),在Mysql中运行\资料\mysql\nifi_test.sql中的SQL语句。
  2. 启动Hadoop集群(与NiFi集群在同一个可访问的局域网网段)

1.1处理器流程

QueryDatabaseTable ——> ConvertAvroToJSON ——> SplitJson ——> PutHDFS

QueryDatabaseTable读取Mysql数据,ConvertAvroToJSON将数据转换为可阅读的Json格式,再通过SplitJson进行切割获得单独的对象,PutHDFS将所有对象写入HDFS中。

1.2处理器说明

QueryDatabaseTable
描述

生成SQL选择查询,或使用提供的语句,并执行该语句以获取其指定的“最大值”列中的值大于先前看到的最大值的所有行。查询结果将转换为Avro格式。几种属性都支持表达式语言,但不允许传入连接。变量注册表可用于为包含表达式语言的任何属性提供值。如果需要利用流文件属性来执行这些查询,则可以将GenerateTableFetch和/或ExecuteSQL处理器用于此目的。使用流技术,因此支持任意大的结果集。使用标准调度方法,可以将该处理器调度为在计时器或cron表达式上运行。该处理器只能在主节点上运行。

属性配置

在下面的列表中,必需属性的名称以粗体显示。其他任何属性(非粗体)均视为可选。该表还指示所有默认值,以及属性是否支持NiFi表达式语言。

名称 默认值 描述
Database Connection Pooling Service 用于获得与数据库的连接的Controller Service。
DBCPConnectionPoolLookup
DBCPConnectionPoo
HiveConnectionPool
Database Type 泛型 数据库的类型/风格,用于生成特定于数据库的代码。在许多情况下,通用类型就足够了,但是某些数据库(例如Oracle)需要自定义SQL子句。
Generic
Oracle
Oracle 12+
MS SQL 2012+
MS SQL 2008
MySQL
Table Name 要查询的数据库表的名称。使用自定义查询时,此属性用于别名查询,并在FlowFile上显示为属性。 支持表达式语言:true(仅使用变量注册表进行评估)
Columns to Return 查询中要使用的列名的逗号分隔列表。如果您的数据库需要对名称进行特殊处理(例如,引号),则每个名称都应包括这种处理。如果未提供任何列名,则将返回指定表中的所有列。注意:对于给定的表使用一致的列名很重要,这样增量提取才能正常工作。 支持表达式语言:true(仅使用变量注册表进行评估)
Additional WHERE clause 构建SQL查询时要在WHERE条件中添加的自定义子句。 支持表达式语言:true(仅使用变量注册表进行评估)
Custom Query 用于检索数据的自定义SQL查询。代替从其他属性构建SQL查询,此查询将包装为子查询。查询必须没有ORDER BY语句。 支持表达式语言:true(仅使用变量注册表进行评估)
Maximum-value Columns 列名的逗号分隔列表。自处理器开始运行以来,处理器将跟踪返回的每一列的最大值。使用多列意味着列列表的顺序,并且期望每列的值比前一列的值增长得更慢。因此,使用多个列意味着列的层次结构,通常用于分区表。该处理器只能用于检索自上次检索以来已添加/更新的那些行。请注意,某些JDBC类型(例如位/布尔值)不利于保持最大值,因此这些类型的列不应在此属性中列出,并且会在处理期间导致错误。如果未提供任何列,则将考虑表中的所有行,这可能会对性能产生影响。注意:对于给定的表使用一致的最大值列名称很重要,这样增量提取才能正常工作。 支持表达式语言:true(仅使用变量注册表进行评估)
Max Wait Time 0秒 正在运行的SQL选择查询所允许的最长时间,零表示没有限制。少于1秒的最长时间将等于零。 支持表达式语言:true(仅使用变量注册表进行评估)
Fetch Size 0 一次要从结果集中获取的结果行数。这是对数据库驱动程序的提示,可能不被尊重和/或精确。如果指定的值为零,则忽略提示。 支持表达式语言:true(仅使用变量注册表进行评估)
Max Rows Per Flow File 0 一个FlowFile中将包含的最大结果行数。这将使您可以将非常大的结果集分解为多个FlowFiles。如果指定的值为零,那么所有行都将在单个FlowFile中返回。 支持表达式语言:true(仅使用变量注册表进行评估)
Output Batch Size 0 提交流程会话之前要排队的输出FlowFiles的数量。设置为零时,将在处理所有结果集行并且输出FlowFiles准备好转移到下游关系时提交会话。对于较大的结果集,这可能导致在处理器执行结束时传输大量的FlowFiles。如果设置了此属性,则当指定数量的FlowFiles准备好进行传输时,将提交会话,从而将FlowFiles释放到下游关系。注意:设置此属性后,将不会在FlowFiles上设置maxvalue。*和fragment.count属性。 支持表达式语言:true(仅使用变量注册表进行评估)
Maximum Number of Fragments 0 最大片段数。如果指定的值为零,那么将返回所有片段。当此处理器提取大表时,这可以防止OutOfMemoryError。注意:设置此属性可能会导致数据丢失,因为未按顺序排列传入结果,并且片段可能会在任意边界处终止,其中结果集中不包含行。 支持表达式语言:true(仅使用变量注册表进行评估)
Normalize Table/Column Names 是否将列名中的非Avro兼容字符更改为Avro兼容字符。例如,冒号和句号将更改为下划线,以建立有效的Avro记录。
真正
Transaction Isolation Level 此设置将为支持此设置的驱动程序设置数据库连接的事务隔离级别。TRANSACTION_NONE
TRANSACTION_READ_COMMITTED
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
Use Avro Logical Types 是否对DECIMAL / NUMBER,DATE,TIME和TIMESTAMP列使用Avro逻辑类型。如果禁用,则写为字符串。如果启用,则使用逻辑类型并将其写为其基础类型,特别是DECIMAL / NUMBER为逻辑“十进制”:以具有附加精度和小数位元数据的字节形式写入,DATE为逻辑“ date-millis”:以int表示天自Unix时代(1970-01-01)起,TIME为逻辑’time-millis’:写为int,表示自Unix纪元以来的毫秒数; TIMESTAMP为逻辑’timestamp-millis’:写为长时,表示自Unix纪元以来的毫秒数。如果书面Avro记录的阅读者也知道这些逻辑类型,则可以根据阅读器的实现在更多上下文中反序列化这些值。
真正
Default Decimal Precision 10 当将DECIMAL / NUMBER值写入为“十进制” Avro逻辑类型时,需要表示可用位数的特定“精度”。通常,精度是由列数据类型定义或数据库引擎默认定义的。但是,某些数据库引擎可以返回未定义的精度(0)。写入那些未定义的精度数字时,将使用“默认十进制精度”。 支持表达式语言:true(仅使用变量注册表进行评估)
Default Decimal Scale 0 当将DECIMAL / NUMBER值写入为“十进制” Avro逻辑类型时,需要一个特定的“标度”来表示可用的十进制数字。通常,规模是由列数据类型定义或数据库引擎默认定义的。但是,当返回未定义的精度(0)时,某些数据库引擎的比例也可能不确定。写入那些未定义的数字时,将使用“默认小数位数”。如果一个值的小数位数超过指定的小数位数,那么该值将被四舍五入,例如1.53在小数位数为0时变为2,在小数位数1时变为1.5。 支持表达式语言:true(仅使用变量注册表进行评估)
ConvertAvroToJSON
描述

​ 将Binary Avro记录转换为JSON对象。该处理器提供了Avro字段到JSON字段的直接映射,因此,生成的JSON将具有与Avro文档相同的层次结构。请注意,Avro模式信息将丢失,因为这不是从二进制Avro到JSON格式的Avro的转换。输出JSON编码为UTF-8编码。如果传入的FlowFile包含多个Avro记录的流,则生成的FlowFile将包含一个JSON Array,其中包含所有Avro记录或JSON对象序列。如果传入的FlowFile不包含任何记录,则输出为空JSON对象。空/单个Avro记录FlowFile输入可以根据“包装单个记录”的要求选择包装在容器中。

属性配置

在下面的列表中,必需属性的名称以粗体显示。其他任何属性(非粗体)均视为可选。该表还指示任何默认值。

名称 默认值 允许值 描述
JSON容器选项 数组 没有数组 确定如何显示记录流:作为单个Object序列(无)(即,将每个Object写入新行),或者作为Objects数组(array)。
包装单条记录 真正假 确定是否将空记录或单个记录的结果输出包装在“ JSON容器选项”指定的容器数组中
Avro模式 如果Avro记录不包含架构(仅基准),则必须在此处指定。
SplitJson
描述

该处理器使用JsonPath表达式指定需要的数组元素,将JSON数组分割为多个单独的流文件。每个生成的流文件都由指定数组的一个元素组成,并传输到关系“split”,原始文件传输到关系“original”。如果没有找到指定的JsonPath,或者没有对数组元素求值,则将原始文件路由到“failure”,不会生成任何文件。

该处理器需要使用人员掌握JsonPath表达式语言。

属性配置

在下面的列表中,必需属性的名称以粗体显示。任何其他属性(不是粗体)都被认为是可选的,并且指出属性默认值(如果有默认值),以及属性是否支持表达式语言。

属性名称 默认值 可选值 描述
JsonPath Expression 一个JsonPath表达式,它指定用以分割的数组元素。
Null Value Representation 1 empty string
the string ‘null’
指定结果为空值时的表示形式。
PutHDFS
描述

将FlowFile数据写入Hadoop分布式文件系统(HDFS)

属性配置

在下面的列表中,必需属性的名称以粗体显示。其他任何属性(非粗体)均视为可选。该表还指示所有默认值,以及属性是否支持NiFi表达式语言。

名称 默认值
允许值 描述
Hadoop Configuration Resources 由文件或逗号分隔的文件列表,其中包含Hadoop文件系统配置。否则,Hadoop将在类路径中搜索“ core-site.xml”和“ hdfs-site.xml”文件,或者将恢复为默认配置。要使用swebhdfs,请参阅PutHDFS文档的“其他详细信息”部分。 支持表达式语言:true(仅使用变量注册表进行评估)
Kerberos Credentials Service 指定应用于Kerberos身份验证的Kerberos凭据控制器服务
Kerberos Principal Kerberos主体作为身份验证。需要在您的nifi.properties中设置nifi.kerberos.krb5.file。 支持的表达语言:true(仅使用变量注册表进行评估)
Kerberos Keytab 与主体关联的Kerberos密钥表。需要在您的nifi.properties中设置nifi.kerberos.krb5.file。 支持的表达语言:true(仅使用变量注册表进行评估)
Kerberos Relogin Period 4小时 尝试重新登录kerberos之前应该经过的时间。此属性已被弃用,并且对处理没有影响。现在,重新登录会自动发生。 支持表达式语言:true(仅使用变量注册表进行评估)
Additional Classpath Resources 以逗号分隔的文件和/或目录的路径列表,该列表将添加到类路径中,并用于加载本机库。指定目录时,该目录中所有具有的文件都将添加到类路径中,但不包括其他子目录。
Directory 文件应写入的父HDFS目录。如果目录不存在,将创建该目录。 支持表达式语言:true(将使用流文件属性和变量注册表进行评估)
Conflict Resolution Strategy 失败 更换
忽视
失败
附加
指示当输出目录中已经存在同名文件时应该怎么办
Block Size 写入HDFS的每个块的大小。这将覆盖Hadoop配置
IO Buffer Size IO期间用于缓冲文件内容的内存量。这将覆盖Hadoop配置
Replication HDFS复制每个文件的次数。这将覆盖Hadoop配置
Permissions umask 用八进制数表示的umask,用于确定写入HDFS的文件的权限。这将覆盖Hadoop属性“ fs.permissions.umask-mode”。如果未定义此属性和“ fs.permissions.umask-mode”,则将使用Hadoop默认值“ 022”。
Remote Owner 写入后,将HDFS文件的所有者更改为此值。仅当NiFi以具有HDFS超级用户特权来更改所有者的用户身份运行时才有效 支持表达式语言:true(将使用流文件属性和变量注册表进行评估)
Remote Group 写入后,将HDFS文件的组更改为此值。仅当NiFi以具有HDFS超级用户特权来更改组的用户身份运行时才有效 支持表达式语言:true(将使用流文件属性和变量注册表进行评估)
Compression codec 没有 没有 默认 邮编 邮编 LZ4 LZO 贪睡 自动 没有描述。
Ignore Locality 真正假 指示HDFS系统忽略位置规则,以便在群集中随机分配数据

1.3操作

1.3.1创建组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfPSeihu-1622120224479)(./images/MysqlToHDFS组.gif)]

1.3.2创建QueryDatabaseTable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NGzHDOO-1622120224484)(./images/创建QueryDataTable.gif)]

1.3.3创建并配置Mysql连接池

1.3.3.1创建连接池

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pupuxvkN-1622120224485)(./images/创建Mysql连接池.gif)]

1.3.3.2配置连接池

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zc81zdTt-1622120224489)(.\images\image-20200219164809426.png)]

Database Connection URL = jdbc:mysql://192.168.52.6:3306/nifi_test?characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true
Database Driver Class Name = com.mysql.jdbc.Driver
#此处的jar包需要提前上传到nifi服务器中
Database Driver Location(s) = /export/download/jars/mysql-connector-java-5.1.40.jar
Database User = root
Password = 123456

1.3.3.3启动连接池

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgwnNeGB-1622120224491)(./images/启动Mysql连接池.gif)]

1.3.4配置QueryDatabaseTable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2JTlQxU-1622120224492)(.\images\image-20200219171053077.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j38BDRZO-1622120224493)(.\images\image-20200219171703195.png)]

Custom Query = select id,name,mobile,email,son_json from user_info_nifi limit 15
1.3.5创建配置ConvertAvroToJSON

1.3.5.1创建配置ConvertAvroToJSON

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p10ZV0NM-1622120224495)(./images/配置ConvertAvroToJson.gif)]

1.3.5.2连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79GR315R-1622120224495)(./images/连接Q和C.gif)]

1.3.5.3 负载均衡消费数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fsY0HKJe-1622120224497)(./images/负载均衡消费query.gif)]

1.3.6创建配置SplitJson

1.3.6.1 SplitJson配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tncXimbT-1622120224498)(.\images\image-20200219173310756.png)]

JsonPath Expression = $.*

1.3.6.2 连接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtfaQ9Rm-1622120224498)(./images/连接C和S.gif)]

1.3.7创建配置PutHDFS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ncwsh2BL-1622120224499)(.\images\image-20200219175456103.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koSoDzgq-1622120224500)(.\images\image-20200219175036736.png)]

Hadoop Configuration Resources = /export/download/config/hdfs-site.xml,/export/download/config/core-site.xml
Directory = /user/hive/warehouse/nifi_test.db/user_info_nifi
Conflict Resolution Strategy = append
1.3.8运行查看效果
1.3.8.1 启动QueryDatabaseTable,并查看队列中数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e4sDKuqr-1622120224500)(./images/启动QueryDatabaseTable.gif)]

1.3.8.2 启动ConvertAvroToJSON,并查看队列中数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVr8Hjzv-1622120224501)(./images/启动ConvertAvroToJSON.gif)]

1.3.8.3 启动SplitJson,并查看队列中数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8vVzWfGs-1622120224503)(./images/启动SplitJson.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值