2012-05-04 32 views
0

我是java的新手,所以可能是這個天真的問題,我有一個外部jar文件,我想以編程方式移動到Hadoop文件系統,我有API,但只是我需要給出jar文件的路徑。如果我可以將它與我的項目一起包含,或者可能更好一些,以便相同的代碼可以在不同的機器上工作,那麼我不想使用硬編碼路徑(包括絕對路徑和相對路徑),可能相同的jar文件可能不會出現在在不同機器上的相同位置,如果我給硬編碼路徑,那麼我需要明確地將文件複製到相同的位置。本地磁盤上訪問外部jar的最佳方式


我寫UDF(JAR文件)蜂房它可我的硬盤上,現在訪問UDF在蜂房一個需要添加的jar蜂巢類路徑中,所以我想以JAR文件從複製到HDFS我本地系統,然後從HDFS路徑添加jar到HIVE類路徑。

+1

一種方法是爲Jar獲取一個'File',然後將其轉換爲'URL',然後使用['URLClassLoader'](http://docs.oracle.com/javase/7/docs/api/java/ net/URLClassLoader.html)加載它。話雖如此,整個方法聽起來不對。爲什麼資源不能通過常規方法簡單地構建/加載到Hadoop中? –

+0

很酷。將其添加爲標籤。順便說一句 - 我還編輯了你的第一條評論的癥結回到問題。您現在可以刪除評論。 –

回答

1

你可以把兩個jar文件在同一目錄和路徑應該是這樣的

String path = System.getProperty("user.dir") + File.separator + "name.jar"; 

System.getProperty(「user.dir來」)將返回用戶的當前工作目錄(從哪裏第一個jar文件已運行)和File.separator是系統相關的默認名稱分隔符。

+0

這對我不起作用,這裏是我的情況,我有Java類庫'ABC',它將以編程方式複製外部jar文件。一個將有Java應用程序(主代碼)'XYZ',它將引用'ABC'jar調用'ABC'功能,使用您建議需要將jar文件alomg與'XYZ'放在一起的方法,這對我來說是不可行的 – Nikhil

+0

我發現的一種方法是我可以做類似於此的文件currentJarFilePath = new File .class 。.getProtectionDomain()getCodeSource()的getLocation()的getPath())。。 String currentDirectory = currentJarFilePath.getParent();之後可以使用相對路徑來獲得所需的extrenal jar文件,但我正在尋找是否有更好的方法來做到這一點。對不起,我可能應該更具體 – Nikhil

0

對於在Hive上使用UDF,您必須將包含UDF的jar添加到分佈式緩存中,以便它可供您的Hive集羣中的所有節點使用。 你可以用類似下面的語法做到這一點:

add jar /path_to_jar/my_jar.jar 

「/ path_to_jar /」是路徑,從中運行此命令在本地計算機上的罐子。如果需要的話,該jar可以在你的MapReduce或Hive代碼被添加到分佈式緩存後通過其名稱訪問。

相關問題