স্থানীয় ফাইলগুলি কীভাবে এইচডিএফএসের পরিবর্তে sc.textFile এ লোড করবেন


100

আমি দুর্দান্ত স্পার্ক টিউটোরিয়াল অনুসরণ করছি

সুতরাং আমি লোড করার জন্য 46 মি: 00 সেকেন্ড চেষ্টা করছি 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/")। হ্যাডোপ পরিবেশ সেট করা থাকলে ত্রুটি ঘটে।

SparkContext.textFile অভ্যন্তরীণ কল করে org.apache.hadoop.mapred.FileInputFormat.getSplits, যা org.apache.hadoop.fs.getDefaultUriস্কিমা অনুপস্থিত থাকলে পরিবর্তে ব্যবহার করে । এই পদ্ধতিতে হাদোপ কনফের "fs.defaultFS" পরামিতি পড়ে। আপনি যদি HADOOP_CONF_DIR পরিবেশ পরিবর্তনশীল সেট করেন তবে প্যারামিটারটি সাধারণত "hdfs: // ..." হিসাবে সেট করা থাকে; অন্যথায় "ফাইল: //"।


জাভা দিয়ে এটি কীভাবে করবেন তা আপনি কি জানেন? আমি কোন পদ্ধতি দেখছি না। এটি খুব হতাশার সাথে খুঁজে পেয়েছি যে কোনও সরল ফাইল সিস্টেম থেকে কোনও ফাইল লোড করার কোনও সহজ উপায় দেওয়ার সহজ উপায় নেই।
ব্র্যাড এলিস

আমার নিজের উত্তর। একটি স্পাই-সুইচ রয়েছে যা আপনি স্পার্ক-জমা দিয়ে পাস করবেন। সুতরাং, ফাইলের পথটি হার্ড কোডিং করা যেতে পারে বা আপনার কনফিগারেশনটি অ্যাপ্লিকেশানের জন্য সেটআপ করা যায় তবে আপনি সেই পথটিও সিগন্যাল করেন। যখন আপনি জমা দিন যাতে এক্সিকিউটররা পথটি দেখতে পারে।
ব্র্যাড এলিস

24

gonbe এর উত্তর দুর্দান্ত। তবে এখনও আমি উল্লেখ করতে চাই file:///= ~/../../, না $SPARK_HOME। আশা করি এটি আমার মতো নবীনদের জন্য কিছুটা সময় সাশ্রয় করতে পারে।


4
file:///কার্যনির্বাহী জেভিএম দ্বারা দেখানো ফাইল সিস্টেমের মূল ফোল্ডারটি, হোম ফোল্ডারের উপরে দুটি স্তর নয়। কোনো URI বিন্যাসে উল্লিখিত বোঝায় যা RFC 8089 হয় file://hostname/absolute/path। স্থানীয় ক্ষেত্রে hostname(কর্তৃপক্ষ) উপাদানটি খালি থাকে।
হিস্টো ইলিভ

17

স্পার্ক স্থানীয় ফাইল সিস্টেম থেকে ফাইলগুলি লোড করার পক্ষে সমর্থন করে, আপনার ক্লাস্টারের সমস্ত নোডগুলিতে ফাইলগুলি একই পাতায় উপলব্ধ হওয়া দরকার।

কিছু নেটওয়ার্ক ফাইল সিস্টেম, যেমন এনএফএস, এএফএস, এবং ম্যাপআর এর এনএফএস স্তর, ব্যবহারকারীকে নিয়মিত ফাইল সিস্টেম হিসাবে প্রকাশ করা হয়।

যদি আপনার ডেটা ইতিমধ্যে এই সিস্টেমে কোনও একটিতে থাকে তবে আপনি কেবল একটি ফাইল: // পাথ নির্দিষ্ট করে এটিকে ইনপুট হিসাবে ব্যবহার করতে পারেন ; স্পার্ক এটিকে হ্যান্ডেল করবে যতক্ষণ না প্রতিটি নোডের একই পথে ফাইল সিস্টেম মাউন্ট করা থাকে। প্রতিটি নোডের একই পথ থাকা দরকার

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

যদি আপনার ফাইলটি ইতিমধ্যে ক্লাস্টারে থাকা সমস্ত নোডে নেই, আপনি স্পার্কের মধ্যে দিয়ে না গিয়েই এটিকে স্থানীয়ভাবে ড্রাইভারের মধ্যে লোড করতে পারেন এবং তারপরে সামগ্রীগুলিতে কর্মীদের বিতরণ করার জন্য সমান্তরালে কল করতে পারেন can

ফাইলটি: // সামনে রাখার জন্য ওএস অনুসারে "/" বা "\" ব্যবহারের যত্ন নিন।


1
এমন কোনও উপায় আছে যে স্পার্ক তার $ স্পার্কহোম ডিরেক্টরি থেকে সমস্ত কম্পিউটিং নোডে স্বয়ংক্রিয়ভাবে ডেটা অনুলিপি করবে। নাকি আপনার নিজেই এটি করা দরকার?
ম্যাথিয়াস

স্পার্ক উত্স কোডটি বিভিন্ন ফাইল সিস্টেমের ফর্ম্যাটগুলি পরিচালনা করছে?
সাহের আহওয়াল

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। বিভিন্ন কর্মীদের উপর চালিত বিকাস এক্সিকিউটররা এই ফাইলটিকে স্থানীয় পথে খুঁজে পাবেন না।


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

বিকল্পভাবে, আপনি প্রথমে স্থানীয় ফাইল সিস্টেম থেকে ফাইলটি এইচডিএফএসে অনুলিপি করতে পারেন এবং তারপরে ফাইলটি সরাসরি পড়ার জন্য স্পার্কটিকে তার ডিফল্ট মোডে (যেমন, ডাব্লুএস ইএমআর ব্যবহারের ক্ষেত্রে 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

আমার ডেস্কটপে আমার কাছে নিউজআর্টিকাল.টেক্সট নামে একটি ফাইল আছে।

স্পার্কে, আমি টাইপ করেছি:

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

ফাইলপথের জন্য আমার সমস্ত \ থেকে / চরিত্র পরিবর্তন করা দরকার।

এটি কাজ করে কিনা পরীক্ষা করার জন্য, আমি টাইপ করেছি:

textFile.foreach(println)

আমি উইন্ডোজ 7 চালাচ্ছি এবং আমার কাছে হ্যাডোপ ইনস্টল নেই।


5

এটি স্পার্ক মেইলিং তালিকায় আলোচনা করা হয়েছে এবং দয়া করে এই মেলটি উল্লেখ করুন ।

hadoop fs -put <localsrc> ... <dst>আপনার ফাইলটি অনুলিপি করা উচিত hdfs:

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

5

স্পার্ক ২.৩ এর সাথে আমার সাথে হ্যাডোপও সাধারণ "hadoop" ব্যবহারকারীর হোম ডিরেক্টরিতে ইনস্টল করা আছে। স্পার্ক এবং হাদুপ উভয়ই একই সাধারণ ডিরেক্টরিতে ইনস্টল করা হয়েছে, স্পার্কটি ডিফল্টরূপে স্কিমটিকে বিবেচনা করে hdfsএবং ইনপুট ফাইলগুলি সন্ধান করতে শুরু করে যেমন দ্বারা নির্দিষ্ট hdfs অধীনে fs.defaultFSHadoop এর এর core-site.xml। এই ধরনের ক্ষেত্রে, আমাদের স্পষ্টভাবে হিসাবে স্কিমটি নির্দিষ্ট করতে হবে file:///<absoloute path to file>


0

এই ত্রুটির জন্য এটিই সমাধান যা আমি উইন্ডোজ ক্লাস্টারে অ্যাজুরে হোস্ট করা স্পার্ক ক্লাস্টারে পেয়েছিলাম:

কাঁচা HVAC.csv ফাইলটি লোড করুন, ফাংশনটি ব্যবহার করে পার্স করুন

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

আমরা হ্যাডোপকে অ্যাজুর ব্লগ স্টোরেজ ফাইলটিতে অ্যাক্সেসের অনুমতি দেওয়ার জন্য (wasb: ///) ব্যবহার করি এবং তিনটি স্ল্যাশ চলমান নোড কনটেইনার ফোল্ডারের সাথে সম্পর্কিত reference

উদাহরণস্বরূপ: স্পার্ক ক্লাস্টার ড্যাশবোর্ডের ফাইল এক্সপ্লোরারে যদি আপনার ফাইলের জন্য পথটি হয়:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ HVAC

পাথটি বর্ণনা করতে নীচে: sflcc1: হল স্টোরেজ অ্যাকাউন্টের নাম। sflccspark: ক্লাস্টার নোডের নাম।

সুতরাং আমরা আপেক্ষিক তিনটি স্ল্যাশের সাথে বর্তমান ক্লাস্টার নোডের নাম উল্লেখ করি।

আশাকরি এটা সাহায্য করবে.


0

যদি আপনার ফাইলটি এইচডিএফএস পড়ার চেষ্টা করা হয়। স্পার্ককনফে পথ নির্ধারণের চেষ্টা করছেন

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

আপনার কোডটিতে 4-স্পেস / ট্যাব ইন্ডেন্টেশন যুক্ত করুন যাতে এটি কোড হিসাবে ফর্ম্যাট হয়। শুভেচ্ছা
YakovL

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#
সৌম্য সিমন্ত

বাশ -৪.১ # পিডব্লিউডি
যাকোব

এটি আমার জন্য হ্যাডোপ / এইচডিএফএস ছাড়াই স্পার্কে কাজ করে। তবে এটি ওপিতে কাজ করছে বলে মনে হচ্ছে না, কারণ এটি তাদের একটি ত্রুটি ডাম্প দিয়েছে।
পল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.