开发者学堂课程【NiFi 知识精讲与项目实战(第一阶段):应用场景2-2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/705/detail/12517
应用场景2-2
内容介绍
一、应用场景
二、总结
一、应用场景
写文件的流程运行一遍之后,文件成功写入,但仍然有如下两个问题没有解决:
1.在配置 put file 时,写入的目录并没有创建。但是,错误提示信息当中并没有报错。在运行之前创建出来并且运行是允许的。如果不创建该 Target 目录的话,是否还能够正常运行?是否是能够自动进行创建?
2.在运行过程当中,写入的读取文件有重复名称时,在写入时候会报错,提示报错信息,并不会覆盖写入。
对以上2个问题进行解决。首先,如果在写入目录中,并不去创建。
验证 Target 目录是否能够自动创建、正常运转操作如下:
首先删除创建的 Target 目录:
[root@localhost tmp]# rm-rf target/
此时写入目的地已经不存在:
此时,重新向 get Fire 中写入新的文件,查看是否能够正常运转。进入源文件目录,搜索目录,重新写入新的文件:
[ root@localhost source]# ls
[root@localhost source]# echo "hello-world" > hello-world.txt
运行之后,文件已经成功被读取, put file 没有报错。查看文件是否正常写入进入到根目录:
[root@localhost source]# cd ../
[root@localhost tmp]# ls
此时,Target 目录已经成功创建。
进入到 Target 目录当中:
CD target
此时已经写入了一个文件。文件内容是 Hello Word,文件内容正确证明这个目标目录并不需要创建,会自动创建。是由于 put file 的处理器属性,在该属性当中有一个属性叫做创建缺失目录, Create Missing directories,默认值是true,由于默认为 true, put file 就会自动创建缺失的目录。这也就解释了为什么在目录删掉之后还能够成功运转,就是由于创建了目录,如果为 false,源文件会受到处罚,并且发送失败信息,也就是会处理不成功,并且报错。
以下图片显示,默认值为 true:
如果将其改为 false,就会报错。此时无法修改是因为处理器是正在运行的状态,是绿色的箭头。如果要想修改配置信息,就必须先把它停止,停止完之后再进入编辑页面,此时就可以进行修改。将默认值修改为 false 之后,该目录如果缺失,就会提示错误信息,并且写入失败。试验如下:
改完配置信息之后,重新启动,启动之后把 Target 目录删除:
[root@localhost tmp]#rm-rf target/
[root@localhost tmp]# ls
重新进入source目录之后,重新写入文件:
[ root@localhost source]# ls
[ root@localhost source]# echo "hello world" > hello-world.txt
此时进行查看,已经被读取成功读取,刷新查看状态,发现已经报错。
提示错误信息:
从该错误信息中可以得出错误信息:缺失目录。因为目录不存在,处理器配置不会创建缺失的目录。此时文件写入不成功。 Target 目录没有出现,只有 source 目录。问题解决,先将处理器停止,并且将配置信息改为 true。
在写入文件时,写入了三个文件,但只有两个文件写入成功,还有一个写入失败,在报错信息中可以得出有2个文件名是重复的。问题解决:
在处理器配属性配置当中,有一个配置项叫 conflict Reflection,strategy,也就是解决冲突策略,默认值是 fail。当输出目录当中已经存在了同名文件时,就会提示错误信息,并且写入失败。如何能够让其进行覆盖写入,在该属性当中有3个可选值,除了失败之外,还有replace覆盖写入,ignore 忽略。如果想要进行覆盖写入,就选择 replace。测试: 此时修改 put file 属性配置,在属性配置当中选择 conflict Resolution strategy,将该默认值改为 replace:
进行保存之后,重新启动流程。此时,重新写入文件进行测试:
[root@localhost source]#
ls [root@localhost source]# echo "hello world" > helio-world.txt
写入一个文件之后,再写入一个重名文件,将内容进行修改。在写入之前,先查看目标目录下是否已经成功写入,并查看文件内容是否正确:
[ root@localhost target]# ls hello-world.txt
[root@localhost target]# cd ../ source/
[ root@localhost source]# ls
经过确认,已经成功写入并且内容正确。再重新创建一个同名文件,让文件名保持一致,将内容进行修改,进行验证:
[ root@localhost source]# echo "hello world agin"
进入 Target 目录中,查看内容是否被覆盖写入,是否写入成功:
经查看,已经成功覆盖写入,处理器没有新的报错信息。此时证明问题已经解决。任务执行完之后,如果不再进行使用,需要将其关闭,如果不关闭,就会不断运行,占用服务器资源。
二、总结
应用场景一共做了两个,如何实现数据流的处理:
首先创建处理器,创建的第一个处理器是 get file。创建完处理器之后,设置处理器属性,配置处理器,在配置过程当中,需要注意熟悉了解处理器的属性。如果处理器属性不提前通过官方文档了解清楚,那么就不能很好的使用NiFi。最后创建后续处理器,此时创建的后续处理器是 put file。创建完 put file 之后,进行配置和连接,过程与 get file 相同,必须熟悉处理器的属性,配置完之后进行连接,连接处理器 get file 和 Put file。
通过以上流程操作,实现了文件的读取和写入功能。以上功能如果使用代码开发相对比较麻烦。通过 NiFi,可以用可视化工具方便进行配置和运行。