sqoop编译安装与ivy冲突解决
线上hive系统在用mr做engine时操作parquet格式的表报了org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.NoSuchFieldError: DECIMAL
的错误,查了一下是因为parquet包版本的问题,它load时先load到了sqoop的parquet1.4,而hive需要1.6,最简单的方法是直接设置SET mapreduce.job.user.classpath.first=true
,不过为了长远考虑决定重新编译sqoop,将冲突的包替换掉。
修改ivy.xml
为了替换sqoop,需要修改ivy.xml,(居然不是mvn编译,- -)。我们这里只是希望将这一个包的相关依赖升级,所以需要在ivy里加入<dependency org="com.twitter" name="parquet-hadoop" rev="1.6.0" conf="hadoop200->default"/>
.这里的conf应该是和编译选项有关,因为sqoop编译时会让你加入参数-Dhadoopversion=200
之类的选择hadoop的依赖版本。
这时编译就会依赖两个版本的parquet,我查到一篇文章说是修改ivysetting.xml可以控制冲突的版本选择,然后我设置了以后没有用。因为我们是升级确定的一个jar包,所以在ivy最后加入<conflict org="com.twitter" rev="1.6.0,2.2.0-rc1" />
,强制冲突时选择1.6.0和2.2.0-rc1两个版本。ivy.xml的dependencies里面只允许
编译sqoop
编译sqoop可以看源码里的readme,先安装相关依赖
|
|
之后ant package [-Dhadoopversion=200可以选择版本]即可。中间遇到了两个错,第一是某个mvn cache库挂掉了,直接删了重新让mvn下载。第二个是要在build手动mkdir docs
,简直二爆了。。。
安装sqoop
将build目录的sqoop-1.4.6.binhadoop-2.0.4-alpha打包:`tar -cvf sqoop.tar.gz sqoop-1.4.6.binhadoop-2.0.4-alpha`
在要安装的机器上解压sqoop:tar -xvf sqoop.tar.gz
设定相关的权限chmod,chown啥的
添加环境变量/etc/bashrc
|
|
修改相关配置,我貌似直接用的默认的。然后测试sqoop list-databases --connect jdbc:mysql://haoop01:3306/ --username root --password 1234
即可
参考文献
Sqoop1.4.5 with hadoop2.4.1
让开发自动化: 利用 Ivy 管理依赖项
使用ivy构建jar包的依赖关系
本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:http://thousandhu.github.io/2016/03/31/sqoop的编译安装以及-ivy的jar包升级/