加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用Scala写入HDFS

发布时间:2020-12-16 08:49:46 所属栏目:安全 来源:网络整理
导读:我正在学习 Scala,我需要为HDFS编写一个自定义文件.我在笔记本电脑上使用vmware fusion在Cloudera映像上运行自己的HDFS. 这是我的实际代码: package org.glassfish.samplesimport org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSy
我正在学习 Scala,我需要为HDFS编写一个自定义文件.我在笔记本电脑上使用vmware fusion在Cloudera映像上运行自己的HDFS.

这是我的实际代码:

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

我可以使用终端和Hue访问hdfs

[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

这是我的pom.xml

我使用命令运行项目:

mvn clean包scala:运行

我做错了什么?先感谢您!

在@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!")
}

}

解决方法

看看这个 this example here.我认为问题是你没有使用配置默认文件系统

conf.set("fs.defaultFS","hdfs://quickstart.cloudera:8020")

并传递相对路径,如下所示:

fs.create(new Path("/tmp/mySample.txt"))

写入文件,直接在fs.create返回的输出流上调用’write’,如下所示:

val os = fs.create(new Path("/tmp/mySample.txt"))
os.write("This is a test".getBytes)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读