it-swarm.com.de

apache-Funken - Überprüfen Sie, ob eine Datei vorhanden ist

Ich bin neu im Funken und habe eine Frage. Ich habe einen zweistufigen Prozess, in dem der erste Schritt eine SUCCESS.txt-Datei an einen Ort auf HDFS schreibt. Der zweite Schritt, der ein Funkenjob ist, muss überprüfen, ob die Datei SUCCESS.txt vorhanden ist, bevor die Daten verarbeitet werden.

Ich habe die Funken-API überprüft und keine Methode gefunden, mit der geprüft wird, ob eine Datei vorhanden ist. Irgendwelche Ideen, wie man damit umgehen soll?

Die einzige Methode, die ich gefunden habe, war sc.textFile (hdfs: ///SUCCESS.txt) .count (), die eine Exception auslöst, wenn die Datei nicht existiert. Ich muss diese Ausnahme wahrnehmen und mein Programm entsprechend schreiben. Ich habe diesen Ansatz nicht wirklich gemocht. Ich hoffe auf eine bessere Alternative.

15
Chandra

Für eine Datei in HDFS können Sie die Methode hadoop verwenden:

val conf = sc.hadoopConfiguration
val fs = org.Apache.hadoop.fs.FileSystem.get(conf)
val exists = fs.exists(new org.Apache.hadoop.fs.Path("/path/on/hdfs/to/SUCCESS.txt"))
34
DPM

Ich werde sagen, die beste Möglichkeit, dies über eine Funktion aufzurufen, die intern auf Vorhandensein von Dateien in der traditionellen Hadoop-Dateiprüfung überprüft.

object OutputDirCheck {
  def dirExists(hdfsDirectory: String): Boolean = {
    val hadoopConf = new org.Apache.hadoop.conf.Configuration()
    val fs = org.Apache.hadoop.fs.FileSystem.get(hadoopConf)
    val exists = fs.exists(new org.Apache.hadoop.fs.Path(hdfsDirectory))
    return exists
  }
}
8
Murari Goswami

Für Pyspark können Sie dies erreichen, ohne einen Subprozess aufzurufen, der etwa Folgendes verwendet:

fs = sc._jvm.org.Apache.hadoop.fs.FileSystem.get(sc._jsc.hadoopConfiguration())
fs.exists(sc._jvm.org.Apache.hadoop.fs.Path("path/to/SUCCESS.txt"))
3
Rob H

Für Java-Codierer; 

 SparkConf sparkConf = new SparkConf().setAppName("myClassname");
        SparkContext sparky = new SparkContext(sparkConf);       
        JavaSparkContext context = new JavaSparkContext(sparky);

     FileSystem hdfs = org.Apache.hadoop.fs.FileSystem.get(context.hadoopConfiguration());
            Path path = new Path(sparkConf.get(path_to_File));

            if (!hdfs.exists(path)) {
                 //Path does not exist.
            } 
         else{
               //Path exist.
           }
1
Neethu

Für Pyspark-Python-Benutzer:

ich habe nichts mit python oder pyspark gefunden, also müssen wir den hdfs-Befehl aus python-code ausführen. Das hat bei mir funktioniert.

hdfs-Befehl zum Abrufen, wenn der Ordner vorhanden ist: Gibt 0 zurück, wenn wahr 

hdfs dfs -test -d /folder-path

hdfs-Befehl zum Abrufen, wenn eine Datei vorhanden ist: Gibt 0 zurück, wenn wahr

hdfs dfs -test -d /folder-path 

Um dies in Python-Code einzufügen, habe ich folgende Code-Zeilen verwendet: 

import subprocess

def run_cmd(args_list):
    proc = subprocess.Popen(args_list, stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
    proc.communicate()
    return proc.returncode

cmd = ['hdfs', 'dfs', '-test', '-d', "/folder-path"]
            code = run_cmd(cmd)
if code == 0:
    print('folder exist')
    print(code) 

Ausgabe wenn Ordner vorhanden ist: 

ordner existiert 0

0
Avinav Mishra

Für PySpark:

from py4j.protocol import Py4JJavaError
def path_exist(path):
    try:
        rdd = sc.textFile(path)
        rdd.take(1)
        return True
    except Py4JJavaError as e:
        return False
0
Nandeesh