HDFS 대신 sc.textFile에서 로컬 파일을로드하는 방법


100

나는 위대한 스파크 튜토리얼을 따르고 있습니다.

그래서 46m : 00s에서로드하려고 README.md하지만 내가하는 일에 실패하는 것입니다.

$ sudo docker run -i -t -h sandbox sequenceiq/spark:1.1.0 /etc/bootstrap.sh -bash
bash-4.1# cd /usr/local/spark-1.1.0-bin-hadoop2.4
bash-4.1# ls README.md
README.md
bash-4.1# ./bin/spark-shell
scala> val f = sc.textFile("README.md")
14/12/04 12:11:14 INFO storage.MemoryStore: ensureFreeSpace(164073) called with curMem=0, maxMem=278302556
14/12/04 12:11:14 INFO storage.MemoryStore: Block broadcast_0 stored as values in memory (estimated size 160.2 KB, free 265.3 MB)
f: org.apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at <console>:12
scala> val wc = f.flatMap(l => l.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://sandbox:9000/user/root/README.md
    at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:285)

어떻게로드 할 수 README.md있습니까?

답변:


177

명시 적으로 지정하십시오 sc.textFile("file:///path to the file/"). Hadoop 환경이 설정된 경우 오류가 발생합니다.

SparkContext.textFile은 내부적으로를 호출 org.apache.hadoop.mapred.FileInputFormat.getSplits하며 org.apache.hadoop.fs.getDefaultUri스키마가없는 경우 사용 합니다. 이 메소드는 Hadoop conf의 "fs.defaultFS"매개 변수를 읽습니다. HADOOP_CONF_DIR 환경 변수를 설정하면 매개 변수는 일반적으로 "hdfs : // ..."로 설정됩니다. 그렇지 않으면 "file : //".


Java로이 작업을 수행하는 방법을 알고 있습니까? 방법이 보이지 않습니다. 간단한 파일 시스템에서 파일을로드 할 수있는 경로를 제공하는 쉬운 방법이 없다는 사실이 매우 실망 스럽습니다.
Brad Ellis

나 자신에게 대답. spark-submit과 함께 전달하는 --file 스위치가 있습니다. 따라서 파일 경로는 하드 코딩되거나 구성이 앱에 설정되어 있지만 해당 경로에 신호를 보낼 수도 있습니다. 실행자가 경로를 볼 수 있도록 제출할 때.
Brad Ellis

24

gonbe의 대답은 훌륭합니다. 하지만 여전히 나는 그 언급 할 file:///=을 ~/../../하지 $SPARK_HOME. 이것이 저와 같은 newbs를 위해 시간을 절약 할 수 있기를 바랍니다.


4
file:///실행중인 JVM에서 볼 수있는 파일 시스템의 루트 폴더이며 홈 폴더의 두 수준 위가 아닙니다. RFC 8089에 지정된 URI 형식 은 file://hostname/absolute/path. 로컬의 경우 hostname(권한) 구성 요소가 비어 있습니다.
Hristo Iliev는

17

Spark는 로컬 파일 시스템에서 파일로드를 지원하지만 클러스터의 모든 노드에서 동일한 경로에서 파일을 사용할 수 있어야합니다.

NFS, AFS 및 MapR의 NFS 계층과 같은 일부 네트워크 파일 시스템은 일반 파일 시스템으로 사용자에게 노출됩니다.

데이터가 이미 이러한 시스템 중 하나에있는 경우 file : // 경로를 지정하여 입력으로 사용할 수 있습니다 . Spark는 파일 시스템이 각 노드의 동일한 경로에 마운트되는 한이를 처리합니다. 모든 노드는 동일한 경로를 가져야합니다.

 rdd = sc.textFile("file:///path/to/file")

파일이 클러스터의 모든 노드에없는 경우 Spark를 거치지 않고 드라이버에서 로컬로로드 한 다음 parallelize를 호출하여 콘텐츠를 작업자에게 배포 할 수 있습니다.

file : //을 앞에두고 OS에 따라 "/"또는 "\"를 사용하도록주의하십시오.


1
Spark가 $ SPARK_HOME 디렉토리에서 모든 컴퓨팅 노드로 데이터를 자동으로 복사하는 방법이 있습니까? 아니면 수동으로해야합니까?
Matthias

다른 파일 시스템 형식을 처리하는 스파크 소스 코드는 어디에 있습니까?
Saher Ahwal

12

파일 경로를 "file : /// directory / file" 로 지정하기 만하면 됩니다.

예:

val textFile = sc.textFile("file:///usr/local/spark/README.md")

12

주의:

local ( sc.textFile("file:///path to the file/")) 에서 데이터를로드 할 때 로컬 모드에서 spark를 실행해야합니다. 그렇지 않으면 이와 같은 오류가 발생합니다 Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. 다른 워커에서 실행되는 실행자는 로컬 경로에서이 파일을 찾지 못하기 때문입니다.


11

파일이 Spark 마스터 노드에있는 경우 (예 : AWS EMR을 사용하는 경우) 먼저 로컬 모드에서 spark-shell을 시작합니다.

$ spark-shell --master=local
scala> val df = spark.read.json("file:///usr/lib/spark/examples/src/main/resources/people.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> df.show()
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

또는 먼저 로컬 파일 시스템에서 HDFS로 파일을 복사 한 다음 기본 모드 (예 : AWS EMR을 사용하는 경우 YARN)에서 Spark를 시작하여 파일을 직접 읽을 수 있습니다.

$ hdfs dfs -mkdir -p /hdfs/spark/examples
$ hadoop fs -put /usr/lib/spark/examples/src/main/resources/people.json /hdfs/spark/examples
$ hadoop fs -ls /hdfs/spark/examples
Found 1 items
-rw-r--r--   1 hadoop hadoop         73 2017-05-01 00:49 /hdfs/spark/examples/people.json

$ spark-shell
scala> val df = spark.read.json("/hdfs/spark/examples/people.json")
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> df.show()
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

9

내 데스크톱에 NewsArticle.txt라는 파일이 있습니다.

Spark에서 다음을 입력했습니다.

val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)

파일 경로의 모든 \를 / 문자로 변경해야했습니다.

작동하는지 테스트하기 위해 다음을 입력했습니다.

textFile.foreach(println)

Windows 7을 실행 중이며 Hadoop이 설치되어 있지 않습니다.


5

이것은 스파크 메일 링리스트에서 논의되었으며,이 메일을 참조하십시오 .

hadoop fs -put <localsrc> ... <dst>파일을 hdfs다음 위치에 복사 해야합니다 .

${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md

5

이것은 Hadoop이 공통 "hadoop"사용자 홈 디렉토리에 설치된 Spark 2.3과 함께 나에게 발생했습니다. Spark와 Hadoop이 모두 동일한 공통 디렉토리에 설치되었으므로 기본적으로 Spark는 스키마를으로 간주 hdfs하고 입력 파일을 찾기 시작합니다. 에 의해 지정된 HDFS에서 fs.defaultFS하둡의에서 core-site.xml. 이러한 경우 체계를 file:///<absoloute path to file>.


0

이것은 Windows 클러스터의 Azure에서 호스팅되는 Spark 클러스터에서 발생한이 오류에 대한 솔루션입니다.

원시 HVAC.csv 파일을로드하고 함수를 사용하여 구문 분석합니다.

data = sc.textFile("wasb:///HdiSamples/SensorSampleData/hvac/HVAC.csv")

(wasb : ///)를 사용하여 Hadoop이 azure 블로그 저장소 파일에 액세스 할 수 있도록 허용하고 세 개의 슬래시는 실행중인 노드 컨테이너 폴더에 대한 상대 참조입니다.

예 : Spark 클러스터 대시 보드의 파일 탐색기에있는 파일 경로가 다음과 같은 경우

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

따라서 경로를 설명하는 방법은 다음과 같습니다. sflcc1 : 저장소 계정의 이름입니다. sflccspark : 클러스터 노드 이름입니다.

따라서 우리는 상대적인 세 개의 슬래시로 현재 클러스터 노드 이름을 참조합니다.

도움이 되었기를 바랍니다.


0

파일 형식 HDFS를 읽으려는 경우. SparkConf에서 경로 설정 시도

 val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
 conf.set("fs.defaultFS", "hdfs://hostname:9000")

코드 형식이 지정되도록 코드에 4 개의 공백 / 탭 들여 쓰기를 추가하세요. 감사합니다
YakovL

0

로컬 파일을 데이터 프레임으로 변환하기 위해 sc.textFile (...)을 사용할 필요가 없습니다. 옵션 중 하나는 로컬 파일을 한 줄씩 읽은 다음 Spark Dataset으로 변환하는 것입니다. 다음은 Java로 된 Windows 시스템의 예입니다.

StructType schemata = DataTypes.createStructType(
            new StructField[]{
                    createStructField("COL1", StringType, false),
                    createStructField("COL2", StringType, false),
                    ...
            }
    );

String separator = ";";
String filePath = "C:\\work\\myProj\\myFile.csv";
SparkContext sparkContext = new SparkContext(new SparkConf().setAppName("MyApp").setMaster("local"));
JavaSparkContext jsc = new JavaSparkContext (sparkContext );
SQLContext sqlContext = SQLContext.getOrCreate(sparkContext );

List<String[]> result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
    String line;
    while ((line = br.readLine()) != null) {
      String[] vals = line.split(separator);
      result.add(vals);
    }
 } catch (Exception ex) {
       System.out.println(ex.getMessage());
       throw new RuntimeException(ex);
  }
  JavaRDD<String[]> jRdd = jsc.parallelize(result);
  JavaRDD<Row> jRowRdd = jRdd .map(RowFactory::create);
  Dataset<Row> data = sqlContext.createDataFrame(jRowRdd, schemata);

이제 data코드에서 데이터 프레임 을 사용할 수 있습니다 .


0

나는 다음을 시도하고 그것은 내 로컬 파일 시스템에서 작동했습니다 .. 기본적으로 스파크는 로컬, HDFS 및 AWS S3 경로에서 읽을 수 있습니다.

listrdd=sc.textFile("file:////home/cloudera/Downloads/master-data/retail_db/products")

-6

시험

val f = sc.textFile("./README.md")

scala> val f = sc.textFile("./README.md") 14/12/04 12:54:33 INFO storage.MemoryStore: ensureFreeSpace(81443) called with curMem=164073, maxMem=278302556 14/12/04 12:54:33 INFO storage.MemoryStore: Block broadcast_1 stored as values in memory (estimated size 79.5 KB, free 265.2 MB) f: org.apache.spark.rdd.RDD[String] = ./README.md MappedRDD[5] at textFile at <console>:12 scala> val wc = f.flatMap(l => l.split(" ")).map(word => (word, 1)).reduceByKey(_ + _) org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://sandbox:9000/user/root/README.md at
Jas

당신은 할 수 pwdbash 쉘에bash-4.1#
Soumya Simanta에게

bash-4.1 # pwd /usr/local/spark-1.1.0-bin-hadoop2.4
Jas

이것은 hadoop / hdfs없이 스파크에서 나를 위해 작동합니다. 그러나 오류 덤프를 제공했기 때문에 OP에서 작동하지 않는 것 같습니다.
Paul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.