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.getSplitsorg.apache.hadoop.fs.getDefaultUriスキーマが存在しない場合はを使用します。このメソッドは、Hadoop confの「fs.defaultFS」パラメーターを読み取ります。HADOOP_CONF_DIR環境変数を設定する場合、パラメーターは通常「hdfs:// ...」として設定されます。それ以外の場合は「file://」。


Javaでこれを行う方法を知っていますか?メソッドが表示されません。単純なファイルシステムからファイルをロードするためのパスを指定する簡単な方法がないことは非常にイライラします。
ブラッドエリス

自分に答える。spark-submitで渡す--fileスイッチがあります。そのため、ファイルパスはハードコーディングすることも、アプリの設定を構成することもできますが、そのパスも通知します。実行者がパスを確認できるように送信するとき。
ブラッドエリス

24

ゴンベの答えは素晴らしいです。しかし、それでも、file:///= ~/../../ではなく、と言いたいです$SPARK_HOME。これが私のような初心者のための時間を節約することを願っています。


4
file:///実行中のJVMから見たファイルシステムのルートフォルダーであり、ホームフォルダーの2つ上のレベルではありません。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を経由せずにドライバーでローカルにファイルをロードしてから、並列化を呼び出してコンテンツをワーカーに配布できます

OSに応じてfile://を前に置き、「/」または「\」を使用するように注意してください。


1
Sparkが$ SPARK_HOMEディレクトリからすべてのコンピューティングノードにデータを自動的にコピーする方法はありますか?それとも手動で行う必要がありますか?
Matthias

異なるファイルシステムフォーマットを処理するSparkソースコードはどこにありますか?
Saher Ahwal 2018年

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

これはsparkメーリングリストで議論されました、そしてこのメールを参照してくださいます。。

次の場所にhadoop fs -put <localsrc> ... <dst>ファイルをコピーしてくださいhdfs

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

5

これは、Spark 2.3とHadoopが共通の「hadoop」ユーザーのホームディレクトリにインストールされているときに発生しました。SparkとHadoopの両方が同じ共通ディレクトリにインストールされているため、Sparkはデフォルトでスキームをと見なしhdfs、入力ファイルの検索を開始しますfs.defaultFSHadoopで指定されているhdfsの下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ブログストレージファイルにアクセスできるようにします。3つのスラッシュは、実行中のノードコンテナーフォルダーへの相対参照です。

例:Sparkクラスターダッシュボードのエクスプローラーでのファイルのパスが次の場合:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

したがって、パスを説明するには次のようにします。sflcc1:は、ストレージアカウントの名前です。sflccspark:はクラスターノード名です。

そのため、現在のクラスターノード名を3つのスラッシュで参照しています。

お役に立てれば。


0

HDFSからファイルを読み取ろうとしている場合。SparkConfでパスを設定しようとしています

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

コードとしてフォーマットされるように、コードに4スペース/タブのインデントを追加してください。
宜しくお願いし

0

ローカルファイルをデータフレームに変換するためにsc.textFile(...)を使用する必要はありません。オプションの1つは、ローカルファイルを1行ずつ読み取り、それをSparkデータセットに変換することです。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

私は以下を試してみましたが、ローカルファイルシステムから動作しました。基本的に、sparkはローカル、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シェルでaを実行できますかbash-4.1#
Soumya Simanta 2014

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

これは、hadoop / hdfsなしのスパークで動作します。ただし、エラーダンプが発生したため、OPに対しては機能していないようです。
ポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.