使用Scala将文件写入HDFS

使用Scala将文件写入HDFS,scala,hadoop,hdfs,Scala,Hadoop,Hdfs,我正在尝试使用scala文件系统Api将文件写入HDFS,在客户端以及hadoop日志上出现以下错误: 文件/user/testuser/test.txt只能复制到0个节点 而不是复制(=1)。有1个数据节点正在运行,1个 节点在此操作中被排除 testuser具有读取、写入和执行的权限。我检查了ambari上的hdfs,它已经启动并运行,不知道为什么会出现这个错误 在谷歌出错后,我已经尝试停止所有服务,格式化namenode并启动所有服务,如下面链接所示 我仍然有同样的错误。任何关于我做错

我正在尝试使用scala文件系统Api将文件写入HDFS,在客户端以及hadoop日志上出现以下错误:

文件/user/testuser/test.txt只能复制到0个节点 而不是复制(=1)。有1个数据节点正在运行,1个 节点在此操作中被排除

testuser具有读取、写入和执行的权限。我检查了ambari上的hdfs,它已经启动并运行,不知道为什么会出现这个错误

在谷歌出错后,我已经尝试停止所有服务,格式化namenode并启动所有服务,如下面链接所示

我仍然有同样的错误。任何关于我做错了什么的建议,我都是hadoop新手,所以任何建议都将受到欢迎

下面是我正在使用的scala代码

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
无异。您需要禁用文件上的复制或添加另一个数据节点