hadoop hdfs API操作

hadoop的hdfs API的基本操作

简单的介绍

hadoop为我们提供了hdfs非常方便的shell命令(类似于Linux文件操作的命令),再者。hadoop还为我们提供hdfsAPI,使我们开发人员可以对hfds进行一些操作。如:copy文件(从本地到hdfs,从hdfs到本地)、删除文件或者目录、读取文件的内容、看文件的相关信息、列出文件的所有子目录,在文件后面追加内容。(注意:hdfs不支持文件中某一行的修改,只允许追加内容到文件的后面)。

首先我初始化hdfs,最后将hdfs关闭:

<span style="white-space:pre">	</span>private static final String HDFS_PATH = "hdfs://localhost:8020";
	private Configuration conf = null;
	private FileSystem fs = null;

	@Before
	public void beforeClass() throws IOException {
		conf = new Configuration();
		fs = FileSystem.get(URI.create(HDFS_PATH), conf);
	}

	@After
	public void AfterClass() throws IOException {
		fs.close();
	}

从本地copy文件到hdfs或者是从hdfs copy文件到本地

@Test
	public void testCopyLocalFileToHDFS() throws IOException {

		String[] args = { "/test.txt1",
				"hdfs://localhost:8020/user/root/test.txt" };
		if (args.length != 2) {
			System.err.println("Usage: filecopy <source> <target>");
			System.exit(2);
		}
		InputStream in = new BufferedInputStream(new FileInputStream(args[0]));
		FileSystem fs = FileSystem.get(URI.create(args[1]), conf);
		OutputStream out = fs.create(new Path(args[1]));
		IOUtils.copyBytes(in, out, conf);

		// fs.copyFromLocalFile(new
		// Path("/eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz"), new
		// Path(HDFS_PATH+"/user/root/"));

		fs.copyToLocalFile(
				new Path(
						"hdfs://localhost:8020/user/root/eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz"),
				new Path("/user/"));

	}

删除文件

@Test
	public void deleteFile() throws IOException {
		fs.delete(new Path("hdfs://localhost:8020/user/root/out1"), true);
	}

读取文件到输出流

@Test
	public void readFile() {
		InputStream in = null;
		try {
			in = fs.open(new Path(HDFS_PATH + "/user/root/test.txt"));
			IOUtils.copyBytes(in, System.out, conf);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeStream(in);
		}
	}

获取文件的信息

@Test
	public void getFileInfo() throws IllegalArgumentException, IOException {
		FileStatus fSta = fs.getFileStatus(new Path(HDFS_PATH
				+ "/user/root/test.txt"));
		System.out.println(fSta.getAccessTime());
		System.out.println(fSta.getBlockSize());
		System.out.println(fSta.getModificationTime());
		System.out.println(fSta.getOwner());
		System.out.println(fSta.getGroup());
		System.out.println(fSta.getLen());
		System.out.println(fSta.getPath());
		System.out.println(fSta.isSymlink());
	}

列出目录下的所有文件

@Test
	public void listFile() throws FileNotFoundException,
			IllegalArgumentException, IOException {

		RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(new Path(
				HDFS_PATH + "/user/root/"), true);
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}

		FileStatus[] fss = fs.listStatus(new Path(HDFS_PATH + "/"));
		Path[] ps = FileUtil.stat2Paths(fss);
		for (Path p : ps) {
			System.out.println(p);
		}

		FileStatus sta = fs
				.getFileStatus(new Path(
						"hdfs://localhost:8020/user/root/eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz"));
		BlockLocation[] bls = fs.getFileBlockLocations(sta, 0, sta.getLen());
		for (BlockLocation b : bls) {
			for (String s : b.getTopologyPaths())
				System.out.println(s);
			for (String s : b.getHosts())
				System.out.println(s);
		}

在文件的后头追加东西 append

首先我们要设置hdfs支持在文件后头追加内容

在hdfs-site.xml 加入

<property>
        <name>dfs.support.append</name>
        <value>true</value>
   </property>

代码实现是:

@Test
	public void appendFile() {
		String hdfs_path = "hdfs://localhost:8020/user/root/input/test.txt";// 文件路径

		// conf.setBoolean("dfs.support.append", true);

		String inpath = "/test.txt1";
		try {
			// 要追加的文件流,inpath为文件
			InputStream in = new BufferedInputStream(
					new FileInputStream(inpath));
			OutputStream out = fs.append(new Path(hdfs_path));
			IOUtils.copyBytes(in, out, 4096, true);

		} catch (IOException e) {

			e.printStackTrace();

		}

	}

时间: 2024-11-05 11:57:50

hadoop hdfs API操作的相关文章

hadoop: hdfs API示例

利用hdfs的api,可以实现向hdfs的文件.目录读写,利用这一套API可以设计一个简易的山寨版云盘,见下图: 为了方便操作,将常用的文件读写操作封装了一个工具类: 1 package yjmyzz; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.FSDataOutputStream; 5 import org.apache.hadoop.fs.FileSystem; 6 impor

HDFS API操作实践

本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传.创建.重命名.删除操作 本文地址:http://www.cnblogs.com/archimedes/p/hdfs-api-operations.html,转载请注明源地址. 1.上传本地文件到HDFS 通过FileSystem.copyFromLocalFile(Path src, Path dst)可将本地文件上传到HDFS指定的位置上,其中src和dst均为文件的完整路径 在<hadoop实战--

Hadoop的API操作

氏cw诨堵莱偾es嚎拥肺步刮创潘于仔砸膛iq坦擅热http://blog.sina.com.cn/s/blog_17c7892e30102xgu3.html垢5d婆涤雍孔zj寥旱猎汉倭烟匮铱录挥曝r9灸瞥故http://blog.sina.com.cn/s/blog_172cf20dc0102xi46.html母p7搜分录桨1j帽心质步泵抡尤荚迅斡翘bc厍稼邑http://blog.sina.com.cn/s/blog_17c5e6d070102xtuo.html儆bd屯然谖邻5v上章着易谙旱彻

Hadoop读书笔记(三)Java API操作HDFS

Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的shell操作:http://blog.csdn.net/caicongyang/article/details/41253927 JAVA URL 操作HDFS OperateByURL.java package hdfs; import java.io.InputStream; import jav

hadoop 的hdfsapi操作

hdfs 的api 相关操作 一: hdfs api 操作 1.1 读取内容: package it.xuegod.hadoop.hdfs; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.file.FileSystem;

Hadoop之HDFS(客户端操作) 2 HDFS的API操作 3 HDFS的I/O流操作

2 HDFS的API操作 2.1 HDFS文件上传(测试参数优先级) 1.编写源代码 // 文件上传 @Test public void testPut() throws Exception { Configuration conf = new Configuration(); conf.set("dfs.replication", "2"); // 1.获取fs对象 FileSystem fs = FileSystem.get(new URI("hdfs

hadoop的API对HDFS上的文件访问

这篇文章主要介绍了使用hadoop的API对HDFS上的文件访问,其中包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,需要的朋友可以参考下hdfs文件操作操作示例,包括上传文件到HDFS上.从HDFS上下载文件和删除HDFS上的文件,大家参考使用吧 复制代码 代码如下:import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*; import java.io.File;import ja

Java API操作HDFS

HDFS是存储数据的分布式文件系统,对HDFS的操作,就是对文件系统的操作,除了用HDFS的shell命令对文件系统进行操作,我们也可以利用Java API对文件系统进行操作,比如文件的创建.删除.修改权限等等,还有文件夹的创建.删除.重命名等等. 使用Java API对文件系统进行操作主要涉及以下几个类: 1.Configuration类:该类的对象封装了客户端或者服务端的配置. 2.FileSystem类:该类的对象是一个文件系统对象,可以利用该对象的一些方法来对文件进行操作,FileSys

HDFS基础和java api操作

1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS将客户端的大文件存放在很多节点的数据块中,Block本质上是一个逻辑概念,它是hdfs读写数据的基本单位) HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间 2. fs 可以使用hdfs shell操作hdfs,常用 fs命令如下: eg: hadoop fs -cat fi