开发者学堂课程【NiFi 知识精讲与项目实战(第一阶段):应用场景2-1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/705/detail/12516
应用场景2-1
内容介绍
一、应用场景
一、应用场景
第二个处理器是 put file,可以和第一个处理器 get file 启动、运行、查看最终结果。首先需要添加处理器:
此时处理器叫 put file。
添加完处理器以后,设置处理器的属性:
此时设置的是 put file 中需要设置写入的目录。会把 FLOW file 的文件文本读取到目录当中。以下是 put file 处理器所特有的属性:
Name | Default value |
Allowable values |
Description |
Directory(目录) | 文件应写入的目录。您可以使用表达语言,例如/ aa / bbl$ {path}。 支持表达语言: true(将使用流文件属性和变量注册表进行评估) | ||
Conflict Resolution Strategy (解决冲突策略) | fail | Replace Ignore Fail |
指示当输出目录中已经存在同名文件时应该怎么办 |
createMissing irectories(创建缺失目录) | true | True false | 如果为 true,则将创建缺少的目标目录。如果为 false,则流文件将受到处罚并发送失败。 |
Maximum FileCount(最大文件数) | 指定输出目录中可以存在的最大文件数 | ||
Last ModifiedTime(上次修改时间) | 将输出文件上的 lastModifiedTime设置为此属性的值。格式必须为ywy-MM-dd'T'HH:..mm: .ssZ。 您也可以使用表达式语言 例如 $file.lastModifiedTime} 支持表达式语言: true(将使用流文件属性和变量注册表进行评估) | ||
Permissions(权限)) | 将输出文件的权限设置为此属性的值。格式必须是带有-的 UNIX rwxrwxrwx(代替拒绝的权限)(例如rw-r--r--)或八进制数(例如644)。您也可以使用表达式语言 例如 ${file.permissions}。 支持表达式语言: true(将使用流文件属性和变量注册表进行评估) | ||
owner(所有者) | 将输出文件的所有者设置为此属性的值。您也可以使用$ifile.owner}之类的表达语言。请注意,在许多操作系统上,Nifi 必须以超级用户身份运行才能拥有设置文件所有者的权限。 支持表达式语言: true (将使用流文件属性和变量注册表进行评估) | ||
Group(组) |
将输出文件上的组设置为此属性的值。您也可以使用表达语言,例如$ {file.group}。 支持表达式语言: true(将使用流文件属性和变量注册表进行评估) |
因为 put file 和 get file 较为相似,所以处理器属性也有许多相似的地方。
(1)目录设置,该目录设置主要指的是写入文件的目录,而不是读取文件的目录。这个目录设置完之后,会把文件写入到该目录当中。
(2)解决冲突的策略,与之前 get file 不同。在写入文件时,如果文件存在同名文件时有3个选项。第1个是 Replace,也就是覆盖。第2个是 ignore,也就是忽略,第3个是fail,就是提示失败,报错信息。
(3)Create Missing directories也就是创建缺失的目录。 该选项默认是true。 如果创建的目录此时还没有,就会自动进行创建。 如果是 false, 没有标记设置,写入目录时就会提示失败信息。
(4)最大文件数,写入文件时一次性批量写入的最大文件数。不是一次性,是所有的最大文件数。当写入的所有文件超过了最大文件数之后,就不会再写入。
(5)Last Modified Time,也就是上次修改的时间。主要是将输出文件上次更新的时间设置到该属性上。必须要满足规定的格式才能够设置,如果和格式不一致,识别不成功。也可以使用表达式语言。
(6)权限,输出文件的权限设置到此处,格式是Linux中的格式。 R 就是 read ,W 就是 write ,S 就是执行。当前用户组和其他用户或者是 Linux 常用的数字,以上是文件的权限。写入之后,该文件就拥有权限。
(7)Owner,所有者。当文件写入到另一个系统之后,文件的所有者是谁,可以在其中进行设置。如果想拥有该功能,NiFi 用户必须使用超级管理员的身份运行才能够执行,如果不是超级管理员运行,就没有办法给其他用户复制文件的权限,这也是关键点,一般推荐使用 root 账号启动 NiFi。
(8)group 组,相当于把输出文件上的组,设置到该属性上,与用户类似,要求必须使用超级用户的身份运行 NiFi,否则没有权限执行。 以上是 put file 的属性。 标粗的属性是必填项,没有标粗的属性是选填,可以不填写。其中3个必填项当中,有2个选项有默认值,可以不用设置,使用默认值即可,只需要设置的一个必选项即可,也就是需要设置写入目录。设置完目录之后,接下来创建写入文件的目录: mkdir -p /export/tmp/target
之后连接两个处理器:
连接以后,可以启动 get file:
启动 get file 之后,就会开始进行数据的读取。 在创建的时候需要注意选择连接的关系, 其中关系较为简单,只有success,所以不涉及到复杂的问题。 启动 get file 之后,就可以在源读取的目录当中,写入新文件,叫 Hello World:
cd /export/tmp /source
echo "he11o wor1d" > he11o-wor1d.txt
写入文件之后就可以观察结果是否能够正常读取:
如果能够被 NiFi 读取,NiFi 数据读取到何处, 再继续写入文件:
echo "he11o wor1d" >Hello-world.txt
echo "he1lo wor1d" > hello-world2.txt
继续观察 NiFi 的情况:
最后将 put file 做自连接:
自连接的作用就是避免报错信息。
之前做 get file 时,有一个错误信息提示,是因为关联关系叫 success,没有任何目的地,如何防止报错,第一种方法是将其连接到其他组件,另一种就是自连接 put file,采用的方式就是自连接来避免该问题。将错误解决之后,就可以启动。处理器启动之后,会发现有错误信息。此时进行错误信息解决。错误信息如下:
错误信息提示文件目录不存在。不是文件,不存在,而是文本重复的问题。接下来还有覆盖写入以及重复写入文件、关闭处理器等一系列操作,以下是演示练习:
从第一个步骤开始执行,首先添加一个处理器,这个处理器叫 put file:
添加完 put file 之后,接下来要对 put file 进行设置。可以右键,也可以双击打开设置:
打开设置之后,可以在其中修改文件名,此时没有重复,文件名不修改也允许此时可以将其改成 Put file target:
配置完名称之后,需要配置属性,在 properties 选项卡当中。目录是配置目录。目录设置为 export,依然是 tmp 临时目录下,最后加上 Target:
但是 Target 目录不存在,没有进行创建。进行查看在 TMP 目录下,只有 south,没有 Target。此时错误信息中没有提示目录不存在:
先将目录创建:
Mkdir Target
此时目录已经存在。创建目录之后,就需要连接 get file 和 put file 2个处理器。连接时,默认选中 success 关系:
因为只有一个关联关系,当处理器只有一个时会被默认选中,如果有多个就需要手动选中。此时点击 add,于是建立上连接关系:
连接关系可以通过双击或右键打开查看连接信息:
连接信息显示,从 pick Up 处理器过来类型是 get file,到 put Target 处理器去,类型是 put file。属于根处理器组,由于还没有创建组,所以默认组就是在根节点。以上是设施信息,设施信息可以进行配置。创建完链接之后就可以进行测试,此时启动 Get file,启动之后可以查看文件是否有变化,此时文件并没有变化。因为文件是空的,就需要创建一个文件出来,看处理器是否能够成功读取到。此时通过如下命令:
[root@localhost tmp]# cd source/
[ root@localhost source]# ls
[root@localhost source]# echo "hello world" > hello-world.txt
再通过 ls 查看:
[ root@localhost source]# ls
发现该文件没有被写入。因为该文件被处理器读取,读取出来之后就会将源文件删除。此时在处理器当中有一个数据已经写入到队列当中。
在该队列当中,1代表有一条数据,12代表数据,大小是12 Byte:
此时文件再继续写入文件,继续在来源目录下写入文件:
[root@localhost source]# echo "hello world1" >
hello-world.txt
此时进行查看,发现依然没有变化。通过右键刷新之后产生变化,发现数字变成了2,大小变成了25 Byte,是刚才的2倍:
证明读取成功。再继续写入,文件名改为 Hello World2.TXT:
[root@localhost source]# echo "hello world2" >
hello-world.txt
此时再继续回到 NiFi 当中,刷新,数字变成了3:
表示读取到3个文件到队列当中。用处理器读取将信息写入到队列当中,有3个文件,总大小是37 Byte。如何让 put file 把读取的文件数据写入到目的地文件夹,此时就需要启动 put file。发现右键之后,没有启动按钮:
因为还有一些错误信息没有处理,错误信息一是关联关系没有连接:
如果没有链接,就必须配置链接,数据走向此处已经结束,后面没有数据,那么就采用自连接。打开配置项之后,勾选关联关系,就成为了自连接:
不论是成功还是失败,就在此停止。此时没有错误信息,能够启动。右键 Start 开启之后,右侧有一个1,鼠标移动到上面会提示有一个线程正在运行,将鼠标移动上去,会发现有报错信息:
routine to future as conflict because fill with the same name already existed
也就是说写入的文件已经有重复的文件名存在,所以写入失败。此时来到目标目录下,进入 Target 目录,发现已经有2个文件。可以通过 get 查看2个文件的内容是否正确。此时,Hello World 是正确的。报错是由于在刚才写入时,一共写入了三次文件。其中,前两次文件名一致,第一次写入成功之后,第二次再写入,因为文件名重复,所以写入失败。以上就是 put file 运转流程。现在还存在问题:
(1)如何解决该报错信息
(2)如果该目录不创建,是否会自动执行。