首先说明一下为什么不用sqoop导入数据?因为生产环境的网络隔离,集群给客户端开放的端口有限导致sqoop客户端连任务都提交不了。雄心勃勃的我决定模仿sqoop写一个工具,经过两天的奋战终于完成我的开发,不管从功能还是使用方式妥妥的sqoop阉割版;信心满满的告诉项目经理我解决了数据传输问题(100w条数据10s导入hive),于是我详细介绍我的思路,技术等,最终我被毙了!!!理由是代码不方便他维护,“你把手头事放一放研究一下kettle吧”。好吧,你技术好我听你的!!!经过一天的摸索使用,实现了数据传输的同时有了这一篇的博文
一、windows部署测试
1.1 安装
- kettle安装包(国内镜像)
- jdk1.8(高了不行)
- 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.bat
119行在后面添加如下信息,将用户名配置成可以操作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的使用感兴趣的小伙伴可以给个联系方式一起交流、一起进步、一起涨工资…