在Scala / Spark中将文件从HDFS上的一个文件夹移动到另一个文件夹

时间:2018-01-12 13:04:51

标签: scala hadoop apache-spark hdfs

我有两个路径,一个用于文件,一个用于文件夹。我想将文件移动到HDFS上的该文件夹中。我怎么能在Scala中做到这一点?我也使用Spark

如果相同的代码也适用于Windows路径,就像在HDFS上读取/写入文件一样,但不是必需的。

我尝试了以下内容:

val fs = FileSystem.get(sc.hadoopConfiguration)
fs.moveFromLocalFile(something, something2)

我收到以下错误:

  

线程中的异常" main" java.lang.IllegalArgumentException:错了   FS:hdfs:/user/o/datasets/data.txt,expected:file:///

moveToLocalFile()也是如此,因为它们意味着在文件系统之间传输文件,而不是在文件系统中传输文件。我也尝试了fs.rename()但是根本没有做任何事情(没有任何错误或任何错误)。

我基本上在一个目录中创建文件(用流写入它们),一旦完成,就需要移动到另一个目录中。这个不同的目录由Spark流监控,当Spark流尝试使用未完成的文件时,我遇到了一些问题

2 个答案:

答案 0 :(得分:4)

尝试以下Scala代码。

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

val hadoopConf = new Configuration()
val hdfs = FileSystem.get(hadoopConf)

val srcPath = new Path(srcFilePath)
val destPath = new Path(destFilePath)

hdfs.copyFromLocalFile(srcPath, destPath)

您还应该检查Spark是否在conf / spark-env.sh文件中设置了HADOOP_CONF_DIR变量。这将确保Spark将找到Hadoop配置设置。

build.sbt文件的依赖项:

libraryDependencies += "org.apache.hadoop" % "hadoop-common" % "2.6.0"
libraryDependencies += "org.apache.commons" % "commons-io" % "1.3.2"
libraryDependencies += "org.apache.hadoop" % "hadoop-hdfs" % "2.6.0"

您可以使用来自apache commons的IOUtils将数据从InputStream复制到OutputStream

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import org.apache.commons.io.IOUtils;



val hadoopconf = new Configuration();
val fs = FileSystem.get(hadoopconf);

//Create output stream to HDFS file
val outFileStream = fs.create(new Path("hdfs://<namenode>:<port>/output_path"))

//Create input stream from local file
val inStream = fs.open(new Path("hdfs://<namenode>:<port>/input_path"))

IOUtils.copy(inStream, outFileStream)

//Close both files
inStream.close()
outFileStream.close()

答案 1 :(得分:0)

return firebase.database().ref('/users/' + userId).once('value')
.then(snapshot => {
    var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
    return firebase.database().ref(....).set({ username: username });
})
.then(() => {
    console.log('Operation succeeded');
})
.catch(error => {
    console.log('Operation failed');
});