术语
DataFlow Manager nifi用户 具有添加修改删除权限
FlowFile 代表nifi中的单个数据,一个是attribute 另一是content 公共属性 uuid filename path
Processor 处理器 核心组件
RelationShip 处理器之间的关联关系 成功和失败 都可以connection到同一个处理器中。
Connection 连接组件 每个都会包含一个队列queue
Controller Service 控制器服务 在nifi启动的时候 这些服务会自动启动,比如说数据库,数据库服务端。比如说缓存服务
Funnel 漏斗 类似processor,将多个连接合并到一个连接当中去
Processor Group 当我们的数据流变得比较复杂的时候,通过处理器组来使用。
Port 端口号 不同的处理器组 之间互相调用
Remote Processor Group 调用的是远程其他的nifi集群
公告栏 展示一些错误信息
Template 模板 可以复用的处理器,复杂的处理器流程 通过模板功能进行备份 类似备份 应该是。
flow.xml.gz 都会实时写入到这个文件当中,默认在conf中
需要了解的基本属性。
Linux的配置优化 contos7
1、最大文件句柄 通过编辑 /etc/security/limits.conf
*hard nofile 50000
*soft
2、最大派生进程并行数
nproc
3、TCP套接字端口数
设置套接字在关闭的时候设置 超时等待时间
禁止swap功能 /etc/sysctl.conf
关闭 /etc/fatab 选项 noatime
Nifi集群知识点
为什么使用集群 多台机器上运行数据流。使用是零主集群,每个节点都会执行相同的任务,但是在不同的数据集上。其中一个节点会自动形成主节点,集群协调器,会负责断开没有心跳的节点。
Nifi集群协调器 节点Node
主节点 primary node 主要目的就是运行单节点独立的任务
孤立的Processor 比如说读取数据库 数据来源节点 GetFile GetFtp 在集群中就应该有一个处理器 可以设置为只在主节点来进行运行,可以解决重复读取的问题。
独立的处理器 后续的处理,还可以有集群多个节点来处理。
心跳 和ZK有关,通过心跳知道哪些节点正常,五秒钟发送一次心跳。40秒超过没有接收到某个节点的心跳,那就是死亡了。可以在属性配置文件中进行更改。需要确保所有节点都处于活着的状态。40秒后又重新发出心跳,那就可以重新加入到节点中。
都会报告给用户界面去。
集群的安装,两种模式 一种是nifi自己集成的ZK,另一种是使用外部的ZK集群,推荐 使用nifi集成的ZK部署,就可以使用一套专用于nifi的zk集群,降低工作量。可以设置不同。
通过在一台机器上复制目录 并设置不同端口号的方式 设置为集群的方式。配置完ZK版本之后
属性配置
nifi.properties 端口号需要不一样才可以
node01的属性配置:
nifi.state.management.embedded.zookeeper.start=true
nifi.state.management.embedded.zookeeper.properties=./conf/zookeeper.properties
136 # web properties #
137 nifi.web.http.host=localhost
138 nifi.web.http.port=18081
215 nifi.cluster.node.address=localhost
216 nifi.cluster.node.protocol.port=28001
227 # cluster load balancing properties #
228 nifi.cluster.load.balance.host=localhost
229 nifi.cluster.load.balance.port=16341
注意每个节点端口号都不一样才可以。通过localhost的方式来进行启动ZK集群和Nifi集群
创建SH脚本来进行快速启动
使用外部的ZK集群来使用 比较相似唯一的不同 就是ZK配置而已。
外部zk集群,nifi集群,只需要修改nifi.properties 即可
start=false 不启用,将zk.connection.string 改成外部的ZK和state-manger.xml 改为外部ZK配置即可。
故障排除,如果遇到故障,首先就是nifi日志查看,nifi-app.log文件 通过修改conf/logback.xml文件 变更为debug 或者 error即可。
State状态管理 允许处理器在重新启动nifi的时候重新进行恢复。
配置状态提供程序 将流程数据保存在哪里。如何进行存储和读取状态信息
nifi.flow.configuration.file=./conf/flow.xml.gz
47 nifi.state.management.provider.local=local-provider
48 # The ID of the cluster-wide state provider. This will be ignored if NiFi is not clustered but must be populated if running i n a cluster.
49 nifi.state.management.provider.cluster=zk-provider
里面的ID项目 就是唯一项目 class 指定用哪个类来实现存储和读取
34 <local-provider>
35 <id>local-provider</id>
36 <class>org.apache.nifi.controller.state.providers.local.WriteAheadLocalStateProvider</class>
37 <property name="Directory">./state/local</property>
38 <property name="Always Sync">false</property>
39 <property name="Partitions">16</property>
40 <property name="Checkpoint Interval">2 mins</property>
41 </local-provider>
AccessControler 默认是Open ,CreatorOnly 创建者才有权限建议使用Open 状态信息管理的xml文件
集群里的节点 断开连接了,就会转为本地模式的节点,如果是重新连接,那么本地的状态信息就不会被使用了。
管理节点:
1、断开节点,可以手动的断开集群中的一个节点。
2、卸载节点、重新连接节点,那么就连接不上去了。如果关闭是自己web的节点,那可以重新打开其他节点进行连接。必须先卸载,再删除。
3、流动选举 集群启动的时候,必须要确定哪个节点拥有正确的流信息,就需要通过每个节点的流进行投票,当我们的节点尝试连接集群的时候,这个节点就会将本地的副本传送给集群协调器节点,对比所有的流信息只需要取最新的就可以了。
选出最终的流信息 flow.xml.gz 状态信息保存文件。除非所有流都是空的,否则获胜者永远不会是空的。其他节点就会继承这些流信息。保证集群信息最新的。如果一个新的节点不为空,可以将flow.xml.gz 删除之后再进行启动就可以了。
Nifi集群总结 三个配置文件
1、zk配置文件 conf/zookeeper.properties
2、nifi.properties 主要就是start属性 以及端口号设置
3、state/zookeeper/myid 标识zkID
4、state-manager.xml 获取流状态信息,是以单台保存的形式,还是集群保存的形式
故障排除 日志文件在哪里 还有一个是状态管理配置
管理节点:断开、卸载、重新连接、删除节点
流动选举 普通节点、主节点、协调节点 在集群重新启动的时候来进行流动选举,主要就是nifi.xml.gz
FlowFile生成器
GeneratorFlowFile
使用随机数据或自定义内容创建流文件,主要用于测试以及仿真。
属性说明:FileSize 生成文件流的大小 压力测试可以弄大一些, BatchSize 每一个批次所创建的文件数量 DataFormat是文本还是二进制文件,Unique 是否是唯一的,否则就是全部都是一样的。CustomText 是否使用自己的文本,默认文件编码utf-8 用来压力测试或者负载测试,也可以在一些业务场景中实现。比如查询多个表,可以将表名配置到这个处理器中,使用自定义文本就可以了。一个流程查询多个表数据。
ReplaceText
替换流文件内容,支持正则表达式实现替换
属性说明:SearchValue 正则匹配 匹配到的进行变更。ReplacementText 将匹配到的进行替换。字符集UTF-8 支持的最大的文本自己数 BufferSize 替换策略 Regex 替换方式 一行行替换还是整体文本内容进行替换。EvaluationMode 在业务逻辑中经常用到。
FlowFile 拓扑 内容和属性
更新 删除 FlowFile 也可以直接更改文本内容
ExtractText 使用 正则表达式匹配内容 输出到属性当中去。 matched 和 unmatched
自定义属性。固定属性有许多
UpdateAttribute 更新属性 也可以删除流文件。
delete attribute 正则匹配属性
主要用来增加和删除FlowFile属性
两种方式 一种是针对每一个FlowFile 另一种是通过条件匹配FlowFile来进行更新使用。删除属性表达式
使用表达式的语言。同FlowFile中提取属性的时候,我们需要获取他们的值,这个时候就可以nifi表达式。在最基本的表达式中,表达式可以只包含一个属性 ${filename} ${file:toUpper():equals('HELLO')} 表达式当中还可以嵌套其他表达式,表达式会忽略掉空格 ${filename:equals(${uuid})}
Nifi监控 所有集群的相关信息与数据信息 顶部的状态栏,以及处理器的面板,进程组的面板。
Nifi摘要功能,可以搜索查看的数据 错误信息 处理器详情 通过菜单栏 点击Summary查看摘要,DataProvenance面板 主要是查看所有的数据流信息,可以查看引用的FlowFile的完整过程。
DataProvenance 事件类型:
Create 创建新的 Download 下载事件,drop事件 相当于FlowFile事件,Expire 还没有来得及处理,Fetch提取数据,replay重放 route路由。
Nifi监控总结
状态栏,处理器面板,信息展示,处理组面板,摘要面板(包含所有的事件信息,以及详细信息,也可以查看服务器的资源使用情况),DataProvence 数据来源信息(展示FlowFile相关的详细信息),还有就是包含的FlowFile内容,可以通过这些事件类型了解FlowFile的演变过程,可以通过非常强大的搜索功能。通过通过事件条来展示。
Nifi的连接与关系 处理器中间的数据队列
在之前的操作中使用过很多次,在创建处理器之后,就是将不同的处理器连接在一起,形成数据流。同一个关系可以路由到不同的处理器中,FlowFile会复制多份进入到不同的处理器中,可以设置连接的名称,可以设置到期时间,一致等待多长时间还没有被消费的话,就会被Nifi给删除掉。关系路由。
同一个关系可能会被路由到多个不同的关系中去。可以设置连接的名称,也可以不填写。FlowFile Expiration 过期。
背压,在队列中存储的数量和大小限制 Threshold 可以进行修改,里面有相应的进度条。queue队列完全填满之后,会显示高亮的红色。
FlowFile到期,会有一个时钟的图标。
负载均衡的功能:不负载均衡,按属性划分,单个节点,循环,负载均衡压缩,(压缩属性和内容)
集群连接摘要,通过集群摘要来进行查看各个节点所占用的数据,占用队列的百分比。
优先级:Nifi进行的消费顺序,进行拖拽即可,优先级,先进先出,最新的,最旧的,依据属性(priority)来进行划分,必须使用UpdateAttribute 处理器来添加这个属性才可以,值越小优先级越高,可以是数字,也可以是字母。Available Prioritizers
更改配置和上下文菜单,都需要停止才可以修改。
连接与关系简单总结
可以用来连接不同的处理器,可以通过我们的关系进行路由,可以设置FlowFile过期的时间,感觉叫FlowData 或者 FlowRecord比较好,可以设置背压机制,可以根据FlowFile的数量以及大小来进行设置,防止Nifi服务出现数据溢出的问题,可以设置负载均衡,可以设置集群并行消费的问题,再然后连接可以查看数据分发的情况,可以设置处理数据消费的优先级,再往后还可以更低连接的设置项,需要先停止相关联的处理器才可以更新我们的配置,另外可以进行弯曲连接,双击线就可以了。
Nifi的典型案例 和大数据相关的案例,Kafka在大数据系统中占有非常重要的地位,流量解耦合。
1、离线通过Mysql到HDFS中
QueryDatabaseTable_>ConvertAvroToJson->SplitJson 获取到每一行的数据->PutHdfs将它写入到HDFS中
QueryDatabaseTable 查询数据库表 输出格式为Avro
TableName ColumnsToReturn Where条件 CustomQuery 两者二选一,临时表表名,MaxValueColumn 一次查询数据返回最大的行数,如果说超过,那就剔除掉 最大等待时间 输出大小 一般直接使用默认值 Use Avro Logical Types 默认为false,如果使用CustomQuery 应该设置为true
ConvertAvroToJson 将Avro格式的数据转换为JSON ,JSON 对象或者JSON数组,JSON容器默认是数组,Wrap Single Record 是否包装单条对象,如果改为true,进来的数据如果是单条或者是空,作为数组形式,通常情况下是改为True,统一作为JSON Array数据后续处理。
SplitJson 处理器 JsonPath Expression 表达式,将JSON数组分割为单独的FlowFile,每个里面就是单独的Object 切割数组,如果没有匹配成功分配到failure中 Null Value Representation 当数据为空的时候,输出个什么。
PutHDFS 就是将FlowFile写入到HDFS中 Conflict Resolution Strategy 当有重名的时候怎么进行操作,忽略 替换 删除 追加等,配置文件使用逗号进行分割。
第一步就是创建组,然后在组里面加入处理器最终PutHDFS 报错 lzo类找不到。
在设置中增加这个类再试试
/home/hadoop/module/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar
结果可以正常进入hdfs中
[hadoop@localhost ~]$ hadoop dfs -ls /user/hive/warehouse/nifi.db/base_category1
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Found 1 items
-rw-r--r-- 2 hadoop supergroup 166 2021-02-10 11:30 /user/hive/warehouse/nifi.db/base_category1/c2a99417-9ac2-4c72-b658-ac96e0b0b5c8
[hadoop@localhost ~]$ hadoop dfs -cat /user/hive/warehouse/nifi.db/base_category1/*
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
{"id":"1","name":"图书、音像、电子书刊"}{"id":"2","name":"手机"}{"id":"3","name":"家用电器"}{"id":"4","name":"数码"}{"id":"5","name":"家居家装"}[hadoop@localhost ~]$
nifi模板保存
2、JSON内容转换为Hive支持的文本格式,外表数据同步
基于第一个案例的基础做的处理,将JSON内容转换为hive支持的格式进行保存。保存的内容是一个JSON格式的。如果需要被外部表加载使用的时候就得使用hive支持的文本格式。
EvaluatePathJson 被切割为单独的对象之后进行处理 提取json中的属性 然后通过 ReplaceText 进行文本替换。
1、将JSON数据的属性值提取出来 2、转换为\t分割的 \n换行的
将内容提取出来,写入到FlowFile的属性或者内容当中去,JSONPath表达式,最重要的就是属性,replaceText就是通过正则表达式匹配到之后改变为相对应的值。
最终效果:
3、实时同步Mysql数据到Hive中的功能
典型案例,实时同步Mysql中的数据到Hive中,之前的案例是离线的同步,现在是实时的同步,流程实现。
开启Mysql的binlog的日志,CaptureChangeMysql RouteOnAttribute EvaluateJsonPath 提取属性信息 ReplaceText PutHiveSql
jdbc:mysql://hadoop102:3306/gmall?useUnicode=true&characterEncoding=utf-8
/home/hadoop/module/nifi-1.12.1/mysql-connector-java-5.1.27-bin.jar
/home/hadoop/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml,/home/hadoop/module/hadoop-2.7.2/etc/hadoop/core-site.xml
# hive配置
/home/hadoop/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml,/home/hadoop/module/hadoop-2.7.2/etc/hadoop/core-site.xml,/home/hadoop/module/nifi-1.12.1/hive-site.xml
# hive 启动hive2
[hadoop@localhost hive]$ bin/hive --service metastore &
[hadoop@localhost hive]$ bin/hive --service hiveserver2 &
/user/hive/warehouse/nifi.db/base_category1
create table gmall.nifi_hive(id int,name string) stored as orc tblproperties('transactional'='true')
提前创建好Hive表,开启Mysql binlog日志
CaptureChangeMysql
Distributed Map Cache Client 需要创建一个这样的组件 缓存机制,比如说日志读取到哪里了,多的话可以使用Redis最为缓存,RouteOnAttribute 比如说insert update 等进行分发
PutHiveSql 向数据库中插入,不再支持hive1.1版本 hiveConnectionPool cdc.event.type insert update
JsonPath表达式 类似于Xpath, 根对象为$ 无论是数组还是对象 接收 . 和[xxx] 两种符号 过滤器
$.store.book[*].author 等同 $..author
$.store.*
$.store..price
$..book[2] 从零开始计数 或者第三个book对象
$..book[-2] 倒数第二个book对象
$..book[0,1] 等于 $..book[:2]
$..book[-2:] 最后两个 $..book[2:]
$..book[?(@.isbn)] 获取所有的isbn值
$..book[?(@.price > 10)]
$..book[?(@.price > $['expensize'])]
$..* 全部值 递归的
$..book.length() 所有book的全部长度
$..book[?(@.author =- /.*REES/i)] 是否正则匹配
启动hive2的服务 然后利用hive里面的 beeline进行连接
[hadoop@localhost hive]$ bin/hive --service metastore &
[hadoop@localhost hive]$ bin/hive --service hiveserver2 &
[hadoop@localhost hive]$ bin/beeline
结果提示报错:
beeline> !connect jdbc:hive2://hadoop102:10000
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: hadoop
Enter password for jdbc:hive2://hadoop102:10000:
21/02/10 14:35:11 [main]: WARN jdbc.HiveConnection: Failed to connect to hadoop102:10000
Error: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop102:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: hadoop is not allowed to impersonate hadoop (state=08S01,code=0)
beeline>
https://blog.csdn.net/u010834071/article/details/81514654 解决方法
当前的hive存在问题,应该是上面操作hdfs目录 直接在目录下面定义了相关的数据库,结果导致hive不正常。运行命令不正常。都是这种异常,后面直接重新配置hive就可以了。这个暂且不是什么问题,应该就是服务器宕机之类的,hive只是一个客户端,不是其他的服务。
注意看异常 和atlas 弄到一起了,说明是在配置atlas之后 hive出现的异常。
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.apache.atlas.hive.hook.HiveHook.initialize(HiveHook.java:76)
at org.apache.atlas.hive.hook.HiveHook.<init>(HiveHook.java:41)
at sun.reflect.GeneratedConstructorAccessor52.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
4、掌握Kafka在Nifi中的使用
kafka的使用, scala和java编写的高吞吐量 流量削峰 解耦合 可以做消息队列 提升异步并发能力 nifi支持通过界面建立生产者和消费者。
kafka.brokers 服务器列表 topic 主题 Delivery Guarantee ack机制 确保消费
Kafka消费者
Offset Reset 消费的偏移量 是最早还是最新的,
GeneratorFlowFile 每一秒生成一个数字 随机数据
在启动kafka之前 需要提前启动ZK集群 否则kafka启动不了配置里面存在 Reader和Writer这块,在旧的版本里面不存在。通过设置为Csv的服务 可以正常接收到数据,使用avro是不可行的。
[hadoop@localhost kafka]$ kafka-console-consumer.sh --topic nifi_topic --bootstrap-server hadoop102:9092
下面这两个属性需要进行配置,不配置的话不能用。这样可以成功将数据输出到kafka中,这个以后估计还会进行配置。
Kafka消费者的配置 LogAttribute
那这个AppacNifi的学习就算高一段落了。
具体的视频 http://yun.itheima.com/course/723.html 差不多大概花了三天左右的时间。还不错,算是入门了。Apache Nifi