首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在Java中使用SQOOP从MySQL读/写Hadoop作业?

问是否可以在Java中使用SQOOP从MySQL读/写Hadoop作业?
EN

Stack Overflow用户
提问于 2013-06-06 22:46:39
回答 3查看 1.4K关注 0票数 2

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

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

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

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

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

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

注意:\tmp\sqoop-my.name\compile\9031edc8e43167c10f9f895b64aa79d5\MyTableName.java使用或覆盖已弃用的接口。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-17 20:22:55

谢谢查尔斯和维卡斯。这无疑让我走上了正确的道路。我最终使用了https://github.com/cwensel/cascading.jdbc,它使用Hadoop类DBInputFormat/DBOutput来简化设置读写db的级联作业。

为了编写代码,我只需将我的点击的输出流更改为:

代码语言:javascript
复制
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 );

为了从数据库中读取数据,我只需点击一下,如下所示:

代码语言:javascript
复制
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 );

我也遇到了Cascading-DBMigrate,但它似乎只用于从数据库中读取,而不是写入数据库。

票数 1
EN

Stack Overflow用户

发布于 2013-06-06 23:41:01

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

如果您需要在MapReduce作业中从MySQL读取数据/向其中写入数据,可以按照@Charles的建议使用hadoop类

票数 2
EN

Stack Overflow用户

发布于 2013-06-06 23:23:28

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

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

然后,DBOutputFormat.setOutput()方法定义如何将结果写回数据库。它的三个参数是作业的JobConf对象、定义要写入的表名的字符串和定义要填充的表的字段的字符串数组。例如DBOutputFormat.setOutput(job,"employees","employee_id","name");

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

其中“如前所述”指的是这条指令:

代码语言:javascript
复制
DBConfiguration.configureDB(conf, “com.mysql.jdbc.Driver”, “jdbc:mysql://localhost/mydatabase”);

要从MySQL中读取,与DBInputFormat完全相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16965195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档