HDFS--Hadoop分布式文件系统 (2)


import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Progressable; public class FileCopyWithProgress { public static void main(String[] args) throws Exception { String localSrc = "/home/hadoop/temperature.txt"; String dst = "hdfs:///test/input/t/temperature2.txt"; InputStream in = new BufferedInputStream(new FileInputStream(localSrc)); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(dst),conf); OutputStream out = fs.create(new Path(dst),new Progressable(){ public void progress(){ System.out.println("."); } }); IOUtils.copyBytes(in,out,4096,true); } }
每次Hadoop调用progress()方法时。也就是每次讲64KB数据包写入datanode后。

列出文件


import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; public class ListStatus { public static void main(String[] args) throws Exception { String uri = "hdfs:///test/input/t/"; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); // 显示一组路径的文件夹列表的并集 /* * Path[] paths = new Path[] { new Path("hdfs:///test/input/t/"), new * Path("hdfs:///test/input/wc") }; FileStatus[] status = * fs.listStatus(paths); */ // 通配方式 FileStatus[] status = fs.globStatus(new Path( "hdfs:///test/input/wc/*02.txt")); Path[] listedPaths = FileUtil.stat2Paths(status); for (Path p : listedPaths) { System.out.println(p); } } }

文件元数据FileStatus,封装了文件系统中文件和文件夹的元数据,包含文件长度、块大小、备份、改动时间、全部者以及权限信息。


删除数据


使用FileSystem的delete()方法能够永久性删除文件或文件夹。

public boolean delete(Path f,boolean recursive) throws IOException

假设f是一个文件或空文件夹,那么recursive的值就会被忽略。

假设f是一个非空文件夹,则仅仅有recursive为true才干删除。否则会抛出IOException。


Hadoop数据流


文件读取剖析


HDFS--Hadoop分布式文件系统



文件写入剖析


HDFS--Hadoop分布式文件系统



复本的布局策略(以3个为例):1、执行client的节点,2、离架节点,3、2所在机架的随机节点。


一致模型


文件系统的一致模型,描写叙述了对文件读/写的数据可见性。HDFS为性能牺牲了一些POSIX要求,因此一些操作与你期望的不同。

Path p = new Path("p"); Fs.create(p);
Path p = new Path("p"); OutputStream out = fs.create(p); out.write("content".getBytes("UTF-8")); out.flush();
以上两段代码都不能这个文件在文件系统马上可见。除非在out.flush();后面添加一行out.sync()。目的是强制全部的缓存与数据节点同步,另外,在HDFS中关闭文件out.close(0事实上隐含运行了sync()方法。

这个一致模型相应用设计的重要性:

假设不调用sync(),可能因client故障而丢失数据。而常常调用sync()也会有额外性能开销,所以须要在数据健壮性和吞吐量直接有所取舍,这与详细的应用有关,通过设置不同的调用sync()的频率来衡量应用的性能。终于找到一个合适的频率。


通过distcp进行并行复制


前面介绍的都是单线程的HDFS訪问模型,distcp是一个分布式的复制程序。典型应用是在两个HDFS直接传输 数据,假设两个集群执行同样版本号的Hadoop,则能够例如以下:

hadoop distcp hdfs://集群1的某节点/foo hdfs://集群2的某节点/foo

能够通过-overrite,指定覆盖现有的文件;通过-update指定仅更新改动过的文件。

假设两个集群版本号不一样,能够例如以下这样:

hadoop distcp hftp://集群1的某节点:50070/foo hdfs://集群2的某节点/foo 

默认情况下。每一个集群节点(tasktracker)。最多分配20个map任务,假设复制1000G数据到100个节点的集群,一共会有2000个map任务,每一个map任务平均分配512M数据。能够指定-m參数,降低map任务数,比方-m 1000,将分配1000个map任务,平均每一个复制1GB数据;可是一般不推荐这么做,可能导致集群不平衡。


Hadoop存档


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsyjs.html