使用Scala将文件写入HDFS
我正在尝试使用scala文件系统Api将文件写入HDFS,在客户端以及hadoop日志上出现以下错误: 文件/user/testuser/test.txt只能复制到0个节点 而不是复制(=1)。有1个数据节点正在运行,1个 节点在此操作中被排除 testuser具有读取、写入和执行的权限。我检查了ambari上的hdfs,它已经启动并运行,不知道为什么会出现这个错误 在谷歌出错后,我已经尝试停止所有服务,格式化namenode并启动所有服务,如下面链接所示 我仍然有同样的错误。任何关于我做错了什么的建议,我都是hadoop新手,所以任何建议都将受到欢迎 下面是我正在使用的scala代码使用Scala将文件写入HDFS,scala,hadoop,hdfs,Scala,Hadoop,Hdfs,我正在尝试使用scala文件系统Api将文件写入HDFS,在客户端以及hadoop日志上出现以下错误: 文件/user/testuser/test.txt只能复制到0个节点 而不是复制(=1)。有1个数据节点正在运行,1个 节点在此操作中被排除 testuser具有读取、写入和执行的权限。我检查了ambari上的hdfs,它已经启动并运行,不知道为什么会出现这个错误 在谷歌出错后,我已经尝试停止所有服务,格式化namenode并启动所有服务,如下面链接所示 我仍然有同样的错误。任何关于我做错
def write(uri: String, filePath: String, data: Array[Byte]) = {
System.setProperty("HADOOP_USER_NAME", "usernamehere")
val path = new Path(filePath)
val conf = new Configuration()
conf.set("fs.defaultFS", uri)
conf.set("dfs.client.use.datanode.hostname", "true");
conf.addResource(new Path("/path/core-site.xml"));
conf.addResource(new Path("/path/hdfs-site.xml"));
val fs = FileSystem.get(conf)
val os = fs.create(path)
fs.setPermission(path,FsPermission.getDefault)
val out = new BufferedOutputStream(os)
println(data.length)
out.write(data)
out.flush()
out.close()
fs.close()
}
感谢您将任何文件写入HDFS,您只需使用
HDFS
命令,如copyFromLocal
假设您将Spark与scala一起使用,那么您需要使用Spark文件编写命令,如
some_dataframe.write.mode(SaveMode.Overwrite).parquet("c:\\MyWorkSpace\\Spark\\")
HDFS理解上述命令,以按照复制因子复制数据。但是,如果在HDFS中使用scala文件系统api,则会导致问题,因为scala无法理解HDFS的复制、数据块、分区等功能。scala不需要理解块放置的复制。。。文件系统API与从命令行调用
hdfs put
无异。您需要禁用文件上的复制或添加另一个数据节点