2013-08-22 22 views
0

我的類看起來像這樣如何在不是mapreduce作業時設置用戶類路徑優先級?

public class generateAll extends Configured implements Tool 
{ 
public static void main(String[] args) throws Exception 
{ 
    ToolRunner.run(new generateAll(), args); 
} 
. 
. 
. 

我要的是,執行使用Hadoop jar命令的程序,因爲我使用的內部程序getConf()語句。

沒有涉及mapper reducer。

已經有在Hadoop中的庫 我的程序正在使用hsqlsb 2.2.9(作爲Maven的依賴)一HSQLDB 1.8

有在jobConf的方法來超越用戶類路徑的Hadoop類路徑,但由於我的程序不涉及map/reduce,如何重寫hadoop classpath?

作爲測試文件運行時,程序運行良好。 的Hadoop版本 - cdh3u3

的錯誤,而使用Hadoop jar命令拋出的是:

異常線程 「main」 值java.sql.SQLException:意外的令牌,需要(在語句[創建表咔嗒] at org.hsqldb.jdbc.Util.sqlException(Unknown Source) at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source) at org.hsqldb.jdbc.jdbcStatement.execute(Unknown Source) at com.inmobi。 qa.SQLUtil.SQLScriptExecuter.executeScript(SQLScriptExecuter.java:62) at com.inmobi.qa.logboxtools.generateAll.test_table_creation(generateAll.java:186) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.hadoop.util。com.inmobi.qa.logboxtools.generateAll.run(generateAll.java:104) 。 ToolRunner.run(ToolRunner.java:84) at com.inmobi.qa.logboxtools.generateAll.main(generateAll.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl .invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597) 在org.apache.hadoop .util.RunJar.main(RunJar.java:208)

+0

如果hsqldb 2.2.9已被加載(我提供作爲maven依賴),它將工作正常。 – t0il3ts0ap

回答

0

使用foll在運行hadoop jar之前運行命令。

export HADOOP_USER_CLASSPATH_FIRST=true 
export HADOOP_CLASSPATH=your_classpath:$HADOOP_CLASSPATH 

your_classpath應該包含hsqlsb 2.2.9。

+0

但這會改變我將要運行的所有工作的類路徑。我怎樣才能防止呢? – t0il3ts0ap

+0

作爲Java ClassLoader委託模型很難做到這一點:'當請求查找類或資源時,ClassLoader實例會在嘗試查找類或資源本身之前,將對該類或資源的搜索委託給其父類加載器。 '因此,如果加載了hsqldb 1.8,那麼大多數情況下都不能將其替換爲hsqlsb 2.2.9。 – zsxwing