[HADOOP] HDFS 디렉토리의 파일을 열거하는 방법
HADOOPHDFS 디렉토리의 파일을 열거하는 방법
HDFS 디렉토리의 파일을 어떻게 열거합니까? Scala를 사용하여 Apache Spark 클러스터의 파일을 열거하기위한 것입니다. sc.textfile () 옵션이있는 것을 볼 수 있지만 내용을 잘 읽습니다. 파일 이름 만 읽으 려합니다.
나는 listStatus를 실제로 시도했다. 그러나 일하지 않았다. 아래 오류를 얻으십시오. Azure HDInsight Spark을 사용하고 BLOB 저장소 폴더 인 "testContainer@testhdi.blob.core.windows.net/example/"에는 .json 파일이 들어 있습니다.
val fs = FileSystem.get(new Configuration())
val status = fs.listStatus(new Path("wasb://testContainer@testhdi.blob.core.windows.net/example/"))
status.foreach(x=> println(x.getPath)
=========
Error:
========
java.io.FileNotFoundException: Filewasb://testContainer@testhdi.blob.core.windows.net/example does not exist.
at org.apache.hadoop.fs.azure.NativeAzureFileSystem.listStatus(NativeAzureFileSystem.java:2076)
at $iwC$$iwC$$iwC$$iwC.<init>(<console>:23)
at $iwC$$iwC$$iwC.<init>(<console>:28)
at $iwC$$iwC.<init>(<console>:30)
at $iwC.<init>(<console>:32)
at <init>(<console>:34)
at .<init>(<console>:38)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1346)
at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
at com.cloudera.livy.repl.scalaRepl.SparkInterpreter$$anonfun$executeLine$1.apply(SparkInterpreter.scala:272)
at com.cloudera.livy.repl.scalaRepl.SparkInterpreter$$anonfun$executeLine$1.apply(SparkInterpreter.scala:272)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at scala.Console$.withOut(Console.scala:126)
at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.executeLine(SparkInterpreter.scala:271)
at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.executeLines(SparkInterpreter.scala:246)
at com.cloudera.livy.repl.scalaRepl.SparkInterpreter.execute(SparkInterpreter.scala:104)
at com.cloudera.livy.repl.Session.com$cloudera$livy$repl$Session$$executeCode(Session.scala:98)
at com.cloudera.livy.repl.Session$$anonfun$3.apply(Session.scala:73)
at com.cloudera.livy.repl.Session$$anonfun$3.apply(Session.scala:73)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
감사!
해결법
-
==============================
1.이것이 실패하는 이유는 실제로 testContainer가 아닌 기본 저장소 컨테이너를보고 있기 때문에 예제 폴더를 찾지 못하기 때문입니다. 경로를 wasb : //testContainer@testhdi.blob.core.windows.net/로 변경하면이를 볼 수 있으며 다른 컨테이너의 파일을 나열합니다.
이것이 실패하는 이유는 실제로 testContainer가 아닌 기본 저장소 컨테이너를보고 있기 때문에 예제 폴더를 찾지 못하기 때문입니다. 경로를 wasb : //testContainer@testhdi.blob.core.windows.net/로 변경하면이를 볼 수 있으며 다른 컨테이너의 파일을 나열합니다.
왜 그런지 모르지만 다음과 같이 FileSystem.get 호출에 경로를 전달하여 문제를 해결할 수 있음을 발견했습니다.
val fs = FileSystem.get(new java.net.URI("wasb://testContainer@testhdi.blob.core.windows.net/example/"), new Configuration()) val status = fs.listStatus(new Path("wasb://testContainer@testhdi.blob.core.windows.net/example/")) status.foreach(x=> println(x.getPath)
-
==============================
2.FileSystem 클래스를 참조하십시오.
FileSystem 클래스를 참조하십시오.
val fs = FileSystem.get(new Configuration()) val status = fs.listStatus(new Path(HDFS_PATH)) status.foreach(x=> println(x.getPath)
참고 : 아래의 자바 또는 스칼라 같은 언어에서 액세스 할 수있는 HDFS API는 자바 예제입니다.
/** * Method listFileStats. * * @param destination * @param fs * @throws FileNotFoundException * @throws IOException */ public static void listFileStats(final String destination, final FileSystem fs) throws FileNotFoundException, IOException { final FileStatus[] statuss = fs.listStatus(new Path(destination)); for (final FileStatus status : statuss) { LOG.info("-- status {} ", status.toString()); LOG.info("Human readable size {} of file ", FileUtils.byteCountToDisplaySize(status.getLen())); //import org.apache.commons.io.FileUtils; } } }
from https://stackoverflow.com/questions/37903445/how-to-enumerate-files-in-hdfs-directory by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop : start-dfs.sh 연결이 거부되었습니다. (0) | 2019.06.29 |
---|---|
[HADOOP] 스레드 "main"의 예외 org.apache.hadoop.ipc.RemoteException : 서버 IPC 버전 9가 클라이언트 버전 4와 통신 할 수 없습니다. 어떻게 해결합니까? (0) | 2019.06.29 |
[HADOOP] Spark가 서브 쿼리를 지원합니까? [복제] (0) | 2019.06.29 |
[HADOOP] hiveconf 변수를 파일에서로드 할 수 있습니까? (HiveQL 파일과 분리) (0) | 2019.06.29 |
[HADOOP] HBase REST 서비스를 통해 Phoenix 테이블 데이터를 얻는 방법 (0) | 2019.06.29 |