복붙노트

[HADOOP] apache spark - 파일이 존재하는지 확인

HADOOP

apache spark - 파일이 존재하는지 확인

나는 불꽃이 생기고 새로운 질문이 있습니다. 첫 번째 단계에서 SUCCESS.txt 파일을 HDFS의 위치에 쓰는 두 단계 프로세스가 있습니다. 스파크 작업 인 두 번째 단계는 데이터 처리를 시작하기 전에 SUCCESS.txt 파일이 있는지 확인해야합니다.

스파크 API를 검사하고 파일이 있는지 확인하는 방법을 찾지 못했습니다. 어떤 아이디어가 이것을 처리하는 방법?

내가 찾은 유일한 방법은 sc.textFile (hdfs : ///SUCCESS.txt) .count ()로 파일이 존재하지 않을 때 예외를 throw합니다. 그 예외를 잡아 내 프로그램을 그에 맞게 작성해야합니다. 나는이 접근법을 정말로 좋아하지 않았다. 더 나은 대안을 찾고 있습니다.

해결법

  1. ==============================

    1.HDFS에있는 파일의 경우, 다음을 수행하는 hadoop 방식을 사용할 수 있습니다.

    HDFS에있는 파일의 경우, 다음을 수행하는 hadoop 방식을 사용할 수 있습니다.

    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"))
    
  2. ==============================

    2.전통적인 hadoop 파일 검사에서 파일 존재 여부를 내부적으로 검사하는 기능을 통해이를 호출하는 가장 좋은 방법이라고 할 수 있습니다.

    전통적인 hadoop 파일 검사에서 파일 존재 여부를 내부적으로 검사하는 기능을 통해이를 호출하는 가장 좋은 방법이라고 할 수 있습니다.

    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
      }
    }
    
  3. ==============================

    3.Pyspark의 경우 다음과 같은 방법을 사용하여 하위 프로세스를 호출하지 않고도이 작업을 수행 할 수 있습니다.

    Pyspark의 경우 다음과 같은 방법을 사용하여 하위 프로세스를 호출하지 않고도이 작업을 수행 할 수 있습니다.

    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"))
    
  4. ==============================

    4.자바 코더의 경우;

    자바 코더의 경우;

     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.
               }
    
  5. ==============================

    5.pyspark python 사용자 :

    pyspark python 사용자 :

    파이썬이나 pyspark로는 아무 것도 찾지 못했습니다. 그래서 우리는 파이썬 코드에서 hdfs 명령을 실행할 필요가 있습니다. 이것은 나를 위해 일했다.

    hdfs 명령으로 폴더가 있는지 확인합니다 : 참이면 0을 반환합니다.

    hdfs dfs -test -d /folder-path
    

    파일이 존재 하는지를 얻는 hdfs 명령 : 참이면 0을 반환합니다.

    hdfs dfs -test -d /folder-path 
    

    파이썬 코드에서 이것을 넣으려면 아래 코드 줄을 따라 갔다.

    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) 
    

    폴더가 있으면 출력 :

    폴더가 있음 0

  6. ==============================

    6.PySpark의 경우 :

    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
    
  7. from https://stackoverflow.com/questions/30405728/apache-spark-check-if-file-exists by cc-by-sa and MIT license