Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala/Spark中的HDFS上将文件从一个文件夹移动到另一个文件夹_Scala_Hadoop_Apache Spark_Hdfs - Fatal编程技术网

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

在Scala/Spark中的HDFS上将文件从一个文件夹移动到另一个文件夹,scala,hadoop,apache-spark,hdfs,Scala,Hadoop,Apache Spark,Hdfs,我有两个路径,一个用于文件,一个用于文件夹。我想将文件移动到HDFS上的那个文件夹中。在Scala我怎么能做到?我也在用Spark 如果相同的代码也适用于Windows路径,就像在HDFS上读/写文件一样,但不是必需的,那么这将是一个额外的好处 我尝试了以下方法: val fs = FileSystem.get(sc.hadoopConfiguration) fs.moveFromLocalFile(something, something2) 我得到以下错误: 线程“main”java.la

我有两个路径,一个用于文件,一个用于文件夹。我想将文件移动到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,应为:文件:///

moveToLocalFile()
也是如此,因为它们用于在文件系统之间传输文件,而不是在文件系统内传输文件。我也尝试过
fs.rename()
,但根本没有任何效果(没有错误或任何东西)


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

请尝试以下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()
import org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.FileSystem;
导入org.apache.hadoop.fs.Path;
导入org.apache.commons.io.IOUtils;
val hadoopconf=新配置();
val fs=FileSystem.get(hadoopconf);
//创建HDFS文件的输出流
val outFileStream=fs.create(新路径(“hdfs://:/output_Path”))
//从本地文件创建输入流
val inStream=fs.open(新路径(“hdfs://:/input_Path”))
IOUtils.副本(流入、流出)
//关闭两个文件
流内关闭()
outFileStream.close()

不幸的是,第一个解决方案不起作用,我如何检查是否设置了HADOOP\u CONF\u DIR?另外,第二种解决方案对我的系统不可行。我基本上是在一个目录中创建文件(用流写入),一旦创建完成,它们就需要移动到另一个目录中。这个不同的目录由Spark streaming监控,当Spark streaming试图处理未完成的文件时,我遇到了一些问题。@osk您的问题没有提到Spark。。。HADOOP\u CONF\u DIR是一个环境变量,因此,请搜索您在各自的操作系统中如何查找它们,或者如果您使用的是Spark,请打开Spark-env.sh文件并进行设置there@Sahil,我正在研究相同的解决方案,并试图找到一种以分布式方式复制大型数据集的方法,正如我看到的,IOUtils是一个非hadoop包org.apache.commons.io.IOUtils,它可能无法以分布式方式工作。请确认IOUtis可以在分布式文件副本中工作。我正在尝试将HDFS中的文件复制到同一群集上的另一个HDFS目录Spark streaming尝试处理未完成的文件。您需要显式忽略任何以句点或下划线开头的文件当我创建这些文件时,它们的临时形式仍然具有相同的文件名,但是它们的大小为0(字节),直到它们完成为止,然后它们具有最终大小和相同的名称。是的,除非您忽略它们,Spark Streaming errorsHow我可以检测程序中的大小吗?由于文件名没有改变,我不明白这个问题,但它似乎与原来的文章无关
import org.apache.hadoop.fs.{FileAlreadyExistsException, FileSystem, FileUtil, Path}

val srcFileSystem: FileSystem = FileSystemUtil
  .apply(spark.sparkContext.hadoopConfiguration)
  .getFileSystem(sourceFile)
val dstFileSystem: FileSystem = FileSystemUtil
  .apply(spark.sparkContext.hadoopConfiguration)
  .getFileSystem(sourceFile)
FileUtil.copy(
  srcFileSystem,
  new Path(new URI(sourceFile)),
  dstFileSystem,
  new Path(new URI(targetFile)),
  true,
  spark.sparkContext.hadoopConfiguration)