Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以从Java内部使用SQOOP从MySQL读写Hadoop作业?_Java_Mysql_Hadoop_Sqoop_Cascading - Fatal编程技术网

是否可以从Java内部使用SQOOP从MySQL读写Hadoop作业?

是否可以从Java内部使用SQOOP从MySQL读写Hadoop作业?,java,mysql,hadoop,sqoop,cascading,Java,Mysql,Hadoop,Sqoop,Cascading,我目前正在从事一个项目,该项目使用JDK1.7进行编译,使用级联1.2(即将升级到2.1)创建和运行Hadoop作业,并使用Hadoop的Cloudera发行版(0.20.2-cdh3u3) 我正在研究如何修改级联/Hadoop作业,以便在MySQL数据库中读取和写入所有数据。看起来SQOOP可以处理这个问题 然而,从目前为止我所看到的情况来看,很少有关于如何在Java中实现这一点的信息或文档(我知道SQOOP主要用于从shell中调用的批处理作业)——我所遵循的Java示例对我来说并不适用。我

我目前正在从事一个项目,该项目使用JDK1.7进行编译,使用级联1.2(即将升级到2.1)创建和运行Hadoop作业,并使用Hadoop的Cloudera发行版(0.20.2-cdh3u3)

我正在研究如何修改级联/Hadoop作业,以便在MySQL数据库中读取和写入所有数据。看起来SQOOP可以处理这个问题

然而,从目前为止我所看到的情况来看,很少有关于如何在Java中实现这一点的信息或文档(我知道SQOOP主要用于从shell中调用的批处理作业)——我所遵循的Java示例对我来说并不适用。我曾尝试使用SQOOP1.4,并将我的项目切换为使用JDK1.6,因为我认为这是必需的(尽管它会破坏我项目的其他部分),但我仍然无法让它工作

有人知道我想要实现的目标是否可能吗?其他人是如何处理这个问题的?SQOOP2的发布会有帮助吗

当我尝试运行org.apache.sqoop.tool.ExportTool将CSV导出到表中时,我看到的错误类型有:

无法初始化javac处理器,因为(很可能)类加载器问题:java.lang.NoClassDefFoundError:com/sun/tools/javac/processing/JavacProcessingEnvironment

注意:\tmp\sqoop my.name\compile\9031edc8e43167c10f9f895b64aa79d5\MyTableName.java使用或重写不推荐使用的API


运行导出作业时遇到IOException:java.io.IOException:无法将jar\tmp\sqoop my.name\compile\9031edc8e43167c10f9f895b64aa79d5\MyTableName.jar加载到JVM中。(找不到类MyTableName。)

如果您只想将作业输出写入MySQL,我建议您使用另一种名为
DBOutputFormat的输出格式,如下所述:

配套类DBOutputFormat将允许您将结果写回数据库。设置作业时,调用conf.setOutputFormat(DBOutputFormat.class);然后像前面一样调用DBConfiguration.configureDB()

然后,DBOutputFormat.setOutput()方法定义如何将结果写回数据库。它的三个参数是作业的JobConf对象、定义要写入的表名称的字符串和定义要填充的表字段的字符串数组。e、 例如,DBOutputFormat.setOutput(作业,“雇员”,“雇员id”,“姓名”)

您先前创建的同一个dbwriteable实现足以将记录注入数据库。write(PreparedStatement stmt)方法将在从reducer传递到OutputCollector的DBWritable的每个实例上调用。在reduce结束时,这些PreparedStatement对象将转换为INSERT语句,以针对SQL数据库运行

其中“如前所述”指本说明:

DBConfiguration.configureDB(conf, “com.mysql.jdbc.Driver”, “jdbc:mysql://localhost/mydatabase”);

如果您只想将作业输出写入MySQL,我建议您使用另一种称为
DBOutputFormat
的输出格式,如下所述:

配套类DBOutputFormat将允许您将结果写回数据库。设置作业时,调用conf.setOutputFormat(DBOutputFormat.class);然后像前面一样调用DBConfiguration.configureDB()

然后,DBOutputFormat.setOutput()方法定义如何将结果写回数据库。它的三个参数是作业的JobConf对象、定义要写入的表名称的字符串和定义要填充的表字段的字符串数组。e、 例如,DBOutputFormat.setOutput(作业,“雇员”,“雇员id”,“姓名”)

您先前创建的同一个dbwriteable实现足以将记录注入数据库。write(PreparedStatement stmt)方法将在从reducer传递到OutputCollector的DBWritable的每个实例上调用。在reduce结束时,这些PreparedStatement对象将转换为INSERT语句,以针对SQL数据库运行

其中“如前所述”指本说明:

DBConfiguration.configureDB(conf, “com.mysql.jdbc.Driver”, “jdbc:mysql://localhost/mydatabase”);

从MySQL读取数据与使用
DBInputFormat

Sqoop是为在MySQL/其他关系数据库和Hadoop/HBase之间导出/导入数据而设计的。可以找到一个关于sqoop的非常好的教程,其中解释了它的各种功能。不确定这是否是你想要做的


如果您需要在MapReduce作业中从MySQL读取/写入数据,
DBInputFormat/DBOutput
hadoop类可以按照@Charles

Sqoop设计用于在MySQL/其他关系数据库和hadoop/HBase之间导出/导入数据。可以找到一个关于sqoop的非常好的教程,其中解释了它的各种功能。不确定这是否是你想要做的


如果您需要在MapReduce作业中从MySQL读取/写入数据,
DBInputFormat/DBOutput
hadoop类可以按照@Charles

的建议使用,谢谢Charles和Vikas。这无疑使我走上了正确的道路。我最终使用了它,它使用Hadoop类
DBInputFormat/DBOutput
来轻松设置读写db的级联作业

要写入,我刚刚将tap的输出流更改为:

String url = "jdbc:mysql://localhost:3306/mydb?user=myusername&password=mypassword";
String driver = "com.mysql.jdbc.Driver";
String tableName = "mytable";   
String[] columnNames = {'col1', 'col2', 'col3'}; //Columns I want to write to 
TableDesc tableDesc = new TableDesc( tableName );

JDBCScheme dbScheme = new JDBCScheme( columnNames );
Tap dbOutputTap = new JDBCTap( url, driver, tableDesc, dbScheme );
为了从数据库中读取数据,我做了一个如下的点击:

String url = "jdbc:mysql://localhost:3306/mydb?user=myusername&password=mypassword";
String driver = "com.mysql.jdbc.Driver";
String tableName = "mytable";      
String[] columnNames = {'col1', 'col2', 'col3'}; //Columns I want to read from 
TableDesc tableDesc = new TableDesc( tableName );

JDBCScheme dbScheme = new JDBCScheme( columnNames, "col1<40" );
Tap dbInputTap = new JDBCTap( url, driver, tableDesc, dbScheme );
String url=“jdbc:mysql://localhost:3306/mydb?user=myusername&password=mypassword";
String driver=“com.mysql.jdbc.driver”;
String tableName=“mytable”;
字符串[]columnNames={'col1','col2','col3'}//我想阅读的专栏
TableDesc TableDesc=新TableDesc(tableName);

JDBCScheme dbScheme=new JDBCScheme(columnNames,“col1感谢Charles和Vikas。这无疑让我走上了正确的道路。我最终使用了使用Hadoop类
DBInputFormat/DBOutput
来轻松设置读取和写入数据库的级联作业

到w