以下文字内容部分译自Sqoop2 vs Sqoop:
Sqoop1是一个客户端程序,用户只需在客户端添加驱动或者连接器到Sqoop中即可使用,
Sqoop2是一个基于服务的模型,新一代Sqoop,所有配置以及驱动都必须在服务端配置好。
从MapReduce的观点看,Sqoop1仅仅提交Map程序给集群,而Sqoop2会提交MR任务,
通过Mappper来从源头获取数据,再使用Reducer来转换数据。这相比Sqoop1更加清晰。
另一个主要区别是安全层面。管理员设置好来源和目标的连接,用户无需也不能获取到该连接的信息,只能使用它。这可以进一步做权限控制。
除了传统的CLI之外,Sqoop2也会提供Web UI,它们都使用Sqoop2服务器提供的REST服务。注意一点,Sqoop2的Web UI是Hue的一部分,而非属于Apache基金会。该REST接口可以方便的整合到其它框架中,例如Oozie的工作流中。
Sqoop2目前还是一个半成品亟待完善,且不支持Hadoop1。不多说了,看文档、看图说话:
接下来安装Sqoop2:
wget -q http://mirror.bit.edu.cn/apache/sqoop/1.99.6/sqoop-1.99.6-bin-hadoop200.tar.gz
tar xf sqoop-1.99.6-bin-hadoop200.tar.gz
sqoop2=/usr/local/sqoop2
mv sqoop-1.99.6-bin-hadoop200 $sqoop2
cd $sqoop2
sed -i 's/@LOGDIR@/logs/g' server/conf/sqoop.properties
./bin/sqoop2-server start
由于我的Hadoop位置单独安装,因此还需要修改:
#catalina.properties
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/../lib/*.jar,/usr/local/hadoop/share/hadoop/common/*.jar,/usr/local/hadoop/share/hadoop/common/lib/*.jar,/usr/local/hadoop/share/hadoop/hdfs/*.jar,/usr/local/hadoop/share/hadoop/hdfs/lib/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/*.jar,/usr/local/hadoop/share/hadoop/mapreduce/lib/*.jar,/usr/local/hadoop/share/hadoop/yarn/lib/*.jar,/usr/local/hadoop/share/hadoop/yarn/*.jar,/usr/local/hive/lib/*.jar
#sqoop.properties
org.apache.sqoop.repository.jdbc.url=jdbc:derby:sqoop;create=true
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/usr/local/hadoop/etc/hadoop/
报错及解决:
- java.sql.SQLException: No suitable driver found for jdbc:derby:sqoop;create=true
$sqoop2/server/webapps/sqoop.war中包含derby驱动包,但是tomcat(sqoop2是基于tomcat的web接口)
启动时需要创建连接池,因此要将derby.jar加入到$sqoop2/server/lib中即可。
Sqoop2将元数据及配置信息保存在数据库中,目前最新的1.99.6版本支持Derby及Postgresql数据库,
对于MySQL的支持将在1.99.7中加入,目前可以通过补丁的形式实现:Sqoop2: Add MySQL support for the metadata repository
- java.lang.SecurityException: sealing violation: package org.apache.derby.impl.jdbc.authentication is sealed
由于tomcat启动时的classpath包含了Hive的lib,而Hive自带了derby的驱动包,因此会产生类冲突,删除掉Hive中的derby包即可。
java.lang.IllegalStateException: Class invariant violation at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199) at org.apache.log4j.LogManager.getLogger(LogManager.java:228) at org.apache.log4j.Logger.getLogger(Logger.java:117) 这个是log4j的一个已知bug。 由org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES这个属性引起。它默认是TRUE,将其设置成FALSE就可以规避这个错误。 这个问题在TOMCAT和Glassfish两个容器里都会出现,不知道其他的会不会。 原因当这个属性为TRUE的时候,会在应用停止的时候会试图将所有为NULL的静态或不可修改字段(final)从已加载类里清除。
echo 'org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES=false' >> $sqoop2/server/conf/catalina.properties
eof.
本文参考:Sqoop1.9.x安装、Derby JDBC database connection URL