HDFS的API操作

HDFS设计目标

硬件错误:数量众多的廉价机器使得硬件错误成为常态

数据流访问:应用以流的方式访问数据;设计用于数据的批量处理,而不是低延时的实时交互处理。

放弃全面支持POSIX

大数据集:典型的HDFS上的一个文件大小是G或T数量级的,支持一个云中文件数量达到千万数量级

简单的相关模型:假定文件一次写入多次读取。未来可能支持Appending-writer的模型

移动计算比移动数据便宜:一个应用请求的计算,离它操作的数据越近就越高效

多种软硬件平台中的可移植性

HDFS来源

源自于Google的GFS论文

	发表于2003年10月
	
	HDFS是GFS克隆版
	
Hadoop Distributed File System

易于拓展分布式文件系统

运行在大量普通廉价机器上,提供容错机制

为大量用户提供性能不错的文件存取服务

工具类

HdfsUtils.java

package com.matrix.hdfs;

import java.net.URI;

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

public class HdfsUtils {

	public static FileSystem getFileSystem() throws Exception {
	
		Configuration conf = new Configuration();
		conf.set(//
				"fs.defaultFS", //
				"hdfs://node1:9000"//
		);

		FileSystem fileSystem = FileSystem.get(//
				new URI("hdfs://node1:9000"), //
				conf, //
				"root"//
		);

		return fileSystem;

	}

}

往HDFS文件系统中进行写操作

HdfsFsTest.java

package com.matrix.hdfs;

import java.io.File;
import java.io.FileInputStream;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsFsTest {

	public static void main(String[] args) throws Exception {

		write();

	}

	public static void write() throws Exception {
		FileSystem fileSystem = HdfsUtils.getFileSystem();

		FSDataOutputStream outStream = fileSystem.create(new Path("/usr/a.txt"));
		FileInputStream inStream = new FileInputStream(//
				new File("D:/a.txt")//
		);

		try {
			IOUtils.copyBytes(inStream, outStream, 4096, false);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeStream(inStream);
			IOUtils.closeStream(outStream);
		}
	}

}

对HDFS文件系统中的文件进行读操作

HdfsFsTest.java

package com.matrix.hdfs;

import java.io.File;
import java.io.FileInputStream;

import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class HdfsFsTest {

	public static void main(String[] args) throws Exception {

		read();

	}


	public static void read() throws Exception {
		String fileUri = "/usr/matrix/hosts";

		FileSystem fileSystem = HdfsUtils.getFileSystem();

		// FileSystem.newInstance(conf);

		// LocalFileSystem localFileSystem = FileSystem.getLocal(conf);

		FSDataInputStream inStream = fileSystem.open(new Path(fileUri));

		try {

			IOUtils.copyBytes(inStream, System.out, 4096, false);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			IOUtils.closeStream(inStream);
		}

	}

}

运行结果:

192.168.230.10 node1
192.168.230.11 node2
192.168.230.12 node3
192.168.230.14 node5

原文地址:https://www.cnblogs.com/SparseMatrix/p/5255547.html