基于kettle实现mysql-hive的数据传输(生产环境)

首先说明一下为什么不用sqoop导入数据?因为生产环境的网络隔离,集群给客户端开放的端口有限导致sqoop客户端连任务都提交不了。雄心勃勃的我决定模仿sqoop写一个工具,经过两天的奋战终于完成我的开发,不管从功能还是使用方式妥妥的sqoop阉割版;信心满满的告诉项目经理我解决了数据传输问题(100w条数据10s导入hive),于是我详细介绍我的思路,技术等,最终我被毙了!!!理由是代码不方便他维护,“你把手头事放一放研究一下kettle吧”。好吧,你技术好我听你的!!!经过一天的摸索使用,实现了数据传输的同时有了这一篇的博文

一、windows部署测试

1.1 安装

  1. kettle安装包(国内镜像
  2. jdk1.8(高了不行)
  3. mysql驱动包

解压pdi-ce-8.2.0.0-342.zip安装包,并将mysql驱动包复制到lib下,双击spoon.bat启动,首页如下:
首页
简单介绍一下kettle的任务类别,分为转换作业,转换的意思就是完成一种任务的流程,而作业就是将转换给串联起来。比如讲mysql数据导入至hive,一般来说就是读取mysql数据讲数据上传至hdfs,再通过hive的load加载数据,那么mysql到hdfs可以写成一个转换,加载数据可以执行shell脚本。当然所有的任务都可以写成一个转换,但作业有个好处就是可以实现定时调度的功能(作业也有不同于转换的其他功能),这在etl工作中尤为重要。

1.2 测试

新建一个转换,从核心对象中的输入拖入一个表输入,双击编辑内容
在这里插入图片描述
首次使用数据库连接是空的,选择新建添加数据库连接,配置完属性后记得点击测试连接一下数据库
在这里插入图片描述
在SQL中写下你的查询语句,记得点击预览查看数据是否是你想要的
在这里插入图片描述
这样数据输入就配置完成,接下来就是将数据写入hdfs中,从big data中拖入hadoop file output,按住shift点击表输入再点击hadoop file output将两部分连接起来,意思就是表输入的数据输出至hdfs
在这里插入图片描述
这时候会发现一个问题,kettle并不知道我们的集群信息,因此需要配置集群信息。进入安装目录plugins\pentaho-big-data-plugin\hadoop-configurations\hdp26,里面就有集群的配置信息,我们只需要将里面的配置文件替换成集群中的文件即可,退回至pentaho-big-data-plugin目录下修改plugin.properties中的配置信息

# The Hadoop Configuration to use when communicating with a Hadoop cluster. This is used for all Hadoop client tools
# including HDFS, Hive, HBase, and Sqoop.
# For more configuration options specific to the Hadoop configuration choosen
# here see the config.properties file in that configuration's directory.
# 因为我们将配置信息放在hdf26文件夹下
active.hadoop.configuration=hdp26

保存转换后重启kettle,双击编辑hadoop file output
在这里插入图片描述
新建集群属性,根据集群的配置填写相关信息即可,点击测试查看联通情况(可以不用全写)
在这里插入图片描述
我使用的是华三大数据平台,其中的配置信息做了封装,只要Hadoop File System Connection能通即可。配置好后的预览Folder/File就是hdfs的路径了,注意文件的分隔符,因为需要导入到hive中,注意不要勾选头部,不然会将表头也导入至hive中就不好了。
在这里插入图片描述
保存后点击运行开始测试。


不出意外的话运行是会报错的,如:Permission denied。是因为kettle会以当前windows用户想hdfs集群上传文件,正常情况下权限是通不过的。因此需要修改spoon.bat119行在后面添加如下信息,将用户名配置成可以操作hdfs的用户

"-DHADOOP_USER_NAME=hdfs" "-Dfile.encoding=UTF-8"

测试通过

[root@node1 mysql2hive]# hadoop fs -ls /hive_data/
Found 1 items
-rw-rw----   3 hdfs hdfs    1495550 2020-12-18 05:15 /hive_data/bigtable

接下来就是执行shell脚本,只有在作业中才可以执行shell,因此新建作业在通用中拉去start,这个组件就是可以设置定时调度之类的

在这里插入图片描述
再拉去转换,将刚才写的转换设置进去后从脚本中拉取Shell即可
在这里插入图片描述
我是将导入命令封装成脚本,并且配置了环境变量,脚本内容如下:

#!/bin/bash
beeline -u "jdbc:hive2://node1:10000" -n hdfs -p "" -e "load data inpath '/hive_data/bigtable' into table hc.bigtable"

点击运行,放心绝对报错;但hdfs是有数据的,也就是说执行shell出了错
在这里插入图片描述
脚本在服务器上,作业在windows上运行,能跑通才有问题,因此就需要我们在服务器上跑这个作业。

二、Linux运行

2.1 配置资源库

为什么要有这个东西

首先linux下是没有图形化界面的,这就限制了这个工具的使用,但是它推出了资源库这个概念,只要在windows下连接这个资源库将写好的作业保存,之后就可以无缝的在linux执行这个资源库(真的非常方便)


点击右上角`Connect - Repository Manager - Add - Other Repositories - Database Repository` 之后和上面配置数据库连接一样,注意提前建好一个空库用于kettle创建它的表(自动的),配置完成后即可登录默认用户名和密码都是`admin`,登录成功后界面没有任何变化,但当你想要打卡编辑过的作业后发现页面不一样了,这是因为你连接到了资源库,默认从资源库打开

在这里插入图片描述
点击文件 —— 从xml文件导入,即可导入本地文件然后保存至资源库即可。

2.2 部署

将下载的pdi-ce-8.2.0.0-342.zip上传至服务器后解压即可

unzip pdi-ce-8.2.0.0-342.zip

同时将C:\Users\hc\.kettle文件夹上传至当前用户的/home下,这个文件报错了你的配置信息包括资源库信息。同时修改一些配置如修改spoon.sh设置操作用户,修改big data插件添加hdp26,将集群配置文件软连接过去,放置数据库驱动等等。

2.3 测试

介绍两个启动命令

kitchen.sh  启动作业
-rep=资源库名称
-job=作业名称
-user=用户名 
-pass=密码
-log-dir=日志路径 
-dir=作业所在的资源库路径
pan.sh 启动转换
-rep=资源库名称
-trans=转换名称
-user=用户名 
-pass=密码
-dir=转换所在的资源库路径

启动作业

./kitchen.sh -rep=mysql_rep -job=job_mysqlToHive -user=admin -pass=admin -log-dir=./log.txt -dir=/

不负众望成功报错

2020/12/18 10:07:40 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) WARNING: Use "yarn jar" to launch YARN applications.
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Connecting to jdbc:hive2://node1:10000
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Connected to: Apache Hive (version 1.2.1.2.3.4.0-3485)
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Driver: Hive JDBC (version 1.2.1.2.3.4.0-3485)
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Transaction isolation: TRANSACTION_REPEATABLE_READ
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Error: Error while compiling statement: FAILED: SemanticException Line 1:17 Invalid path ''/hive_data/bigtable'': No files matching path hdfs://myCluster/hive_data/bigtable (state=42000,code=40000)
2020/12/18 10:07:41 - Shell - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : (stderr) Closing: 0: jdbc:hive2://node1:10000
2020/12/18 10:07:41 - job_mysqlToHive - Finished job entry [Shell] (result=[false])
2020/12/18 10:07:41 - job_mysqlToHive - Finished job entry [saveToHdfs] (result=[false])
2020/12/18 10:07:41 - job_mysqlToHive - Job execution finished
2020/12/18 10:07:41 - Carte - Installing timer to purge stale objects after 1440 minutes.
2020/12/18 10:07:41 - Kitchen - Finished!
2020/12/18 10:07:41 - Kitchen - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Finished with errors
2020/12/18 10:07:41 - Kitchen - Start=2020/12/18 10:07:25.577, Stop=2020/12/18 10:07:41.668
2020/12/18 10:07:41 - Kitchen - Processing ended after 16 seconds.

从日志中可以看出是执行load命令报错,报错信息指出找不到hdfs上的文件,这是为什么呢?在windows中测试都能成功写入转到服务器缺写入不了,神奇的是写入过程是没有报错的,也就是数据确实落盘了。最终一次偶然的ll命令我发现了它

[root@node1 data-integration]# ll
total 11592
-rw-rw-r--.  1 root root     1485 Nov 14  2018 Carte.bat
-rwxr-xr-x.  1 root root     1470 Nov 14  2018 carte.sh
drwxrwxrwx.  2 root root      126 Nov 14  2018 classes
drwxrwxrwx.  3 root root       35 Nov 14  2018 Data Integration.app
drwxr-xr-x.  2 root root       59 Nov 14  2018 Data Service JDBC Driver
drwxrwxrwx.  3 root root       39 Nov 14  2018 docs
-rw-rw-r--.  1 root root     1072 Nov 14  2018 Encr.bat
-rwxr-xr-x.  1 root root     1031 Nov 14  2018 encr.sh
drwxr-xr-x.  3 root root       23 Dec 18 10:06 hdfs:
...

原来它将数据写到了当前目录也就是本地,这个我就理解不了了…在我的不懈努力下终于被我google到了,在spoon.sh中添加-Dpentaho.karaf.root.transient=true就可以了,最终我的那一行配置如下:

OPT="$OPT $PENTAHO_DI_JAVA_OPTIONS 
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 
-Djava.library.path=$LIBPATH 
-DKETTLE_HOME=$KETTLE_HOME 
-DKETTLE_REPOSITORY=$KETTLE_REPOSITORY 
-DKETTLE_USER=$KETTLE_USER 
-DKETTLE_PASSWORD=$KETTLE_PASSWORD 
-DKETTLE_PLUGIN_PACKAGES=$KETTLE_PLUGIN_PACKAGES 
-DKETTLE_LOG_SIZE_LIMIT=$KETTLE_LOG_SIZE_LIMIT 
-DKETTLE_JNDI_ROOT=$KETTLE_JNDI_ROOT 
-DHADOOP_USER_NAME=hdfs 
-Dfile.encoding=UTF-8 
-Dpentaho.karaf.root.transient=true"

在此运行,明显发现日志变长了😄😄😄,加载了很多莫名其妙的jar包,感觉能成

2020/12/18 10:16:42 - job_mysqlToHive - Starting entry [Dummy]
2020/12/18 10:16:42 - job_mysqlToHive - Finished job entry [Dummy] (result=[true])
2020/12/18 10:16:42 - job_mysqlToHive - Finished job entry [Shell] (result=[true])
2020/12/18 10:16:42 - job_mysqlToHive - Finished job entry [saveToHdfs] (result=[true])
2020/12/18 10:16:42 - job_mysqlToHive - Job execution finished
2020/12/18 10:16:42 - Kitchen - Finished!
2020/12/18 10:16:42 - Kitchen - Start=2020/12/18 10:16:01.716, Stop=2020/12/18 10:16:42.647
2020/12/18 10:16:42 - Kitchen - Processing ended after 40 seconds.

才接触到kettle两天很多功能都没有摸清楚,比如设置变量就不太会操作(考虑到hive的分区表之类的,虽然可以在shell脚本中获取),之后会一直研究kettle的使用感兴趣的小伙伴可以给个联系方式一起交流、一起进步、一起涨工资…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小王是个弟弟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值