Tomcat Sqoop import异常及其解决方法

软件版本:

Sqoop:1.4.6-cdh5.7.3,tomcat:7,JDK:1.7,Intellij Idea 2014 , Hadoop集群:CDH5.7.3;mysql:5.6;

问题描述

在使用Sqoop的API操作数据从Mysql表导入到HDFS的时候,如果直接使用Java程序,那么是可以调用程序并运行成功的;但是,启动Tomcat调用,则会失败。

前备知识

1. 使用Java API操作Sqoop进行数据传输时,其代码如下:

String[] args = new String[]{"import","--connect",
                "jdbc:mysql://192.168.0.137:3306/hibernate?characterEncoding=utf-8",
                "--username", "fansy",
                "--password", "fansy",
                "--table","t_log",
                "--target-dir","/tmp/fansy_sqoop/"+System.currentTimeMillis()
        };
com.cloudera.sqoop.Sqoop.runTool(sqoopCommand, getConf());

2. 调用Sqoop.runTool方法其底层的操作是怎样的呢?

1)会生成一个t_log.java文件(t_log就是表名),这个Java文件其实就是一个MR程序;

2)把这个t_log.java文件打包成jar,然后上传到hadoop,并调用这个MR程序;

3)等待MR完成,返回调用结果;

问题分析

1. 添加日志,并设置debug模式

通过添加日志,发现使用Java的main函数(实际用的是junit的test,其实差不多),有一个Current Sqoop Classpath : 。。。。 的日志和使用Tomcat调用的时候这个提示信息后面的路径不一致。从而导致了把t_log.java编译成jar包失败(报class not found的错误)。

2. 通过分析,看到这个Classpath是通过System.getProperty("java.class.path")来获得的;但是Tomcat和Java main其ClassLoader是不一样的,也就导致这个参数获取的不同。

3. 通过查看Sqoop的相关文档,发现可以设置参数--hadoop-home,来指定hadoop的相关路径(编译jar包报类找不到的错误,其实就是hadoop的相关jar包没有在Classpath路径下面),这样就比较好办了。

解决方法

由于使用的是maven工程,所以其所有的相关jar包基本都在WEB-INF/lib目录下面,所以把这个目录指定为hadoop-home的参数即可;

String[] args = new String[]{"import","--connect",
                "jdbc:mysql://192.168.0.137:3306/hibernate?characterEncoding=utf-8",
                "--username", "fansy",
                "--password", "fansy",
                "--table","t_log",
                "--target-dir","/tmp/fansy_sqoop/"+System.currentTimeMillis(),
"--hadoop-home",Utils.class.getClassLoader().getResource("").getPath().toString().replace("classes","lib")
        };
com.cloudera.sqoop.Sqoop.runTool(sqoopCommand, getConf());


分享,成长,快乐


脚踏实地,专注


转载请注明blog地址:http://blog.csdn.NET/fansy1990




你可能感兴趣的:(hadoop)