kettle案例七连接hive--抽取mongodb的数据保存到hive

本文介绍使用Kettle通过两种方式将MongoDB数据导入Hive的方法。一是利用HiveServer2进行JDBC连接,适用于少量数据;二是采用HadoopFileOutput组件将数据输出到HDFS,再使用SQL脚本加载到Hive,适用于大批量数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive作为数据仓库的载体,一般情况下我们会经常把数据保存到hive中。

本章通过抽取mongodb的数据保存到hive的案例来学习连接hive。

kettle把数据导入hive有两种思路
一种是通过hiveserver2使用JDBC的连接方式,这种是一条一条的进行写入,可能速度上要慢一些。
一种是使用Hadoop File Input方式把文件放入hdfs,然后使用hive命令来加载。适合大块批量的数据保存到hive。

方式一hiveserver2模式

在hive中启动hiveserver2

我们在之前的文章中已经了解了hiveserver2。
hadoop组件—数据仓库(五)—通过JDBC连接hive的thrift或者hiveserver2

在使用JDBC方式连接hive之前需要启动hiveserver2。
使用命令

hive --service hiveserver2

下载对应的hive jar包

在kettle的安装目录中找到hadoop-configurations文件夹,如下:
D:\kettle\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations

在服务器上找到所有hive的相关jar包,下载下来放入hadoop-configurations目录下的hdp25的lib文件夹中。
如何找到服务器上找到所有hive的相关jar包,如果是自己安装的原生hive,那么在hive的安装目录中查找。
如果是通过CDH来安装的,可以参考文章:
hadoop基础—-hadoop实战(十一)—–hadoop管理工具—CDH的目录结构了解
通过CDH安装的hive jar包一般保存在/opt/cloudera/parcels/CDH/lib/hive中。
使用命令
cd /opt/cloudera/parcels/CDH/lib/hive
ls
如下图:

下载的包如下,都是hive开头的jar包:

放入D:\kettle\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp25\lib路径中如下图:

修改plugin.properties文件

找到kettle安装目录下的plugins/pentaho-big-data-plugin/plugin.properties文件,我的路径是:
D:\kettle\data-integration\plugins\pentaho-big-data-plugin。
如下图:

内容如下:

这里hdp25与path参数hadoop-configurations需要与自己的安装目录路径对应如下:

重启kettle新建DB连接

修改配置后以及新增jar包后需要重启kettle才生效。
重启后尝试建立DB连接如下:
主对象树–》DB连接右键新建—》填写相关参数(参数与自己的hivesever2的ip端口数据库名以及可登陆linux系统访问hiveserver2的用户名对应)
如图:

新建流程

新建流程如下:
MongoDB Input—》表输出

MongoDB Input输入ip和端口以及数据库集合和获取字段。


表输出
表输出选择新建的DB连接hive2以及浏览选择数据库和表。
如果表还没新建则需要先在hive shell中新建表,数据结构需要与输出对应。
我这里使用命令如下:

hive shell
CREATE TABLE family (date string,id string,type string,code string,userId string,createDate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

最终表输出设置如图:

执行测试

点击kettle运行。
执行情况如下:

在hive的集群中使用命令查看数据:

hive shell
select * from family;

输出如图:
可以看到已经有数据写入了:

我们发现记录是一条一条插入hive的,因为hive的insert也会执行mapreduce,所以一条一条的插入速度非常慢。
这就是我们需要第二种方式Hadoop File Input导入的原因。

方式二Hadoop File Input

我们发现使用JDBC方式进行导入是一条一条记录进行导入的,速度非常尴尬,几乎不可用。
我们还有另外一种思路可以大数据量的进行处理。
通过kettle提供的Hadoop File Output 组件将数据以数据文件的方式导入到hadoop的hdfs。然后通后通过执行sql脚本,使用hive 支持的 load data inpath into table 的方式,将hdfs的数据文件,加载到hive表中。

详细步骤如下:

下载hadoop cluster配置文件

从服务器hadoop etc的配置文件中下载如下4个配置文件,覆盖kettle的plugins\pentaho-big-data-plugin\hadoop-configurations\hdp25中的4个同名文件。
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml

如果是CDH安装的Hadoop,hadoop etc的配置文件在服务器中的路径是/etc/hadoop/。如下:

ls /etc/hadoop

放入路径如下:
D:\kettle\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp25

重启kettle新建hadoop cluster 连接

主对象树–》Hadoop clusters—》填写相关参数(根据上面4个配置文件填写配置的hostname 和端口号以及用户名密码,其中:Cluster Name 自定义集群名字;Hdfs Hostname为集群active Namenode ip,端口默认为8020;JobTracker为集群运用resource manager 权限的节点ip,端口默认为8032;ZooKeeper Hostname为对应节点ip,默认端口为2181;Oozie可不填。)
如图:

HDFS的Hostname和Port在core-site.xml中,节点为fs.defaultFS。
如图:

用户名密码使用可访问hdfs的用户名密码。

JobTracker的Hostname和Port在yarn-site.xml中,节点为yarn.resourcemanager.address.rm187。
如图:

Zookeeper的Hostname和Port在yarn-site.xml中,节点为yarn.resourcemanager.zk-address。
如图:

可能遇到的问题

the hadoop file system url does not match the url in the shims core-site.xml

警告的原因是因为 配置的 url 与 xml 配置文件里面的 url 不一样
xml 里面用的 hostname 连接的,而我们配置的时候用的 ip,
将 ip 改为 hostname即可测试用过。
注意,用 hostname时,本地需要 添加 hosts 配置。
以windows添加hosts为例:
打开c:\windows\system32\drivers\etc文件夹找到hosts,右键使用管理员权限打开hosts文件,新增对应关系如下:
192.168.30.217 host217
192.168.30.250 host250
192.168.30.252 host252
192.168.30.251 host251
如图:

win+R输入cmd运行进入cmd模式检测host对应是否生效:

ping host250

如图已生效

最终配置修改如下,测试成功:

有一部分因为没有root账户密码权限的问题仍然错误,不过不影响,只要Hadoop File System Connection 没报错就行。
Ping Job Tracker/Resource Manager报错如果确认地址端口正确可以多测试几次,受网络影响。

新建流程

新建流程如下:
MongoDB Input—》Hadoop File Output—》执行SQL脚本
MongoDB Input在核心对象-Big Data目录。
Hadoop File Output在核心-对象Big Data目录。
执行SQL脚本在核心对象-脚本目录。

通过MongoDB Input的方式,从mongodb数据库读取数据,然后通过Hadoop File Output将mongodb数据库的数据以数据文件的方式,输出到hadoop的hdfs,然后执行SQL脚本,将数据文件加载到hive的表中。

MongoDB Input输入ip和端口以及数据库集合和获取字段。


Hadoop File Output
hadoop file output组件在配置如下:
文件栏选择 集群和浏览选中存放数据文件夹和文件名

如图,存放的路径是/user/hive/warehouse,文件名是family.txt。
完整路径是/user/hive/warehouse/family.txt。
注意,尽量选择/user/hive/warehouse下的路径,否则可能因为权限原因创建不成功。

在内容栏里面注意标红的几个配置

分隔符选择要与hive外表字段分割符相对应(row format delimited fields terminated by ‘\t’ loaction ‘/../../文件位置’),所以我们的分隔符使用Tab。
封闭符去掉。
头部表示是否显示列名,我们这里去掉勾选。
格式选择Unix,因为我们的hadoop是安装在linux系统的。
编码选择UTF-8。
选中快速数据存储。

在字段栏里面获取字段

执行SQL脚本
使用SQL脚本之前需要新建hive表连接,步骤如下:
主对象树–》DB连接右键新建—》填写相关参数(参数与自己的hivesever2的ip端口数据库名以及可访问hdfs文件存储路径的用户名对应,这里使用hdfs)
如图:

我们这里使用SQL脚本新建表并且加载数据,数据结构需要与输出对应。
我这里使用命令如下:

DROP TABLE family;
CREATE TABLE family (date string,id string,type string,code string,userId string,createDate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
LOAD DATA INPATH '/user/hive/warehouse/family.txt' OVERWRITE INTO TABLE family;

这里路径和文件名与Hadoop File Output文件栏中的Folder/File对应。
SQL脚本设置如下:

测试运行

点击运行。
运行情况如图:

使用命令查看hdfs中的文件

hdfs dfs -ls /user/hive/warehouse
hdfs dfs -cat /user/hive/warehouse/family.txt

如图:

使用命令查看hdfs中的文件中的数据数量,确保完整性。

hdfs dfs -cat /user/hive/warehouse/family.txt|wc -l

查看family表里的数据使用命令

hive shell;
select * from family;
select count(1) from family;

kettle执行顺序之可能存在的问题

在上面的测试中我们发现Hadoop File Output输出的文件family.txt并没有包含所有的数据。hive的family表格中数据为空。
这是因为kettle的执行顺序导致的。
kettle中转换和作业的执行顺序:
1、一个作业内的转换,是顺序执行的。
2、一个转换内的步骤是并行执行的。
3、作业内不支持事务,转换内支持事务。
根据业务需要,通常需要在转换内顺序执行,小技巧如下:
1、执行SQL是优先于所有步骤。
2、使用“阻塞数据直到步骤都完成”,确保其他数据步骤都完成再进行下一步骤。
事务:
1、设置转换只使用一个事务。转换设置–>夹项–>使用唯一连接。
2、设置转换内的表插入等数据库的操作不进行批量提交。”提交记录数量”–>0

也就是说 转换中的执行SQL会先执行,所以Hadoop File Output输出没有完成时,我们就进行加载了,这样会有问题。
解决方法加入阻塞数据流程。
阻塞数据在核心对象-流程目录。
如图:

重新运行测试。

3秒钟完成导入hive成功!!!

<think>好的,我现在要解决的问题是如何将数据合并到自定义系统而不是Hive。首先,我需要理解用户的需求。用户希望绕过Hive,直接将数据整合到他们自己的系统中。这可能涉及到数据集成的方法、工具选择、技术实现等方面。 根据引用内容,系统整合有不同类型,比如应用级别整合、统一访问整合、明细数据整合和数据服务整合。用户提到的自定义系统可能属于应用级别或数据服务整合,需要明确他们系统的整合级别。引用[1]提到固定报表系统和查询系统属于应用级别整合,而呼叫中心等属于数据服务整合,所以可能需要参考这些案例。 接下来,用户需要技术方案。引用[4]提到数据源接入和修改数据源定义的问题,说明易用性和系统化管理很重要。因此,设计自定义系统的数据整合时,需要考虑如何高效接入数据源,并灵活调整数据模型。 可能的步骤包括: 1. **确定整合类型**:明确是应用级别还是数据服务整合,这会影响后续技术选型。比如,应用级别可能需要API集成,而数据服务可能需要消息队列或ETL工具。 2. **选择数据接入方式**:直接数据连接、API接口、文件传输等。需要确保自定义系统支持这些方式,并处理不同数据格式。 3. **设计数据转换逻辑**:数据清洗、转换规则,可能需要使用工具如Apache NiFi或自定义脚本。 4. **元数据管理**:引用[3]提到血缘产品定位,需要集成元数据采集,确保数据来源和转换过程可追溯。 5. **系统运营和维护**:引用[2]指出系统上线后运营的重要性,需考虑监控、数据质量检查和持续优化。 需要注意的问题包括数据一致性、性能影响、安全性。例如,直接写入自定义系统可能增加负载,需优化写入方式。此外,权限控制和数据加密也是关键点。 可能的相关问题会涉及具体工具推荐、性能优化方法、数据迁移步骤等,需要根据引用内容中的整合类型和运营建议来扩展。</think>### 如何将数据合并到自定义系统而非Hive? 要将数据整合到自有系统而非Hive,需根据数据整合类型(如应用级别、明细数据数据服务整合)设计适配方案,具体步骤如下: --- #### **1. 确定整合类型与目标** - **应用级别整合**:若自定义系统需要直接展示固定报表或查询结果,可通过API或SDK将数据推送到系统前端模块[^1]。 - **明细数据整合**:若需支持智能分析或CRM场景,需将原始数据清洗后写入自定义系统的存储引擎(如关系型数据库或NoSQL)。 - **数据服务整合**:若需对接营销管理、呼叫中心等实时场景,建议采用消息队列(如Kafka)或微服务接口实现异步传输。 --- #### **2. 选择数据接入方式** - **直接写入**:通过ETL工具(如Apache NiFi、Kettle)将数据源(如MySQL、日志文件)直接抽取到自定义系统的存储层,绕过Hive- **API集成**:若数据源提供RESTful接口,可编写适配器将数据实时/批量推送至自定义系统,例如: ```python import requests data = {"field1": value1, "field2": value2} response = requests.post("https://custom-system-api/data", json=data) ``` - **文件传输**:定期生成CSV/Parquet文件,通过FTP/SFTP同步到自定义系统目录,触发加载程序入库。 --- #### **3. 设计数据模型与转换规则** - **元数据适配**:根据引用[3],需对齐自定义系统与数据源的元数据(如字段类型、业务含义),可通过配置文件或动态映射表实现兼容性。 - **血缘追踪**:在数据写入时记录来源、处理步骤(如过滤、聚合),便于后续排查问题[^3]。 --- #### **4. 实现高效数据写入** - **分批次提交**:避免单次写入数据量过大,采用分页或流式处理。 - **异步处理**:使用队列(如RabbitMQ)解耦数据接收与持久化,提升吞吐量。 - **缓存机制**:对高频访问数据(如用户画像)增加缓存层(如Redis),降低直接读写压力。 --- #### **5. 系统运营与优化** - **监控告警**:跟踪数据延迟、错误率等指标,设置阈值触发通知[^2]。 - **自动化运维**:引用[4]提到,可通过脚本自动处理数据源变更(如字段增减),减少人工干预。 - **数据质量检查**:在写入前后校验完整性(如非空字段)、一致性(如外键约束)。 --- #### **关键注意事项** - **安全性**:传输时使用HTTPS/SSL加密,存储时按需脱敏(如手机号掩码)。 - **兼容性**:预留扩展字段或Schema-Free设计(如MongoDB),适应未来数据结构变化。 - **性能基准测试**:对比自定义系统与Hive的读写效率,针对性优化(如索引、分区)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿泽财商会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值