HDFS के बजाय sc.textFile में स्थानीय फ़ाइल को कैसे लोड करें


100

मैं महान स्पार्क ट्यूटोरियल का अनुसरण कर रहा हूं

इसलिए मैं 46 मी पर कोशिश कर रहा हूं: 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 स्विच है जिसे आप स्पार्क-सबमिट के साथ पास करते हैं। तो, फ़ाइल पथ को हार्ड कोडित किया जा सकता है या हालांकि आपका कॉन्फ़िगेशन ऐप के लिए सेटअप है, लेकिन आप उस पथ को भी संकेत देते हैं। जब आप सबमिट करते हैं ताकि निष्पादक पथ देख सकें।
ब्रैड एलिस

24

गोन्बे का जवाब उत्कृष्ट है। लेकिन फिर भी मैं उस file:///= का उल्लेख करना चाहता हूं ~/../../, नहीं $SPARK_HOME। आशा है कि यह मेरे जैसे नए लोगों के लिए कुछ समय बचा सकता है।


4
file:///फाइलसिस्टम का रूट फोल्डर है जैसा कि जेवीएम को निष्पादित करते हुए देखा जाता है, न कि होम फोल्डर के ऊपर दो स्तरों पर। RFC 8089 में निर्दिष्ट URI प्रारूप है file://hostname/absolute/path। स्थानीय मामले में hostname(प्राधिकरण) घटक खाली है।
हिस्टोरो इलिव

17

जबकि स्पार्क स्थानीय फाइल सिस्टम से लोडिंग फ़ाइलों का समर्थन करता है, इसके लिए आवश्यक है कि आपके क्लस्टर में सभी नोड्स पर एक ही पथ पर फाइलें उपलब्ध हों।

कुछ नेटवर्क फाइल सिस्टम, जैसे एनएफएस, एएफएस और मैपआर की एनएफएस परत, उपयोगकर्ता के लिए एक नियमित फाइल सिस्टम के रूप में सामने आते हैं।

यदि आपका डेटा पहले से ही इन प्रणालियों में से एक में है, तो आप इसे एक फ़ाइल के रूप में निर्दिष्ट करके एक इनपुट के रूप में उपयोग कर सकते हैं : // पथ; स्पार्क इसे तब तक संभालेगा जब तक कि प्रत्येक नोड पर एक ही पथ पर फाइलसिस्टम आरोहित न हो जाए। हर नोड को एक ही रास्ता होना चाहिए

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

यदि आपकी फ़ाइल पहले से ही क्लस्टर के सभी नोड्स पर नहीं है, तो आप इसे स्पार्क से गुजरे बिना ड्राइवर पर स्थानीय रूप से लोड कर सकते हैं और फिर श्रमिकों को सामग्री वितरित करने के लिए समानांतर कॉल कर सकते हैं।

ध्यान रखें कि फ़ाइल को सामने रखें: // और ओएस के अनुसार "/" या "\" का उपयोग करें।


1
वहाँ एक तरीका है कि स्पार्क स्वचालित रूप से अपने $ SPARK_HOME निर्देशिका से सभी कंप्यूटिंग नोड्स के डेटा की नकल करेगा। या क्या आपको मैन्युअल रूप से ऐसा करने की आवश्यकता है?
मथायस

स्पार्क सोर्स कोड अलग-अलग फाइल सिस्टम फॉर्मेट को कहां हैंडल कर रहा है?
साहेर अहवाल

12

आपको फ़ाइल का पथ "फ़ाइल: /// निर्देशिका / फ़ाइल" के रूप में निर्दिष्ट करना होगा

उदाहरण:

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

12

ध्यान:

सुनिश्चित करें कि आप स्थानीय मोड में स्पार्क चलाते हैं जब आप स्थानीय ( sc.textFile("file:///path to the file/")) से डेटा लोड करते हैं या आपको इस तरह की त्रुटि मिलेगी Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist। विभिन्न कर्मचारियों पर चलने वाले Beasuse निष्पादक को यह फ़ाइल स्थानीय पथ में नहीं मिलेगी।


11

यदि फ़ाइल आपके स्पार्क मास्टर नोड (उदाहरण के लिए, एडब्ल्यूएस ईएमआर का उपयोग करने के मामले में) में स्थित है, तो पहले स्थानीय मोड में स्पार्क-शेल लॉन्च करें।

$ 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) सीधे फ़ाइल को पढ़ने के लिए।

$ 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 नामक एक फाइल है।

स्पार्क में, मैंने टाइप किया:

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

मुझे फ़ाइलपथ के लिए सभी \ / वर्ण बदलने की आवश्यकता थी।

यह काम करने के लिए परीक्षण करने के लिए, मैंने टाइप किया:

textFile.foreach(println)

मैं विंडोज 7 चला रहा हूं और मेरे पास Hadoop स्थापित नहीं है।


5

यह स्पार्क मेलिंग सूची में चर्चा की गई है, और कृपया इस मेल को देखें ।

आपको hadoop fs -put <localsrc> ... <dst>फ़ाइल को कॉपी में उपयोग करना चाहिए hdfs:

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

5

यह मेरे साथ स्पार्क 2.3 के साथ हुआ है, Hadoop के साथ भी आम "हैडऑप" यूजर होम डायरेक्टरी के तहत स्थापित किया गया है। तब स्पार्क और Hadoop दोनों को समान कॉमन डायरेक्टरी के तहत इंस्टॉल किया गया था, स्पार्क डिफ़ॉल्ट रूप से इस स्कीम को मानता है hdfs, और इनपुट फ़ाइलों की तलाश शुरू करता है। fs.defaultFSHadoop के द्वारा निर्दिष्ट hdfs के तहत core-site.xml। ऐसे मामलों के तहत, हमें योजना को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है file:///<absoloute path to file>


0

इस त्रुटि के लिए यह समाधान है जो मुझे स्पार्क क्लस्टर पर मिल रहा था जो कि विंडोज़ क्लस्टर पर एज़्योर में होस्ट किया गया है:

कच्चे HVAC.csv फ़ाइल को लोड करें, फ़ंक्शन का उपयोग करके इसे पार्स करें

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

हम Hadoop को azure ब्लॉग स्टोरेज फ़ाइल तक पहुंचने की अनुमति देने के लिए (wasb: ///) का उपयोग करते हैं और तीन स्लैश रनिंग नोड कंटेनर फ़ोल्डर का एक सापेक्ष संदर्भ है।

उदाहरण के लिए: यदि स्पार्क क्लस्टर डैशबोर्ड में फ़ाइल एक्सप्लोरर में आपकी फ़ाइल के लिए पथ है:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ एचवीएसी

इसलिए पथ का वर्णन इस प्रकार है: sflcc1: भंडारण खाते का नाम है। sflccspark: क्लस्टर नोड नाम है।

इसलिए हम सापेक्ष तीन स्लैश के साथ वर्तमान क्लस्टर नोड नाम का उल्लेख करते हैं।

उम्मीद है की यह मदद करेगा।


0

यदि आपकी फ़ाइल फॉर्म को HDFS पढ़ने की कोशिश कर रहा है। SparkConf में सेटिंग पथ की कोशिश कर रहा है

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

कृपया अपने कोड में 4-स्पेस / टैब इंडेंटेशन जोड़ें ताकि यह कोड के रूप में स्वरूपित हो जाए। सबसे अच्छा संबंध है
याकॉव

0

आपको स्थानीय फ़ाइलों को डेटाफ्रेम में बदलने के लिए sc.textFile (...) का उपयोग करने की आवश्यकता नहीं है। विकल्पों में से एक है, एक स्थानीय फ़ाइल लाइन को लाइन से पढ़ना और फिर उसे स्पार्क डेटासेट में बदलना। यहाँ जावा में विंडोज मशीन के लिए एक उदाहरण है:

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

मैंने निम्नलिखित की कोशिश की और यह मेरे स्थानीय फ़ाइल सिस्टम से काम करता है .. मूल रूप से स्पार्क स्थानीय, एचडीएफएस और एडब्ल्यूएस एस 3 पथ से पढ़ सकता है

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
जस

क्या आप pwdबैश शेल पर कर सकते हैंbash-4.1#
सौम्या सिमंता

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

यह मेरे लिए हैडूप / एचडीएफ़एस के बिना स्पार्क पर काम करता है। हालाँकि, यह ओपी के लिए काम नहीं कर रहा है, क्योंकि इसने उन्हें एक त्रुटि डंप दिया।
पॉल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.