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

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
kettle案例七连接hive--抽取mongodb的数据保存到hive_第1张图片

在服务器上找到所有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
如下图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第2张图片

下载的包如下,都是hive开头的jar包:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第3张图片

放入D:\kettle\data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp25\lib路径中如下图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第4张图片

修改plugin.properties文件

找到kettle安装目录下的plugins/pentaho-big-data-plugin/plugin.properties文件,我的路径是:
D:\kettle\data-integration\plugins\pentaho-big-data-plugin。
如下图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第5张图片

内容如下:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第6张图片

这里hdp25与path参数hadoop-configurations需要与自己的安装目录路径对应如下:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第7张图片

重启kettle新建DB连接

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

新建流程

新建流程如下:
MongoDB Input—》表输出
kettle案例七连接hive--抽取mongodb的数据保存到hive_第9张图片

MongoDB Input输入ip和端口以及数据库集合和获取字段。
kettle案例七连接hive--抽取mongodb的数据保存到hive_第10张图片
kettle案例七连接hive--抽取mongodb的数据保存到hive_第11张图片
kettle案例七连接hive--抽取mongodb的数据保存到hive_第12张图片

表输出
表输出选择新建的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--抽取mongodb的数据保存到hive_第13张图片

执行测试

点击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案例七连接hive--抽取mongodb的数据保存到hive_第14张图片

重启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可不填。)
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第15张图片
HDFS的Hostname和Port在core-site.xml中,节点为fs.defaultFS。
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第16张图片
用户名密码使用可访问hdfs的用户名密码。

JobTracker的Hostname和Port在yarn-site.xml中,节点为yarn.resourcemanager.address.rm187。
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第17张图片

Zookeeper的Hostname和Port在yarn-site.xml中,节点为yarn.resourcemanager.zk-address。
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第18张图片

可能遇到的问题

the hadoop file system url does not match the url in the shims core-site.xml
kettle案例七连接hive--抽取mongodb的数据保存到hive_第19张图片
警告的原因是因为 配置的 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
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第20张图片

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

ping host250

如图已生效
kettle案例七连接hive--抽取mongodb的数据保存到hive_第21张图片

最终配置修改如下,测试成功:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第22张图片
有一部分因为没有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脚本在核心对象-脚本目录。
kettle案例七连接hive--抽取mongodb的数据保存到hive_第23张图片
通过MongoDB Input的方式,从mongodb数据库读取数据,然后通过Hadoop File Output将mongodb数据库的数据以数据文件的方式,输出到hadoop的hdfs,然后执行SQL脚本,将数据文件加载到hive的表中。

MongoDB Input输入ip和端口以及数据库集合和获取字段。
kettle案例七连接hive--抽取mongodb的数据保存到hive_第24张图片
kettle案例七连接hive--抽取mongodb的数据保存到hive_第25张图片
kettle案例七连接hive--抽取mongodb的数据保存到hive_第26张图片

Hadoop File Output
hadoop file output组件在配置如下:
文件栏选择 集群和浏览选中存放数据文件夹和文件名
kettle案例七连接hive--抽取mongodb的数据保存到hive_第27张图片
如图,存放的路径是/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。
选中快速数据存储。
kettle案例七连接hive--抽取mongodb的数据保存到hive_第28张图片

在字段栏里面获取字段
kettle案例七连接hive--抽取mongodb的数据保存到hive_第29张图片

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

我们这里使用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脚本设置如下:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第31张图片

测试运行

点击运行。
运行情况如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第32张图片

使用命令查看hdfs中的文件

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

如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第33张图片

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

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

kettle案例七连接hive--抽取mongodb的数据保存到hive_第34张图片

查看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输出没有完成时,我们就进行加载了,这样会有问题。
解决方法加入阻塞数据流程。
阻塞数据在核心对象-流程目录。
如图:
kettle案例七连接hive--抽取mongodb的数据保存到hive_第35张图片

重新运行测试。
kettle案例七连接hive--抽取mongodb的数据保存到hive_第36张图片
kettle案例七连接hive--抽取mongodb的数据保存到hive_第37张图片

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

你可能感兴趣的:(数据仓库)