小记--------nifi通过作业流模板 添加模板-修改属性-启动
mysqlToHiveORC-作业流
集群模式、使用GenerateTableFetch进行分流SQL语句---ExecuteSQLRecord执行SQL语句---ConverAvroToORC将avro格式转换为ORC格式---PutHDFS写入hdfs(写入的路径指定到hive表load的默认路径下)
一、在画布上手动创建标准作业流
1.GenerateTableFetch处理器配置
select name , date , time from yu.qiang WHERE date < DATE_FORMAT(NOW(),'%Y-%m-%d') and date > DATE_FORMAT(DATE_SUB(NOW(),INTERVAL +1 DAY),'%Y-%m-%d');
1.Database Connection Pooling Service 选择DBCPConnectionPool(下面将如何配置)
2.Database Type : 选择mysql数据库类型
3.Table Name :要同步的mysql表名
4.Partition Size : 每一块的数据大小(假设要同步的mysql表行数是1000,如果该位置配置100,那么会分成10条sql语句;例:select * from test limit 100 ; select * from test limit 100 offset 100;select * from test limit 100 offset 200;)
5.Column for Value Partitioning :要查询的字段(如果不写则是 select * )
6.Additional WHERE clause : 给定生成后的SQL语句where条件(例:DATE_FORMAT(create_time,'%Y-%m-%d') > DATE_FORMAT(DATE_SUB(NOW(),INTERVAL +4 DAY),'%Y-%m-%d') and DATE_FORMAT(create_time,'%Y-%m-%d') < DATE_FORMAT(NOW(),'%Y-%m-%d') 通过该where条件可以进行抽取部分数据)
1.1 DBCPConnectionPool配置
Database Connection URL : jdbc:mysql://IP:PORT/DatabaseName?characterEncoding=UTF-8&zeroDateTimeBehavior=round
Database Driver Class Name : com.mysql.jdbc.Driver
Database User : 数据库用户名
Password : 数据库密码
配置完成后点启动
2.ExecuteSQLRecord处理器配置
Database Connection Pooling Service : 使用和GenerateTableFetch处理器同样的Database connection pool 即可
Record Writer : 使用默认Avro格式即可
3.ConvertAvroToORC处理器配置
ORC Configuration Resources:需要指定nifi集群中的hive-site.xml路径
Compression Type:压缩格式类型,可选可不选
Hive Table Name:要落地的hive表名(需要提前将表创建好)
4.PutHDFS处理器配置
Hadoop Configuration Resources:需要指定nifi集群中hadoop的core-site.xml和hdfs-site.xml位置路径
Directory:最后落地到hdfs的路径(因为我们要直接同步到hive表中,所以将该路径直接指定到集群中hive同步数据的路径下)
Conflict Resolution Strategy:append(追加策略)
5.配置好所有的处理器后创建流(也就是从上之下用箭头连起来)
需要注意的是因为我们想要完全利用集群的资源,所以在GenerateTableFetch处理器和ExecuteSQLRecord处理器的连接处需要配置
设置为轮询Round robin 这样GenerateTableFetch处理器就会把分成的若干SQL语句以轮询的方式给到集群中所有节点。
*按照以上操作之后启动整个作业流,不出意外的情况下是可以进行数据落地到hdfs上。
但是要注意的是我们要落地到hive中,所以需要提前执行创建hive的SQL语句。如果有分区那么也需要提前执行分区语句
创建hive分区表
CREATE TABLE `ods_order_info_nifi` (
`id_` string COMMENT '订单id',
`order_no` string COMMENT '订单编号:目前和订单id一样,14位{日期(年月)6位+8位序列号(位数不足补0)}',
`vehicle_id` int COMMENT '车辆id',
`vehicle_series_id` int COMMENT '车型/车系ID',
`vehicle_brand` string COMMENT '车辆品牌描述',
`vehicle_series` string COMMENT '车辆型号描述',
`vehicle_license` string COMMENT '车牌号',
`driver_id` int COMMENT '司机id',
`driver_name` string COMMENT '司机姓名',
`driver_mobile` string COMMENT '司机手机',
`renter_id` int COMMENT '乘客id',
`renter_full_name` string COMMENT '乘客姓名',
`renter_mobile` string COMMENT '乘客手机',
`order_type` int COMMENT '订单类型。0、实时订单 1、预约订单',
`state` int COMMENT '订单流转状态:1已下单,2、已接单,3用车中,4到达目的地,5未支付,6已支付完成,7司机到达约定地点',
`cancel` int COMMENT 'cancel:0未取消,1用户取消,2司机取消,3超时未接单,系统自动取消,4客服取消, 5第三方派单取消',
`work_flow` int COMMENT 'work_flow:0未结束,1已结束;',
`close_remark` string COMMENT '关闭订单备注(运营平台操作)',
`close_time` string COMMENT '关闭订单时间',
`close_user_id` int COMMENT '关闭订单管理员Id',
`end_reason` string COMMENT '取消原因。数据字典。以逗号相隔。',
`create_time` string COMMENT '订单创建时间',
`cancel_time` string COMMENT '取消时间',
`estimate_geton_time` string COMMENT '预估上车时间',
`wait_time` string COMMENT '等待时长。单位:s',
`wait_mile` int COMMENT '空驶里程',
`plan_model` string COMMENT '预定车型',
`actual_model` string COMMENT '实际使用车型',
`begin_time` string COMMENT '订单分时计费开始时间\r\n 注:\r\n 分时:1、创建订单后15分钟没取车,时间为创建时间+15分钟,\r\n 2、15分钟内取车,为取车时间 \r\n 日租:为创建订单时间 加 日租时间',
`end_time` string COMMENT '用户还车成功时间,或者客服关闭订单时间',
`get_on_time` string COMMENT '乘客上车时间',
`begin_address_code` string COMMENT '发起地行政区域代码',
`navigation_brand` int COMMENT '1.百度 2.高德。默认为2:高德地图',
`Encrypt` int COMMENT '1:GCJ-02测绘局标准\r\n 2:WGS84 GPS标准\r\n 3:BD-09百度标准\r\n 4:其他',
`city_name` string COMMENT '下单所属城市名称',
`open_lng` double COMMENT '订单起始位置经度。乘客预计上车地点经度',
`open_lat` double COMMENT '订单起始位置纬度。乘客预计上车地点纬度',
`open_location` string COMMENT '订单起始位置信息。乘客预计上车地点位置信息',
`close_lng` double COMMENT '订单结束位置经度。乘客预计下车地点经度',
`close_lat` double COMMENT '订单结束位置纬度。乘客预计下车地点纬度',
`close_location` string COMMENT '订单结束位置信息。乘客预计下车地点位置信息',
`receive_lng` double COMMENT '司机接单位置经度',
`receive_lat` double COMMENT '司机接单位置纬度',
`go_on_lng` double COMMENT '乘客上车位置经度。司机点击用户已上车的按钮后记录',
`receive_location` string COMMENT '司机接单位置信息',
`go_on_lat` double COMMENT '乘客上车位置纬度。司机点击用户已上车的按钮后记录',
`go_on_location` string COMMENT '乘客上车位置信息。司机点击用户已上车的按钮后记录',
`arrive_lng` double COMMENT '司机到达位置经度。乘客实际下车位置的经度',
`arrive_lat` double COMMENT '司机到达位置纬度。乘客实际下车位置的纬度',
`arrive_location` string COMMENT '司机到达位置信息。乘客实际下车的位置信息',
`close_gps_time` string COMMENT '结束时上传gps时间',
`charge_mileage` int COMMENT '订单里程',
`price_low_speed` int COMMENT '低速等待时长',
`peak_up_price` int COMMENT '高峰时段时间加价金额。单位:分',
`night_up_price` int COMMENT '夜间时段里程加价金额。单位:分',
`pay_type` int COMMENT ' 支付方式:1-微信支付,2-支付宝,3-余额,4-企业支付,5-优惠支付,6-线下支付,8-零元支付,11-银联支付,13-云闪付H5',
`pay_enterprise_id` int COMMENT '支付企业id',
`pay_time` string COMMENT '支付完成时间',
`call_mode` int COMMENT '叫车方式(0:实时:1预约)',
`act_id` int COMMENT '活动ID',
`markup_multiple` decimal(10,2) COMMENT '加价倍率',
`passenger_num` int COMMENT '乘客人数',
`appointment_start_time` string COMMENT '预约开始时间',
`appointment_end_time` string COMMENT '预约结束时间',
`pay_estimate` int COMMENT '预估费用。单位:分',
`esDistance` double COMMENT '预估里程',
`esTime` int COMMENT '预估时间',
`pay_all` int COMMENT '支付费用(可能比产生费用少,比如优惠券之类)',
`pay_normal` int COMMENT '产生费用:里程费 + 时间费 + 过桥费 + 停车费 + 高速费 + 远途费 + ...',
`book_tip` int COMMENT '预约服务费。单位:分',
`passenger_tip` int COMMENT '附加费。单位:分',
`parking_tip` int COMMENT '停车费。单位:分',
`pontage_tip` int COMMENT '过桥费。单位:分',
`tollfee_tip` int COMMENT '高速费。单位:分',
`mileage_price` int COMMENT '里程费。单位:分',
`hour_price` int COMMENT '时长费。单位:分',
`empty_price` int COMMENT '空驶费。单位:分',
`far_up_price` int COMMENT '远途加价金额。单位:分',
`other_up_price` int COMMENT '其他加价金额。单位:分',
`service_fee` int COMMENT '抽成比例',
`driver_income` int COMMENT '抽成之后的实际价格。司机最终收入(司机端显示)。单位:分',
`company_income` int COMMENT '平台收入。单位:分',
`disbursements` int COMMENT '是否系统垫付。0:否1:是',
`driver_evaluate_state` int COMMENT '用户评价状态。0、未评审 1、已评审 2、系统评价',
`renter_evaluate_state` int COMMENT '用户评价状态。0、未评审 1、已评审 2、系统评价',
`cancel_reason_desc` string COMMENT '取消原因',
`field1` string ,
`fieid2` string ,
`field3` string ,
`field4` string ,
`field5` string COMMENT '备用5',
`expected_vehuse_time` string COMMENT '预计用车时间',
`renter_order_remark` string COMMENT '乘客备注',
`bespeak_type` string COMMENT '预约类型(BESPEAK:预约,IMMEDIATE:即时,SHUTTLE:接送机,DAILY_RENT:日租,HALF_DAILY_RENT:半日租)',
`is_voice` int COMMENT '是否语音订单',
`by_car_type` int COMMENT '用户下单操作,"1":快车 "2":出租车 "3":专车 4:一键呼叫多种车型',
`by_car_type_mode` string COMMENT '呼叫方式,1:快车,2:出租车,3:专车,多种方式用逗号分隔',
`push_order_type` int COMMENT '下单场景,1:常规订单,2:摇一摇订单',
`order_business_type` int COMMENT '订单业务类型:"1":快车 "2":出租车 "3":专车 系统派单成功后,更新该字段的值',
`order_base_id` int COMMENT '订单基础表id',
`driver_arrive_appoint_time` string COMMENT '司机到达约定地点时间',
`driver_arrive_appoint_lng` double COMMENT '司机到达约定地点经度',
`driver_arrive_appoint_lat` double COMMENT '司机到达约定地点纬度',
`driver_arrive_appoint_location` string COMMENT '司机到达约定地点名称',
`order_source` int COMMENT '订单来源,1、东风出行APP 2、高德地图 3、H5 4、滴滴 5、东风出行敬老版 6.东风商旅、7.云闪付H5',
`is_invoice` int COMMENT '是否已开票,0、未开票 1、已开票',
`company_service_fee` int COMMENT '司管公司分成比例',
`company_service_income` int COMMENT '司管分成金额。单位:分',
`vehiclel_company_service_fee` int COMMENT '车管公司分成比例',
`vehiclel_company_service_income` int COMMENT '车管分成金额。单位:分',
`channel_service_fee` int COMMENT '渠道分成比例',
`channel_service_income` int COMMENT '渠道分成金额。单位:分',
`driver_fee` int COMMENT '司机分成比例',
`vehiclel_company_id` int COMMENT '车管方id',
`company_service_id` int COMMENT '司管方id',
`channel_service_id` int COMMENT '渠道方id',
`first_renter_no` int COMMENT '一级账号(父账号)',
`second_renter_no` int COMMENT '二级账号(祖账号)',
`first_reward_per` int COMMENT '一级分成占比',
`second_reward_per` int COMMENT '二级分成占比',
`first_order_award` int COMMENT '一级订单分成金额(父)',
`second_order_award` int COMMENT '二级订单分成金额(祖)',
`adjust_amount` int COMMENT '客服调价金额',
`old_pay_normal` int COMMENT '原金额',
`free_amount` int COMMENT '免单金额',
`refund_amount` int COMMENT '已退款金额',
`deduct_travel` int COMMENT '行程费用退款金额',
`deduct_addition` int COMMENT '附加费用退款金额',
`deduct_empty` int COMMENT '空驶费用退款金额',
`open_oid` string COMMENT '第三方订单id',
`open_pid` string COMMENT '第三方乘客id',
`is_replace` int COMMENT '是否是代付订单:0-否,1-是',
`receive_time` string COMMENT '司机接单时间,即时单跟begintime相同',
`driver_source` int COMMENT '接单的司机终端 0 司机端 1车机版',
`black_num_flag` int COMMENT '是否是风险订单,0否,1是',
`activity_amount` int COMMENT '活动打折金额 单元分',
`coupon_amount` int COMMENT '优惠券优惠金额',
`start_poi_id` string COMMENT '起点poiId',
`end_poi_id` string COMMENT '终点poiId',
`driver_property` int COMMENT '司机标识:0 社会 1自营',
`badge_id` int COMMENT '司机徽章id',
`marker_symbol` int COMMENT '灰度标记')
COMMENT '约车订单基本信息表'
PARTITIONED BY (
`month` string)
CLUSTERED BY (
id_)
INTO 5 BUCKETS
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://nameservice1/user/hive/warehouse/ods.db/ods_order_info_nifi'
CREATE external TABLE `ods_qiang` (
`name` string COMMENT '姓名',
`date` string COMMENT '日期',
`time` string COMMENT '时间戳')
COMMENT 'test信息表'
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://nameservice1/user/hive/warehouse/ods.db/ods_qiang'
创建hive分区
alter table ods.ods_order_info_nifi add if not exists partition (month='201910') location '201910';
alter table ods.ods_order_info_nifi add if not exists partition (month='202008') location '202008';
2.进入接口开发:
2.0 创建processor group
POST http://172.16.252.195:8380/nifi-api/process-groups/{最顶级的processorGroupId(也就是root)}/process-groups
需要传递的参数有:
component
1.name:processor group name
2.position:x轴、y轴坐标
3.disconnectedNodeAcknowledged:false
revision
1.clientId :服务器clientId 通过 GET http://{nifiHost}/nifi-api/flow/client-id 获取。
2.version 写死 0
2.1添加模板
POST http://cdh6-df3:8380/nifi-api//process-groups/{当前模板所在processorGroupId}/template-instance
需要传入的参数:
-
disconnectedNodeAcknowledged: false(固定)
-
originX: x轴坐标(double)
- originY: y轴坐标(double)
- templateId: 模板Id 获取:GET http://172.16.252.195:8380/nifi-api/flow/templates 通过返回值的name 获取到templateId
返回值:
获取到每一个processor的processorId
配置 GenerateTableFetch 处理器
PUT http://ip:port/nifi-api/processors/{processorsId}
配置ExecuteSQLRecord
PUT http://ip:port/nifi-api/processors/{processorsId}
配置ConvertAVroToORC
PUT http://ip:port/nifi-api/processors/{processorsId}
配置PutHDFS
PUT http://ip:port/nifi-api/processors/{processorsId}
启动processor group 中 所有的processor
PUT http://{nifihost}/nifi-api/flow/process-groups/{processgroupId}
作者:于二黑
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。