如果你想要知道怎么判断一家公司是否靠谱,一个企业是否值得你加入,你一定要学会判断他的商业模式。

博客围绕商业模式展开,指出商业设计需从四个视角和九个关键点进行分析。四个视角包括提供的价值、服务对象、提供方式和盈利方式;九个关键点涵盖客户细分、价值主张、渠道通路等方面,助力学会分析商业模式。

什么才是商业模式?

商业的设计离不开九个关键点,四个视角,你要学会分析商业模式。

首先四个视角

1.你能够提供什么价值?

2.你为谁提供?

3.你如何提供?

4.你如何赚钱?

九个关键点

1. 客户细分(我可以帮助谁);2. 价值主张(我怎样帮助他人);

3. 渠道通路(怎样宣传自己和交付服务);4. 客户关系(怎样和对方打交道);

5. 收入来源(我能得到什么,不只是钱);6. 核心资源(我是谁,我拥有谁么)

7. 关键业务(我需要做什么);8. 重要合作(谁可以帮我)

9. 成本结构(我要付出什么)

<think>我们正在讨论的是NiFi 1.28版本中替代PutHiveQL处理器的解决方案。根据用户之前的问题,我们已经有一个核心架构和步骤,现在需要针对1.28版本进行调整和补充。 注意:在NiFi 1.28中,虽然PutHiveQL处理器已被标记为弃用,但依然可以使用。不过,官方推荐使用ExecuteSQL/ExecuteSQLRecord处理器结合Hive JDBC连接来实现Hive写入。 核心步骤回顾: 1. 使用DBCPConnectionPool配置Hive JDBC连接池 2. 使用处理器(如ReplaceText或QueryRecord)动态生成Hive SQL语句 3. 使用ExecuteSQL处理器执行生成的SQL 4. 错误处理和性能优化 针对NiFi 1.28的更新点: - NiFi 1.28对Hive 3.x的支持更加完善,但要注意Hive JDBC驱动的兼容性。 - 可以使用ExecuteSQLRecord处理器,它可以直接处理Avro/JSON/CSV等格式的数据,并自动生成参数化SQL,避免手动拼接SQL。 详细步骤: ### 一、准备Hive JDBC连接池(NiFi 1.28) 1. **添加DBCPConnectionPool**: - 配置参数: - Database Connection URL: `jdbc:hive2://<hive_server2>:10000/default` - Database Driver Class Name: `org.apache.hive.jdbc.HiveDriver` - 数据库驱动位置:将Hive JDBC驱动(例如`hive-jdbc-3.1.2-standalone.jar`)放入NiFi的lib目录下(注意版本与集群一致) - 若集群启用Kerberos,需配置Kerberos认证: - Kerberos Credentials Service:选择已配置的KeytabCredentialProvider - Kerberos Service Principal: `hive/_HOST@YOUR.REALM` (替换为实际值) ### 二、生成Hive SQL(两种推荐方案) **方案1:使用ExecuteSQLRecord(推荐)** ```mermaid graph LR A[原始数据] --> B(ConvertRecord) B --> C(ExecuteSQLRecord) C --> D[写入成功] ``` - 步骤: 1. 使用`ConvertRecord`将原始数据(如CSV)转换为Avro或JSON(需要配置AvroReader/CSVReader和AvroRecordSetWriter) 2. 配置`ExecuteSQLRecord`: - Database Connection Pooling Service: 选择前面创建的连接池 - Statement Type: `INSERT` (根据实际情况也可以UPDATE) - Table Name: `${hive.table}` (表名通过属性传入) - Field Containers: 默认值(根据记录结构自动映射) - 优点:自动生成参数化SQL,避免SQL注入,性能较好。 **方案2:使用QueryRecord生成SQL语句(复杂逻辑)** 此方案与之前方案类似,但注意在NiFi 1.28中QueryRecord处理器功能更强大。 ```mermaid graph LR A[原始数据] --> B(QueryRecord) B --> C(ExecuteSQL) ``` - 在`QueryRecord`中通过SQL语句拼接生成完整的INSERT语句,然后将整个FlowFile内容作为SQL语句执行。 ### 三、执行SQL写入 - 使用`ExecuteSQL`或`ExecuteSQLRecord`处理器执行写入。 - 注意:对于大批量写入,建议使用`MergeContent`合并多个FlowFile,然后设置`ExecuteSQL`的Batch Size(例如1000)来提高性能。 ### 四、动态分区设置 在SQL语句中,可以使用NiFi表达式语言动态设置分区值。例如: ```sql INSERT INTO ${hive.table} PARTITION (dt='${now():format('yyyy-MM-dd')}', hour='${now():format('HH')}') VALUES (?, ?) ``` 注意:在`ExecuteSQLRecord`中,表名和分区值都可以通过属性设置,但是分区值需要作为记录中的字段,或者通过表达式动态生成SQL语句。 ### 五、Kerberos认证详细配置(如果集群启用) 1. 配置Kerberos凭证提供者: - 在NiFi的`controller-services`中创建`KeytabCredentialsService`,配置Kerberos主体和keytab路径。 2. 在DBCPConnectionPool中,设置: - Kerberos Credentials Service: 选择上面创建的凭证服务 - Kerberos Service Principal: `hive/<hive_server_hostname>@YOUR.REALM` (注意:使用实际的主机名替换`<hive_server_hostname>`,REALM替换为实际的域名) ### 六、性能优化 1. **调整并发**:增加`ExecuteSQL`处理器的并发任务数(注意不要超过数据库连接池的最大连接数)。 2. **批量处理**: - 使用`MergeContent`合并小文件,设置合适的合并策略(如Max Bin Count, Max Bin Age)。 - 在`ExecuteSQL`中设置Batch Size(每次事务执行的SQL语句数量)。 3. **分区写入**:动态分区写入避免单分区过热。 4. **跳过ACID校验**(如果Hive表是非事务表):在SQL语句前添加设置参数: ```sql SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DummyTxnManager; INSERT INTO ... ``` ### 完整流程示例(NiFi 1.28) ```plaintext GetFile (读取数据文件) ↓ UpdateAttribute (设置属性:hive.table=my_table, partition.date=${now():format('yyyy-MM-dd')}, partition.hour=${now():format('HH')}) ↓ ConvertRecord (CSVReader -> AvroRecordSetWriter) ↓ ExecuteSQLRecord (配置:Table Name=${hive.table}, Statement Type=INSERT, 生成参数化SQL:INSERT INTO my_table PARTITION(dt='${partition.date}', hour='${partition.hour}') VALUES (?, ?)) ↓ 成功/失败处理 ``` 注意:如果使用`ExecuteSQLRecord`,它要求记录中的字段顺序与表中列顺序一致(分区字段不需要在值中出现,因为它们在PARTITION子句中指定)。 相关问题: §§相关问题§§ 1. 在NiFi 1.28中,如何处理Hive写入时的数据类型转换问题? 2. 使用ExecuteSQLRecord时,如何为分区表动态生成插入语句? 3. 如何监控NiFi到Hive的数据写入性能? </think>### Apache NiFi 1.28 高版本 Hive 写入解决方案 #### 一、核心架构升级 ```mermaid graph LR A[数据源] --> B(Transform) B --> C(ExecuteSQLRecord) C --> D[Hive 3.x] D --> E[监控指标] ``` >*NiFi 1.28 推荐使用 `ExecuteSQLRecord` 替代旧方案,支持批处理和动态分区[^1]* #### 二、详细步骤 ##### 步骤 1:配置 Hive JDBC 连接池 1. **创建控制器服务** - 添加 `DBCPConnectionPool` ```properties Database URL = jdbc:hive2://hive-server:10000/default; Driver Class = org.apache.hive.jdbc.HiveDriver Validation Query = SELECT 1 ``` 2. **驱动部署** - 下载匹配驱动包(兼容 Hive 3.x): `hive-jdbc-3.1.3000.7.4.5-xxx-standalone.jar` - 放入 `$NIFI_HOME/lib` ##### 步骤 2:SQL 动态生成(分区写入) **方案:ExecuteSQLRecord + 表达式** ```properties 处理器:ExecuteSQLRecord Table Name = logs Statement Type = INSERT Partition Clause = dt='${now():toDate('yyyy-MM-dd')}', hour='${now():toDate('HH')}' ``` >*动态分区表达式自动生成路径 `/dt=2024-07-25/hour=14`[^4]* ##### 步骤 3:Kerberos 认证配置 ```properties DBCPConnectionPool 附加参数: hive.server2.authentication = KERBEROS kerberos.principal = nifi/_HOST@REALM kerberos.keytab = /etc/security/keytabs/nifi.keytab ``` >*需同步配置 `krb5.conf` 路径到 NiFi JVM 参数[^1]* ##### 步骤 4:性能优化 ```mermaid graph TB A[SplitJson] --> B[PartitionRecord] B --> C[MergeContent] C --> D[ExecuteSQLRecord] ``` - **关键参数**: ```properties PartitionRecord.partition.size = 1000 // 每分区文件数 MergeContent.max.bin.count = 10,000 // 单次批量写入量 ExecuteSQLRecord.batch.size = 500 // JDBC批处理大小 ``` #### 三、监控配置 1. **Prometheus 集成** ```properties nifi.metrics.prometheus.port=9092 nifi.metrics.query = SELECT bytesWritten, elapsedTime FROM ExecuteSQLRecord WHERE componentId='xxx' ``` 2. **Grafana 看板** - 关键指标: - 写入吞吐量:`rate(nifi_bytesWritten[5m])` - 分区延迟:`nifi_elapsedTime{attribute="partition"}` #### 四、完整流程示例 ```plaintext GetKafka (topic=logs) ↓ PartitionRecord (分区字段=dt, hour) ↓ ConvertRecord (JSON→Avro) ↓ MergeContent (max.bin.size=128MB) ↓ ExecuteSQLRecord (Hive表=logs, 分区动态表达式) ↓ PrometheusReportingTask (监控写入延迟) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值