一.问题描述
使用kettle的过程中,发现mysql导mysql,Excel等都没问题,而且hive导入mysql都没问题。
使用mysql导入hive却无法成功,具体表现为导入成功两条并且报错如下(可以不看,直接进行后续操作尝试):
2024-09-11 20:33:59.421 INFO <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 完成处理 (I=0, O=1, R=2, W=0, U=0, E=1)
2024-09-11 20:33:59.427 ERROR <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 错误被检测到!
2024-09-11 20:33:59.427 ERROR <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 错误被检测到!
2024-09-11 20:33:59.440 ERROR <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 错误被检测到!
2024-09-11 20:33:59.451 WARN <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 转换被检测
2024-09-11 20:33:59.451 WARN <mysqltohive2 - 表输出> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 转换正在杀死其他步骤!
2024-09-11 20:36:34.361 INFO <Thread-103> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 为了转换解除补丁开始 [mysqltohive2]
2024-09-11 20:36:34.456 INFO <mysqltohive2 - 表输入> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] Finished reading query, closing connection.
2024-09-11 20:36:34.458 INFO <mysqltohive2 - 表输入> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] 完成处理 (I=14, O=0, R=0, W=14, U=0, E=0)
2024-09-11 20:36:38.837 ERROR <mysqltohive2 - 插入 / 更新> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] Error in step, asking everyone to stop because of:
2024-09-11 20:36:38.838 ERROR <mysqltohive2 - 插入 / 更新> [E:\JAVA_CODE\spoon\kettle_ktr\mysqltohive2.ktr] org.pentaho.di.core.exception.KettleDatabaseException:
Error inserting/updating row
Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask
以下是本人进行的尝试,亲测可用,希望能对你有所帮助。
二.解决问题其一,先上传到hdfs再加载到hive
这个是我经过在互联网上搜索后,大部分帖子所写方法,操作非常的繁琐,但是本人也已经尝试过了,还是简单的写一下吧。
首先我们需要创建一个hdfs的连接才能往上传数据,首先创建一个driver如下图操作:
选择的位置在data-integration\ADDITIONAL-FILES\drivers,在你软件安装的文件夹里找最后选择如图这个hdp30,然后next即可。
添加成功如图:
这样我们就可以开始创建连接了,需要注意的是,在添加之后很大概率会在创建hdfs连接时出现无法显示driver的情况,但这并不是我们没有添加成功,而是软件的问题需要重启!因此可以直接在添加成功后重启一下再继续操作。
继续操作如下,在刚才添加driver的位置,但是这次选择第一个新建一个连接,
界面如图啊,hdfs的hostname就是你的ip,比如我的配置的集群是在虚拟机,写的就是我的虚拟机的ip,而我的ip又设置了hosts文件所以可以直接写虚拟机的名字bigdata,改成你自己的即可。
port看版本决定,新版本访问web的端口是9870那么交互端口写的就是9820,
如果使用的是旧的端口号那就是8020。
剩下的site xml files怎么设置呢?
在软件的如下路径里data-integration\plugins\pentaho-big-data-plugin\hadoop-configurations\hdp30
配置完成后点击next,一般来说会报错,但是实际上已经可以用了,
点击这个查看结果,点开第一个hadoop下的显示发现connection是绿色的,那就说明可以了如下图:
好了,至此我们的前置操作完成了准备开始导入导出表,三个对象连接如图:
第一个是mysql输入
第二个是往hdfs输出,在文件的第一个红框选择路径的时候不能选择hdfs的原生文件夹,否则会报错没有权限,因此可以直接写一个不存在的文件夹勾选创建父目录让他执行时自动创建,并且不要加后缀名,因为下面扩展名里有选择txt了比如我的就是在kettle下创建了一个b.txt文件。
如果你想要往原生文件夹传怎么办呢?运行如下命令直接全部权利!但是没啥必要,不建议瞎改hdfs的原生文件夹。
hdfs dfs -chmod -R 777 /home
在内容选择编码,分隔符可改可不改但是导入的时候要跟你创建表的分隔符保持一致,头部是默认勾选的,去掉,因为它会把表字段当头部传上去,导致无法导入。
最后在字段点击获取字段,最小间隔可点可不点不影响结果看需求然后就配置完成了。
到这一步运行就会发现可以上传到hdfs了,那该怎么导入hive表呢?
编写一个脚本
脚本里放的三句sql分别是:
1.使用你要穿的hive表的数据库我的数据库是kettle换成你自己的,
use kettle;
2.删除表并保留表结构,可要可不要这一句,
truncate table homework01;
3.加载到表,inpath里的是hdfs上传到到位置,后面的是表名字均要改成你自己的,
load data inpath '/kettle/b.txt' into table homework01;
use kettle;
truncate table homework01;
load data inpath '/kettle/b.txt' into table homework01;
这时点击执行就实现了从mysql导入hive,
亲测可用,但是
从配置连接到现在十分的麻烦,而且步步是坑处处是错,非常的恶心,但是网上又没用其他的方式,
可以试试我的这个方法非常简便请看解决问题其三。
三.解决问题其三,添加.hiverc配置
这个方法只需要在虚拟机的hive中添加配置文件设置就可以直接从mysql传到hive!
在/opt/installs/hive/conf也就是hive的conf下如果没有就新建一个.hiverc并添加如下:
set hive.stats.column.autogather=false;
然后重启一下服务,这时只需要表输入设置mysql,表输出设置为hive就可以直接实现。
四.总结
可以看出我的解决方法对比第二种方法不论是设置还是操作都要简单的多,但是网上却没有相关的帖子,导致使用过程中踩了许多的坑,因此特意总结了这篇文章希望能对大家有所帮助!