programing

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

nasanasas 2020. 8. 26. 07:58
반응형

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


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

그래서 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있습니까?


명시 적으로 지정하십시오 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 : //".


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


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

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

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

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

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

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


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

예:

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

주의:

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


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

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

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

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

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

textFile.foreach(println)

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


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

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

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

If the file is located in your Spark master node (e.g., in case of using AWS EMR), then launch the spark-shell in local mode first.

$ 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|
+----+-------+

Alternatively, you can first copy the file to HDFS from the local file system and then launch Spark in its default mode (e.g., YARN in case of using AWS EMR) to read the file directly.

$ 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|
+----+-------+

This has happened to me with Spark 2.3 with Hadoop also installed under the common "hadoop" user home directory.Since both Spark and Hadoop was installed under the same common directory, Spark by default considers the scheme as hdfs, and starts looking for the input files under hdfs as specified by fs.defaultFS in Hadoop's core-site.xml. Under such cases, we need to explicitly specify the scheme as file:///<absoloute path to file>.


This is the solution for this error that i was getting on Spark cluster that is hosted in Azure on a windows cluster:

Load the raw HVAC.csv file, parse it using the function

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

We use (wasb:///) to allow Hadoop to access azure blog storage file and the three slashes is a relative reference to the running node container folder.

For example: If the path for your file in File Explorer in Spark cluster dashboard is:

sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac

So to describe the path is as follows: sflcc1: is the name of the storage account. sflccspark: is the cluster node name.

So we refer to the current cluster node name with the relative three slashes.

Hope this helps.


If your trying to read file form HDFS. trying setting path in SparkConf

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

You do not have to use sc.textFile(...) to convert local files into dataframes. One of options is, to read a local file line by line and then transform it into Spark Dataset. Here is an example for Windows machine in Java:

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);

Now you can use dataframe data in your code.


I tried the following and it worked from my local file system.. Basically spark can read from local, HDFS and AWS S3 path

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

try

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

참고URL : https://stackoverflow.com/questions/27299923/how-to-load-local-file-in-sc-textfile-instead-of-hdfs

반응형