복붙노트

[HADOOP] HDFS를 실행하면 스칼라 스크립트 내부에서 명령

HADOOP

HDFS를 실행하면 스칼라 스크립트 내부에서 명령

나는 스칼라 스크립트가 클러스터 모드에서 스파크에 의해 실행되는 내부에서 HDFS 특정 명령을 실행하기 위해 노력하고있어. 명령 아래 :

val cmd = Seq("hdfs","dfs","-copyToLocal","/tmp/file.dat","/path/to/local")
val result = cmd.!!

이 작업은 다음과 같이 오류가있는이 단계에서 실패

java.io.FileNotFoundException: /var/run/cloudera-scm-agent/process/2087791-yarn-NODEMANAGER/log4j.properties (Permission denied)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
        at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557)
        at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
        at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
        at org.apache.log4j.Logger.getLogger(Logger.java:104)
        at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:262)
        at org.apache.commons.logging.impl.Log4JLogger.<init>(Log4JLogger.java:108)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

나는 스파크 쉘에서 별도로 같은 명령을 실행할 때, 그것은 잘 실행하고 파일도 복사됩니다.

scala> val cmd = Seq("hdfs","dfs","-copyToLocal","/tmp/file_landing_area/file.dat","/tmp/local_file_area")
cmd: Seq[String] = List(hdfs, dfs, -copyToLocal, /tmp/file_landing_area/file.dat, /tmp/local_file_area)

scala> val result = cmd.!!
result: String = ""

나는 권한 거부 오류를 이해하지 않습니다. 그것은 FileNotFoundException이로 표시하지만. 완전히 혼란.

어떤 아이디어?

해결법

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

    1.오류 당, 그것은 HDFS에게 내가 구성 문제를 의심 VAR 폴더에 데이터를 검사하거나 하나를 해결하기 가리키는되지 않습니다. 서열을 사용하고 HDFS 명령을 실행하는 것은 좋은 방법이 아닙니다. 그것은 단지 불꽃 쉘 유용합니다. 코드 바람직하지에서 같은 방법을 사용. 대신이의에서 또는 HDFS에 데이터를 이동 스칼라 파일 시스템 API 이하로 사용하려고합니다. 당신을 도울 수있는 참조 용 샘플 코드 아래에 확인하시기 바랍니다.

    오류 당, 그것은 HDFS에게 내가 구성 문제를 의심 VAR 폴더에 데이터를 검사하거나 하나를 해결하기 가리키는되지 않습니다. 서열을 사용하고 HDFS 명령을 실행하는 것은 좋은 방법이 아닙니다. 그것은 단지 불꽃 쉘 유용합니다. 코드 바람직하지에서 같은 방법을 사용. 대신이의에서 또는 HDFS에 데이터를 이동 스칼라 파일 시스템 API 이하로 사용하려고합니다. 당신을 도울 수있는 참조 용 샘플 코드 아래에 확인하시기 바랍니다.

    import org.apache.hadoop.fs
    import org.apache.hadoop.fs._
    val conf = new Configuration()
    
    val fs = path.getFileSystem(conf)
    
    val hdfspath = new Path("hdfs:///user/nikhil/test.csv")
    val localpath = new Path("file:///home/cloudera/test/")
    
    fs.copyToLocalFile(hdfspath,localpath)
    

    스칼라 파일 시스템 API에 대한 자세한 참조를 위해 아래 링크를 사용하십시오.

    https://hadoop.apache.org/docs/r2.9.0/api/org/apache/hadoop/fs/FileSystem.html#copyFromLocalFile(boolean,%20boolean,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.fs.Path)

  2. from https://stackoverflow.com/questions/56420928/executing-hdfs-commands-from-inside-scala-script by cc-by-sa and MIT license