Ошибка NoSuchMethodError: JobConf.getCredentials()

#java #mysql #hadoop #hive #sqoop

#java #mysql #hadoop #улей #sqoop

Вопрос:

Я пытаюсь импортировать таблицу из MySQL в Hive. Я проверил, что я правильно устанавливаю соединение с MySQL. Теперь все данные таблицы также завернуты в jar. Затем, после того, как я получил эту ошибку NoSuchMethodError. Я использую MySQL в Windows 8, а Hadoop Hive работает в VirtualBox как песочница Хортона.

Ошибка NoSuchMethodError для org.apache.hadoop.mapred.JobConf.getCredentials()

Ошибка:

   INFO: Initializing JVM Metrics with processName=JobTracker, sessionId=
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.mapred.JobConf.getCredentials()Lorg/apache/hadoop/security/Credentials;
    at org.apache.sqoop.mapreduce.db.DBConfiguration.setPassword(DBConfiguration.java:158)
    at org.apache.sqoop.mapreduce.db.DBConfiguration.configureDB(DBConfiguration.java:144)
    at org.apache.sqoop.mapreduce.DataDrivenImportJob.configureInputFormat(DataDrivenImportJob.java:171)
    at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:231)
    at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:600)
    at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:413)
    at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:502)
    at SqoopJavaInterface.importToHive(SqoopJavaInterface.java:66)
    at SqoopJavaInterface.main(SqoopJavaInterface.java:32)
 

Это мой исходный код:-

 import java.io.IOException;    
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.sqoop.tool.ImportTool;

import com.cloudera.sqoop.SqoopOptions;

public class SqoopJavaInterface {
private static final String JOB_NAME = "Sqoop Hive Job";
private static final String MAPREDUCE_JOB = "Hive Map Reduce Job";
private static final String DBURL = "jdbc:mysql://localhost:3316/db";
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String USERNAME = "user";
private static final String PASSWORD = "password";
private static final String HADOOP_HOME = "/home/master/apps/hadoop-1.0.4";


private static final String JAR_OUTPUT_DIR = "/home/master/data";
private static final String HIVE_HOME = "/home/master/apps/hive-0.10.0";
private static final String HIVE_DIR = "/user/hive/warehouse/";
private static final String WAREHOUSE_DIR = "hdfs://localhost:9000/user/hive/warehouse/student";
private static final String SUCCESS = "SUCCESS !!!";
private static final String FAIL = "FAIL !!!";

/**
 * @param table
 * @throws IOException
 */
public static void main(String args[]) throws IOException{
    importToHive("some_table");
}
public static void importToHive(String table) throws IOException {
    System.out.println("SqoopOptions loading .....");
    Configuration config = new Configuration();
    // Hive connection parameters
    config.addResource(new Path(HADOOP_HOME "/conf/core-site.xml"));
    config.addResource(new Path(HADOOP_HOME "/conf/hdfs-site.xml"));
    config.addResource(new Path(HIVE_HOME "/conf/hive-site.xml"));
    FileSystem dfs =FileSystem.get(config);
    /* MySQL connection parameters */
    SqoopOptions options = new SqoopOptions(config);
    options.setConnectString(DBURL);
    options.setTableName(table);
    options.setDriverClassName(DRIVER);
    options.setUsername(USERNAME);
    options.setPassword(PASSWORD);
    options.setHadoopMapRedHome(HADOOP_HOME);
    options.setHiveHome(HIVE_HOME);
    options.setHiveImport(true);
    options.setHiveTableName(table);
    options.setOverwriteHiveTable(true);
    options.setFailIfHiveTableExists(false);
    options.setFieldsTerminatedBy(',');
    options.setOverwriteHiveTable(true);
    options.setDirectMode(true);
    options.setNumMappers(1); // No. of Mappers to be launched for the job
    options.setWarehouseDir(WAREHOUSE_DIR);
    options.setJobName(JOB_NAME);
    options.setMapreduceJobName(MAPREDUCE_JOB);
    options.setTableName(table);
    options.setJarOutputDir(JAR_OUTPUT_DIR);
    System.out.println("Import Tool running ....");
    ImportTool it = new ImportTool();
    int retVal = it.run(options);
    if (retVal == 0) {
        System.out.println(SUCCESS);
    } else {
        System.out.println(FAIL);
    }
}
}
 

Ответ №1:

К счастью, я сам нашел ответ на свой вопрос. Я должен включить файл jar в путь сборки hadoop-0.20.2 737-core.jar вместо того , чтобы hadoop-0.20.2-core.jar . Похоже, что это модифицированная версия того же файла, содержащего класс JobConf, содержащий метод getCredentials() .

Проблема решена, но я все еще не уверен в этих двух версиях? Знает ли какое-либо тело, в чем фактическая разница?