Как писать в HDFS с помощью Scala
Я изучаю Scala, и мне нужно написать пользовательский файл в HDFS. У меня есть собственные HDFS, работающие на образе Cloudera с помощью vmware fusion на моем ноутбуке.
Это мой фактический код:
package org.glassfish.samples
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.PrintWriter;
/**
* @author ${user.name}
*/
object App {
def main(args : Array[String]) {
println( "Trying to write to HDFS..." )
val conf = new Configuration()
val fs= FileSystem.get(conf)
val output = fs.create(new Path("hdfs://quickstart.cloudera:8020/tmp/mySample.txt"))
val writer = new PrintWriter(output)
try {
writer.write("this is a test")
writer.write("n")
}
finally {
writer.close()
}
print("Done!")
}
}
и я получаю это исключение:
Caused by: java.lang.IllegalArgumentException: Wrong FS: hdfs://quickstart.cloudera:8020/tmp, expected: file:///
at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:645)
at org.apache.hadoop.fs.RawLocalFileSystem.pathToFile(RawLocalFileSystem.java:80)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:414)
at org.apache.hadoop.fs.ChecksumFileSystem.mkdirs(ChecksumFileSystem.java:588)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:439)
at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:426)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:889)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:786)
at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:775)
at org.glassfish.samples.App$.main(App.scala:19)
at org.glassfish.samples.App.main(App.scala)
... 6 more
Я могу получить доступ к hdfs с помощью терминала и Hue
[cloudera@quickstart ~]$ hdfs dfs -ls /tmp
Found 3 items
drwxr-xr-x - hdfs supergroup 0 2015-06-09 17:54 /tmp/hadoop-yarn
drwx-wx-wx - hive supergroup 0 2015-08-17 15:24 /tmp/hive
drwxr-xr-x - cloudera supergroup 0 2015-08-17 16:50 /tmp/labdata
Это мой пом.в XML
Я запустил проект с помощью команды:
mvn чистый пакет скала: беги!--5-->
что я делаю неправильно? заранее спасибо!
редактировать после @ jeroenr советы
это фактический код:
package org.glassfish.samples
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.PrintWriter;
/**
* @author ${user.name}
*/
object App {
//def foo(x : Array[String]) = x.foldLeft("")((a,b) => a + b)
def main(args : Array[String]) {
println( "Trying to write to HDFS..." )
val conf = new Configuration()
//conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020")
conf.set("fs.defaultFS", "hdfs://192.168.30.147:8020")
val fs= FileSystem.get(conf)
val output = fs.create(new Path("/tmp/mySample.txt"))
val writer = new PrintWriter(output)
try {
writer.write("this is a test")
writer.write("n")
}
finally {
writer.close()
println("Closed!")
}
println("Done!")
}
}
1 ответов
посмотри этот пример здесь. Я думаю, проблема в том, что вы не настраиваете файловую систему по умолчанию с помощью
conf.set("fs.defaultFS", "hdfs://quickstart.cloudera:8020")
и пройти относительный путь, вот так:
fs.create(new Path("/tmp/mySample.txt"))
чтобы записать в файл, вызовите "write" непосредственно в выходном потоке, возвращаемом fs.create, например:
val os = fs.create(new Path("/tmp/mySample.txt"))
os.write("This is a test".getBytes)