web-dev-qa-db-ja.com

HDFSの代わりにsc.textFileにローカルファイルをロードする方法

私は素晴らしい スパークチュートリアルをフォローしています

だから私はREADME.mdをロードするために46m:00sで試みていますが、私がしていることに失敗します:

$ 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をロードすることができますか?

89
Jas

明示的にsc.textFile("file:///path to the file/")を指定してみてください。 Hadoop環境が設定されているとエラーが発生します。

SparkContext.textFileは内部的にorg.Apache.hadoop.mapred.FileInputFormat.getSplitsを呼び出します。これは、schemaが存在しない場合はorg.Apache.hadoop.fs.getDefaultUriを使用します。このメソッドはHadoop confの "fs.defaultFS"パラメータを読み込みます。 HADOOP_CONF_DIR環境変数を設定した場合、このパラメータは通常 "hdfs:// ..."として設定されます。それ以外の場合は "file://"。

157
suztomo

権部の答えは素晴らしいです。しかし、私はまだfile:///ではなく~/../../ = $SPARK_HOMEと述べたいと思います。これが私のような初心者のための時間を節約することを願っています。

21
zaxliu

Sparkはローカルファイルシステムからのファイルのロードをサポートしていますが、ファイルはクラスタ内のすべてのノードの同じパスにあることが必要です。

NFS、AFS、MapRのNFSレイヤーなどの一部のネットワークファイルシステムは、通常のファイルシステムとしてユーザーに公開されています。

データがすでにこれらのシステムのいずれかにある場合は、file://パスを指定するだけで入力として使用できます。ファイルシステムが各ノードの同じパスにマウントされている限り、Sparkはそれを処理します。すべてのノードは同じパスを持つ必要があります

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

ファイルがクラスタ内のすべてのノードにまだ存在していない場合は、Sparkを経由せずにドライバにローカルにロードしてから、parallelizeを呼び出して内容をワーカーに配布できます

File://を先頭に置き、OSに応じて "/"または "\"を使用するように注意してください。

12
Aklank Jain

ファイルのパスを次のように指定するだけです。 "file:/// directory/file"

例:

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

デスクトップにNewsArticle.txtというファイルがあります。

Sparkでは、次のように入力しました。

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

ファイルパスのすべての\ to /文字を変更する必要がありました。

それがうまくいったかどうかをテストするために、私は入力しました:

textFile.foreach(println)

Windows 7を実行していますが、Hadoopがインストールされていません。

7
Gene

注意:

ローカル(sc.textFile("file:///path to the file/"))からデータをロードするときには、必ずローカルモードでsparkを実行してください。そうしないと、Caused by: Java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not existのようなエラーになります。さまざまなワーカーで実行されるエグゼキュータになると、このファイルはローカルパスに見つかりません。

6
Matiji66

これはスパークメーリングリストで議論されています、そして参照してください mail

hadoop fs -put <localsrc> ... <dst>を使用してファイルをhdfsにコピーします。

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

ファイルが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にコピーしてから、Sparkをデフォルトモード(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|
+----+-------+
5
Joarder Kamal

Spark 2.3とHadoopも共通の "hadoop"ユーザーホームディレクトリの下にインストールされています。SparkとHadoopは同じ共通ディレクトリの下にインストールされているため、Sparkはデフォルトでこの方式をhdfsとみなし、入力を探し始めます。 Hadoopのfs.defaultFScore-site.xmlで指定されているhdfsの下のファイル。そのような場合、スキーマをfile:///<absoloute path to file>として明示的に指定する必要があります。

4
Binita Bharati

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

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

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

私は以下を試してみて、それは私のローカルファイルシステムから動作しました..基本的に火花はローカル、HDFSとAWS S3のパスから読み取ることができます

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

これは私がWindowsクラスタ上のAzureでホストされているSparkクラスタに乗っていたというこのエラーの解決策です:

生のHVAC.csvファイルをロードし、関数を使用してそれを解析します

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

HadoopがAzureブログストレージファイルにアクセスできるように(wasb:///)を使用します。3つのスラッシュは、実行中のノードコンテナーフォルダーへの相対参照です。

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

sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac

そのため、パスの説明は次のようになります。sflcc1:ストレージアカウントの名前です。 sflccspark:はクラスタノード名です。

そのため、現在のクラスタノード名を相対的な3つのスラッシュで表します。

お役に立てれば。

0
Mostafa