2017-03-29 5 views
1

Ich versuche, eine Hadoop-Anwendung von einem Glas zu laufen:Erste Datei Ressource von Jar in Hadoop

hadoop jar myJarFile.jar my.class.path.Here /path/to/input /path/to/output 

In einer der Klassen in myJarFile.jar, ich bin versucht, eine Ressource aus dem Classpath zu lesen so :

public void init() { 
    Configuration conf = new Configuration(); 
    conf.addResource("resources/myConf.xml"); 
    log.info("Data element=" + conf.get("data.element")); 
    .... 

In myJarFile.jar, Ressourcen-/myConf existiert:

[prompt] jar myJarFile.jar 
my/class/path/Here.class 
... 
resources/myConf.xml 

und die Konfigurationsdatei enthalten s Das Name/Wert-Paar im richtigen (Hadoop-Stil) Format. Wenn ich jedoch versuche, dies auszuführen, kann die Datei myConf.xml nicht gefunden werden, obwohl sie im Klassenpfad enthalten sein sollte.

Was fehlt mir?

Antwort

0

Ich gehe davon aus, dass die init-Methode entweder Mapper oder Reduktions Klasse gehört. JVM, die diese Klassen ausführen, sind nicht die gleiche JVM wie das Treiberprogramm und möglicherweise auf einer anderen Maschine insgesamt. Sie können also das lokale Dateisystem von diesen Klassen nicht lesen.

Sie haben zwei Möglichkeiten, diese Datei zu lesen.

Option 1 (bevorzugt) Die Nutzung verteilter Cache wie folgt aus:

File f = new File("./myConf.xml"); 

Option 2 (:

JobConf job = new JobConf(); 
DistributedCache.addCacheFile(new URI("resources/myConf.xml"), 
           job); 

Nun ist diese Datei, die Sie in Mapper oder Minderer init-Methode wie folgt verwenden können nicht bevorzugt): Datei in HDFS hochladen und mit HDFS java client api lesen.

Path pt=new Path("hdfs://<hdfs hostname>:9000/user/john/myConf.xml"); 
        FileSystem fs = FileSystem.get(new Configuration()); 
        BufferedReader br=new BufferedReader(new InputStreamReader(fs.open(pt))); 

Der Grund, warum diese Option ist nicht bevorzugt, weil für jeden Datensatz, den Sie zuordnen oder reduzieren Sie das Lesen von Daten aus hdfs werden, so dass Sie wichtige Performance-Probleme haben.

+0

Ich habe versucht, diese, die Datei bekommen, und dann ist es zu AddResource vorbei(). Aber das funktioniert nicht. Ich habe auch versucht, die Ressource in der Job-Setup-Phase zu bekommen (in der Methode run() des Treibers, bevor ich das Job-Objekt eingerichtet habe). Aber keiner von beiden liest die Ressource. –

+0

Korrektur: Ich habe versucht, den Pfad der Datei zu addResource() hinzuzufügen. Sollte die neue File() Zeile eine neue Datei ("resources/myConf.xml") sein? Was übermittele ich an die Zeile addResource()? –

+0

Nur neugierig, warum versuchen Sie eine Ressource in der Konfiguration in Init-Methode (von Mapper oder Reducer) hinzufügen? – alpeshpandya

0

OK - stellte sich heraus, dass mein ursprünglicher Code tatsächlich funktioniert (außer einigen späteren Fehlern ...). Aber mein Deployment-Skript hatte versehentlich die eigentliche XML-Datei weggelassen, und ich vermisste sie, weil es eine gleichnamige Eigenschaftendatei gab.

Danke für den Rat.

+0

Froh, dass es für dich geklappt hat. – alpeshpandya

+0

Ich bin immer noch neugierig, warum möchten Sie in Config in Init-Methode Ressource hinzufügen? – alpeshpandya

Verwandte Themen