私は素晴らしい スパークチュートリアルをフォローしています
だから私は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
をロードすることができますか?
明示的に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://"。
権部の答えは素晴らしいです。しかし、私はまだfile:///
ではなく~/../../
= $SPARK_HOME
と述べたいと思います。これが私のような初心者のための時間を節約することを願っています。
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")
デスクトップにNewsArticle.txtというファイルがあります。
Sparkでは、次のように入力しました。
val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)
ファイルパスのすべての\ to /文字を変更する必要がありました。
それがうまくいったかどうかをテストするために、私は入力しました:
textFile.foreach(println)
Windows 7を実行していますが、Hadoopがインストールされていません。
注意:
ローカル(sc.textFile("file:///path to the file/")
)からデータをロードするときには、必ずローカルモードでsparkを実行してください。そうしないと、Caused by: Java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist
のようなエラーになります。さまざまなワーカーで実行されるエグゼキュータになると、このファイルはローカルパスに見つかりません。
これはスパークメーリングリストで議論されています、そして参照してください mail 。
hadoop fs -put <localsrc> ... <dst>
を使用してファイルをhdfs
にコピーします。
${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md
ファイルが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|
+----+-------+
Spark 2.3とHadoopも共通の "hadoop"ユーザーホームディレクトリの下にインストールされています。SparkとHadoopは同じ共通ディレクトリの下にインストールされているため、Sparkはデフォルトでこの方式をhdfs
とみなし、入力を探し始めます。 Hadoopのfs.defaultFS
のcore-site.xml
で指定されているhdfsの下のファイル。そのような場合、スキーマをfile:///<absoloute path to file>
として明示的に指定する必要があります。
HDFSからファイルを読み取ろうとしている場合。 SparkConfでパスを設定しようとしています
val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
conf.set("fs.defaultFS", "hdfs://hostname:9000")
ローカルファイルをデータフレームに変換するために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")
これは私が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つのスラッシュで表します。
お役に立てれば。