HDFS的使用

HDFS-namenode 原理:记录元数据(hdfs的目录结构、块信息等) 

1.会将树形的数据结构对象序列化到namenode工作目录中的faimages文件中,隔一段时间序列化一次。  对hdfs的修改操作被记录下来,存在磁盘--edits日志文件。 如果挂机了先反序列化faimages的文件,但是不是最新的元数据,再把edits文件中的操作记录解析与faimages合并成最新的元数据。

2.namenode本身不会做faimages和edits文件的合并,使用Secondarynamenode节点来完成合并操作。第一次先下载faimages和edits到自己的磁盘中,反序列化faimages到内存,启动一个程序读edits文件再更新faimages文件。上传faimages到namenode上。

 

 

 

 

查看 hadoop fs -ls     hdfs文件 一个文件按照128MB每块来切分  每块保存3个副本 比如 170MB的文件会被切分成2块128MB的块,第一块128MB 第二块42MB 每块有3个副本 

1、向hdf上传文件:hadoop fs -put 文件 hdfs中的路径 

2、向hdfs下载文件:hadoop fs -get hdfs中的文件路径 本地路径

3、创建文件夹:hadoop fs -mkdir /aaa

4、移动文件夹: hadoop fs -mv /一个路径  /另一个路径

5、删除:hadoop fs -rm -r /xxx

6、查看hdfs中的文本内容:hadoop fs  -cat /demo.txt     hadoop fs -tail -f /demo.txt 倒数几行

7、追加内容 hadoop fs -appendToFile xxx.txt /aaa.txt

8、hadoop fs 提示可用的命令

Java客户端:

//new Configuration()会从项目的classpath中加载core-default.xml 等  也可以自己创建一个core-site.xml 加载时会覆盖core-default.xml
Configuration conf = new Configuration();
//指定客户端上传到hdfs的文件的副本数  不是必须的操作 有默认值
conf.set("dfs.replication","2");
//构造一个访问HDFS的客户端对象:参1:hdfs的uri 参2:配置文件 参3:客户端身份
FileSystem fs = FileSystem.get(new URI("hdfs://hdp-01:9000/"),conf,"root");
//上传一个文件到HDFS
fs.copyFromLocalFile(new Path("本地路径"),new Path("HDFS的路径"));
//下载HDFSS上的文件 fs访问本地的磁盘,就需要使用hadoop系统的C语言库,就需要使用hadoop/bin 配置HADOOP_HOME
fs.copyToLocalFile(new Path("HDFS的路径"),new path("本地路径"));
// hdfs内的移动
fs.rename(new Path(),new Path());
//创建文件夹
fs.mkdirs(new Path());
//删除文件夹
fs.delete(new Path(),true);
//查询hdfs目录下的文件信息 参2 递归查询下去 返回的是迭代器
fs.listFiles(enw Path,true)
//查询hdfs目录下的文件夹和文件信息 只看一级 返回数组
fs.status(new Path)
fs.close();

  

/**
	 * 读取hdfs中文件的指定偏移量范围的内容
	 * 
	 * 
	 * 作业题:用本例中的知识,实现读取一个文本文件中的指定BLOCK块中的所有数据
	 * 
	 * @throws IOException
	 * @throws IllegalArgumentException
	 */
	@Test
	public void testRandomReadData() throws IllegalArgumentException, IOException {

		FSDataInputStream in = fs.open(new Path("/xx.dat"));

		// 将读取的起始位置进行指定
		in.seek(12);

		// 读16个字节
		byte[] buf = new byte[16];
		in.read(buf);

		System.out.println(new String(buf));

		in.close();
		fs.close();

	}

	/**
	 * 往hdfs中的文件写内容
	 * 
	 * @throws IOException
	 * @throws IllegalArgumentException
	 */

	@Test
	public void testWriteData() throws IllegalArgumentException, IOException {

		FSDataOutputStream out = fs.create(new Path("/zz.jpg"), false);

		// D:\images\006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg

		FileInputStream in = new FileInputStream("D:/images/006l0mbogy1fhehjb6ikoj30ku0ku76b.jpg");

		byte[] buf = new byte[1024];
		int read = 0;
		while ((read = in.read(buf)) != -1) {
			out.write(buf,0,read);
		}
		
		in.close();
		out.close();
		fs.close();

	}

  

posted @ 2018-08-30 09:57  赵先先森  阅读(1376)  评论(0编辑  收藏  举报