2016-03-23 8 views
0

Meine Saga geht weiter -Hadoop kann s3 Inhalt Liste aber funken Schale wirft ClassNotFoundException

Kurz Ich versuche, eine teststack für Funke zu schaffen - darauf abzielen, eine Datei von einem s3 Eimer zu lesen ist, und schreiben Sie es dann Ein weiterer. Windows-Umgebung

Ich habe wiederholt Fehler beim Versuch, auf S3 oder S3n zuzugreifen, wenn eine ClassNotFoundException ausgelöst wurde. Diese Klassen wurden auf den Kern-site.xml als s3 hinzugefügt und s3n.impl

Ich habe die hadoop/share/tools/lib zu dem Classpath ohne Erfolg, habe ich dann die aws-java-jdk und hadoop-aws Gläser auf den Anteil/hadoop/common folder und ich bin jetzt in der Lage, den Inhalt eines Buckets mit haddop in der Befehlszeile aufzulisten.

hadoop fs -ls "s3n://bucket" zeigt mir der Inhalt, dann ist dies eine gute Nachricht :)

In meinem Kopf speichern die hadoop Konfiguration aufgenommen werden soll, indem Funken so lösen sollte man die anderen aber lösen, wenn ich Funken Shell laufen und versuchen, eine Datei an s3 Ich bekomme die übliche ClassNotFoundException wie unten gezeigt.

Ich bin immer noch ziemlich neu und unsicher, wenn ich etwas offensichtlich übersehen habe, hoffentlich kann mir jemand helfen, das Rätsel zu lösen? Jede Hilfe wird sehr geschätzt, danke.

Die Ausnahme:

java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3native.NativeS3FileSystem not found 
     at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074) 
     at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578) 
     at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591) 

mein Kern-site.xml (was ich glaube jetzt korrekt zu sein, wie hadoop s3 zugreifen kann):

<property> 
    <name>fs.s3.impl</name> 
    <value>org.apache.hadoop.fs.s3.S3FileSystem</value> 
</property> 

<property> 
    <name>fs.s3n.impl</name> 
    <value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value> 
    <description>The FileSystem for s3n: (Native S3) uris.</description> 
</property> 

und schließlich die Hadoop-env.cmd zeigt den Klassenpfad (die scheinbar ignoriert):

set HADOOP_CONF_DIR=C:\Spark\hadoop\etc\hadoop 

@rem ##added as s3 filesystem not found.http://stackoverflow.com/questions/28029134/how-can-i-access-s3-s3n-from-a-local-hadoop-2-6-installation 
set HADOOP_USER_CLASSPATH_FIRST=true 
set HADOOP_CLASSPATH=%HADOOP_CLASSPATH%:%HADOOP_HOME%\share\hadoop\tools\lib\* 

@rem Extra Java CLASSPATH elements. Automatically insert capacity-scheduler. 
if exist %HADOOP_HOME%\contrib\capacity-scheduler (
    if not defined HADOOP_CLASSPATH (
    set HADOOP_CLASSPATH=%HADOOP_HOME%\contrib\capacity-scheduler\*.jar 
) else (
    set HADOOP_CLASSPATH=%HADOOP_CLASSPATH%;%HADOOP_HOME%\contrib\capacity-scheduler\*.jar 
) 
) 

EDIT: funken defaults.conf

spark.driver.extraClassPath=C:\Spark\hadoop\share\hadoop\common\lib\hadoop-aws-2.7.1.jar:C:\Spark\hadoop\share\hadoop\common\lib\aws-java-sdk-1.7.4.jar 
spark.executor.extraClassPath=C:\Spark\hadoop\share\hadoop\common\lib\hadoop-aws-2.7.1.jar:C:\Spark\hadoop\share\hadoop\common\lib\aws-java-sdk-1.7.4.jar 
+1

Haben Sie versucht, sie explizit auf den Klassenpfad zu setzen, wenn Sie einen Spark-Job übergeben? –

+0

@YuvalItzchakov Ich buchstäblich, und ich meine LITERALLY war hier: http://StackOverflow.com/Questions/29099115/Spark-Submit-Add-Multiple-Jars-in-Classpath: D Ich werde es jetzt versuchen – null

+0

I Übergeben Sie sie mit dem '--jars' Flag und fügen Sie sie über:' spark.driver.extraClassPath = hadoop-aws-2.7.1.jar: aws-java-sdk-1.10.50.jar' dem Klassenpfad hinzu. Dasselbe gilt für 'spark.executor.extraClassPath'. –

Antwort

2

Sie müssen einige Parameter an Ihre Spark-Shell übergeben. Versuchen Sie diese Flagge --packages org.apache.hadoop:hadoop-aws:2.7.2.

+0

Hallo, Pakete arbeiten, aber das wird sie jedes Mal herunterladen, stattdessen verwende ich --jars, die es zum Klassenpfad hinzufügt. – null

+0

Dies wird nicht jedes Mal heruntergeladen, es wird sie lokal zwischenspeichern – avloss

Verwandte Themen