当前位置:首页 » 文件管理 » hdfs文件夹复制文件

hdfs文件夹复制文件

发布时间: 2022-08-15 08:36:49

1. Hadoop 自身提供将文件从文件系统复制到 HDFS 的功能,有人了解这方面的东东么

命令行 dfs -put 就可以
要是java程序的话 主要看FileSystem那个类相关接口 还有FIleUtil 这个里面的一些接口!

2. 怎么查者、删除、移动、拷贝HDFS上的文件

删除复制移动文件命令

Linux代码
rm -rf /file

-r:递归处理参数
-f:强制删除所有文件

Linux代码
cp /test1/file1 /test3/file2
将file1复制到test3下,并改名为file2

Linux代码
cp -a test test1
将test目录下的所有子目录复制到test1下

Linux代码
mv /test1/file1 /test2/test2

将file1移动到test2下,并改名为test2

3. hadoop的几个问题 1.将本地文件复制到hdfs中,那么在hdfs中这个文件是存放在namenode还是分开放在datanode

试着回答:
先说明一下:
1. namenode负责管理目录和文件信息,真正的文件块是存放在datanode上。
2. 每个map和rece(即task)都是java进程,默认是有单独的jvm的,所以不可能同一个类的对象会在不同节点上。
看你的描述是把namenode,datanode和jobtracker,tasktracker有点混了。

所以:
问题1. 分块存放在datanode上
问题2.inputformat是在datanode上,确切的说是在tasktracker中。每个map和rece都会有自己的对象,当多个map读入一个文件时,实际上不同的map是读的文件不同的块,rece也是一样,各个任务读入的数据是不相交的。
问题3.rece输出肯定是在hdfs上,和普通文件一样在datanode上。
问题4.每个recer会有自己的outputformat对象,与前面inputformat原因一样。

4. 怎样复制文档到hdfs默认目录

在Hadoop中用作文件操作的主类位于org.apache.hadoop.fs包中。基本的文件操作有open、read、write和close。实际上,Hadoop的文件API是通用的,可用于HDFS以外的文件系统。
Hadoop文件API的起点是FileSystem类,这是一个与文件系统交互的抽象类,存在不同的具体实现子类来处理HDFS和本地文件系统,可以通过调用factory方法FileSystem.get(Configuration conf)来得到所需的FileSystem实例。Configuration类适用于保留键/值配置参数的特殊类。它的默认实例化方法是以HDFS系统的资源配置为基础的。
如下,可以得到与HDFS接口的FileSystem对象:
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
要得到一个专用于本地文件系统的FileSystem对象:
FileSystem local = FileSystem.getLocal(conf);
Hadoop文件API用Path对象来编制文件和目录名,使用FileStatus对象来存储文件和目录的元数据。使用listStatus()方法得到一个目录中的文件列表:
Path inputDir = new Path(args[0]);
FileStatus[] inputFiles = local.listStatus(inputDir);
数组inputFiles的长度等于指定目录中文件的个数,在inputFiles中每一个FileStatus对象均有元数据信息,如文件长度、权限、修改时间等。

可以用命令行bin/hadoop fs -put 把本地文件复制到HDFS,也可以自己实现。

下面的程序编译打包后,可以直接运行如下的命令,实现自己的上传功能:
hadoop jar file.jar FileCopy cite2.txt cite2.txt

下面是FileCopy的代码。
[java] view plain
<span style="font-size:18px;">import java.net.URI;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class FileCopy
{
public static void main(String[] args) throws Exception
{
if(args.length != 2){
System.err.println("Usage : file <source> <target>");
System.exit(2);
}
Configuration conf = new Configuration();
InputStream input = new BufferedInputStream(new FileInputStream(args[0]));
FileSystem fs = FileSystem.get(URI.create(args[1]),conf);
OutputStream output = fs.create(new Path(args[1]));
IOUtils.Bytes(input,output,4096,true);
}
}</span>

5. 利用JAVA+API向HDFS文件系统上的文件写入数据一共有哪三种方法,请叙述该三种

摘要 一.构建环境

6. 如何把hdfs上的多个目录下的文件合并为一个文件

hdfs dfs -cat /folderpath/folder* | hdfs dfs -FromLocal - /newfolderpath/file
1
1
这样可以把文件hdfs上 /folderpath目录下的/folder开头的文件,还不合并到/newfolderpath目录下的file一个文件中 注意/folder*必须是文件,而不能是文件夹,如果是文件夹,可以/folder*/*

cat test.txt | ssh test@masternode "hadoop dfs -put - hadoopFoldername/"
1
1
可以这样把本机的文件put到HDFS上面,而不用先复制文件到集群机器上

7. 如何hadoop distcp ftp目录中部分文件

hadoop中有一个叫做distcp(分布式复制)的有用程序,能从hadoop的文件系统并行复制大量数据。

distcp一般用于在两个HDFS集群中传输数据。如果集群在hadoop的同一版本上运行,就适合使用hdfs方案:

% hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
这将从第一个集群中复制/foo目录(和它的内容)到第二个集群中的/bar目录下,所以第二个集群会有/bar/foo目录结构。如果/bar不存在,则会新建一个。可以指定多个源路径,并且所有的都会被复制到目标路径。源路径必须是绝对路径。

默认情况下,distcp会跳过目标路径已经有的文件,但可以通过提供的-overwrite选项进行覆盖,也可以用-update选项来选择只更新那些修改过的文件。第一个集群的子树/foo下的一个文件与第二个集群的改变进行同步。

% hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo
distcp是作为一个MapRece作业执行的,复制工作由集群中并行运行的map来完成。这里没有recer。每个文件都由一个单一的map进行复制,并且distcp通过将文件分成大致相等的文件来为每个map数量大致相同的数据。

map的数量确定:

通过让每一个map复制数量合理的数据以最小化任务建立所涉及的开销,是一个很好的想法,所以每个map的副本至少为256MB。例如,1GB的文件被分成4个map任务。如果数据很大,为限制带宽和集群的使用而限制映射的数据就变得很有必要。map默认的最大数量是每个集群节点(tasktracker)有20个。例如,复制1000GB的文件到一个100个节点的集群,会分配2000个map(每个节点20个map),所以平均每个会复制512MB。通过对distcp指定-m参数,会减少映射的分配数量。例如,-m 1000会分配1000个map,平均每个复制1GB。

如果想在两个运行着不同版本HDFS的集群上利用distcp,使用hdfs协议是会失败的,因为RPC系统是不兼容的。想要弥补这种情况,可以使用基于HTTP的HFTP文件系统从源中进行读取。这个作业必须运行在目标集群上,使得HDFS RPC版本是兼容的。使用HFTP重复前面的例子:% hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar

注意,需要在URI源中指定名称节点的Web端口。这是由dfs.http.address的属性决定的,默认值为50070。

保持HDFS集群的平衡

向HDFS复制数据时,考虑集群的平衡相当重要。文件块在集群中均匀地分布时,HDFS能达到最佳工作状态。回顾前面1000 GB数据的例子,通过指定-m选项为1,即由一个单一的map执行复制工作,它的意思是,不考虑速度变慢和未充分利用集群资源,每个块的第一个副本会存储在运行map的节点上(直到磁盘被填满)。第二和第三个副本分散在集群中,但这一个节点并不会平衡。通过让map的数量多于集群中节点的数量,我们便可避免这个问题。鉴于此,最好首先就用默认的每个节点20个map这个默认设置来运行distcp。

然而,这也并不总能阻止一个集群变得不平衡。也许想限制map的数量以便一些节点可以被其他作业使用。若是这样,可以使用balancer工具继续改善集群中块的分布。

热点内容
安卓手机听筒在哪里关闭 发布:2025-05-14 17:16:20 浏览:454
我的世界炸毁50万服务器 发布:2025-05-14 17:16:07 浏览:122
存储站源 发布:2025-05-14 17:14:20 浏览:863
win2008的ftp设置 发布:2025-05-14 17:03:31 浏览:663
莱克发的工资卡密码是多少 发布:2025-05-14 16:57:10 浏览:178
方舟怎么用自己的存档进入别人的服务器 发布:2025-05-14 16:46:25 浏览:877
微博视频高清上传设置 发布:2025-05-14 16:38:41 浏览:548
数据库图书管理设计 发布:2025-05-14 16:33:52 浏览:378
php开发的网页 发布:2025-05-14 16:22:03 浏览:477
服务器内存跑满了怎么回事 发布:2025-05-14 16:21:16 浏览:224