我目前正在做一个项目,它使用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。)
发布于 2013-06-17 20:22:55
谢谢查尔斯和维卡斯。这无疑让我走上了正确的道路。我最终使用了https://github.com/cwensel/cascading.jdbc,它使用Hadoop类DBInputFormat/DBOutput来简化设置读写db的级联作业。
为了编写代码,我只需将我的点击的输出流更改为:
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 );我也遇到了Cascading-DBMigrate,但它似乎只用于从数据库中读取,而不是写入数据库。
发布于 2013-06-06 23:41:01
Sqoop设计用于在MySQL/其他关系数据库和Hadoop/HBase之间导出/导入数据。在here上可以找到一个关于sqoop的非常好的教程,它解释了它的各种功能。不确定这是否是你想要做的。
如果您需要在MapReduce作业中从MySQL读取数据/向其中写入数据,可以按照@Charles的建议使用hadoop类
发布于 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数据库运行。
其中“如前所述”指的是这条指令:
DBConfiguration.configureDB(conf, “com.mysql.jdbc.Driver”, “jdbc:mysql://localhost/mydatabase”);要从MySQL中读取,与DBInputFormat完全相同。
https://stackoverflow.com/questions/16965195
复制相似问题