NIFI典型案例
课程目标
1、离线同步Mysql数据到DFS
2、Json内容转换为Hive支持的文本格式
3、实时同步Mysql数据到Hive
4、Kafka的使用
1.离线同步Mysql数据到hdfs
大数据数据仓库系统中,经常需要进行数据同步操作,可以使用nifi来进行灵活的全流程操作。
准备工作:
- 启动Mysql服务(5.7版本),在Mysql中运行
\资料\mysql\nifi_test.sql
中的SQL语句。 - 启动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