文档章节

大数据教程(7.4)HDFS的java客户端API(流处理方式)

em_aaron
 em_aaron
发布于 11/12 23:15
字数 889
阅读 23
收藏 2

        博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。

        场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不同的datanode节点上,对外提供统一的访问视图。但是,如果这个需要处理的文件整体特别大,我们在mapreduce程序中如果每次都全部下载到本地在执行那会非常耗时耗空间;那么,有没有一种好的方式,可以实现当前这个mapreduce任务处理的那个分片数据,就下载分片这一段的数据到本地进行处理。答案:HDFS流客户端API

        

package com.empire.hadoop.hadoop_demo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
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.junit.Before;
import org.junit.Test;


/**
 * 用流的方式来操作hdfs上的文件
 * 可以实现读取指定偏移量范围的数据
 * @author
 *
 */
public class HdfsStreamAccess {
	
	FileSystem fs = null;
	Configuration conf = null;
	
	@Before
	public void init() throws Exception{
		conf = new Configuration();
		conf.set("fs.defaultFS", "hdfs://master:9000");
		//客户端去操作hdfs时,是有一个用户身份的
		//默认情况下,hdfs客户端api会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=hadoop
		//拿到一个文件系统操作的客户端实例对象
		/*fs = FileSystem.get(conf);*/
		System.setProperty("hadoop.home.dir", "E:\\\\hadoop-2.9.1");
		//可以直接传入 uri和用户身份
		//centos-aaron-h1为namenode的主机名或者域名
		fs = FileSystem.get(new URI("hdfs://centos-aaron-h1:9000"),conf,"hadoop"); //最后一个参数为用户名
	}
	/**
	 * 通过流的方式上传文件到hdfs
	 * @throws Exception
	 */
	@Test
	public void testUpload() throws Exception {
		
		FSDataOutputStream outputStream = fs.create(new Path("/angelababy.love"), true);
		FileInputStream inputStream = new FileInputStream("c:/angelababy.love");
		
		IOUtils.copy(inputStream, outputStream);
		
	}
	/**
	 * 通过流的方式获取hdfs上数据
	 * @throws Exception
	 */
	@Test
	public void testDownLoad() throws Exception {
		
		FSDataInputStream inputStream = fs.open(new Path("/angelababy.love"));		
		
		FileOutputStream outputStream = new FileOutputStream("d:/angelababy.love");
		
		IOUtils.copy(inputStream, outputStream);
		
	}
	@Test
	public void testRandomAccess() throws Exception{
		
		FSDataInputStream inputStream = fs.open(new Path("/angelababy.love"));
	
		inputStream.seek(12);
		
		FileOutputStream outputStream = new FileOutputStream("d:/angelababy.love.part2");
		
		IOUtils.copy(inputStream, outputStream);
		
	}
	/**
	 * 显示hdfs上文件的内容
	 * @throws IOException 
	 * @throws IllegalArgumentException 
	 */
	@Test
	public void testCat() throws IllegalArgumentException, IOException{
		
		FSDataInputStream in = fs.open(new Path("/angelababy.love"));
		
		IOUtils.copy(in, System.out);
		//hadoop的IOUtils更容易实现文件偏移分片处理
//		IOUtils.copyBytes(in, System.out, 1024);
	}
}

 

        前面的一些疑问总结:

hdfs dfsadmin -report 打印集群的状态,看到的内容相当准确
start-dfs.sh 如果namenode没关,也没关系

        HDFS listFiles()为何不直接反回List而是返回一个迭代器?因为如果listFiles参数传递的目录中包含几十亿个文件,那List直接放客户端内存,可能会让客户端吃不消;迭代器为何就行呢,迭代器其实不是个集合,它只是取数据的一种方式,它并不存数据,只是提供给一个方法,让你可以通过next(),nexthas()方法获取数据。

        mapreduce相对于HDFS来说,其实是一个HDFS客户端的角色。

        最后寄语,以上是博主本次文章的全部内容,如果大家觉得博主的文章还不错,请点赞;如果您对博主其它服务器大数据技术或者博主本人感兴趣,请关注博主博客,并且欢迎随时跟博主沟通交流。

© 著作权归作者所有

共有 人打赏支持
em_aaron
粉丝 68
博文 82
码字总数 128012
作品 3
黄浦
高级程序员
私信 提问
大数据教程(7.6)shell脚本定时采集日志数据到hdfs

上一篇博客博主分享了hadoop内置rpc的使用案例,本节博主将为小伙伴们分享一个在实际生产中使用的日志搜集案例。前面的文章我们有讲到过用户点击流日志分析的流程,本节就是要完成这个分析流...

em_aaron
11/17
0
0
从小白到大数据技术专家的学习历程

最近有很多人问我,大数据是怎么学?需要学什么技术以及这些技术的学习顺序是什么?今天有时间我把个问题总结成文章分享给大家。 ·大数据处理技术怎么学习呢?首先我们要学习Java语言和Lin...

qq_41842569
04/18
0
0
阿里年薪50WJAVA工程师转大数据学习路线!

大数据有两个方向,一个是偏计算机的,另一个是偏经济的。你学过Java,所以你可以偏将计算机的。 Java程序员想转大数据可行吗?Java是全世界使用人数最多的编程语言。不少程序员选择Java做为...

JAVA丶学习
04/25
0
0
Java 8新特性探究(三)解开lambda最强作用的神秘面纱

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析...

OSC闲人
2013/11/18
0
42
ASP.NET Core 2.2.0 为 SignalR 引入了一个 Java 客户端

ASP.NET Core 2.2.0-preview1 为 SignalR 引入了一个 Java 客户端,这个新客户的第一个预览现在已经可用。此客户端支持从 Java 代码(包括 Android 应用程序)连接到 ASP.NET Core SignalR 服...

h4cd
08/24
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

2018年终盘点:区块链真的结束了吗?

2018 年,大家依旧期待区块链出现“杀手级”应用,然而到了年关,终究还是没有。既然没有出现,只能认为“神功”尚未练成,但是这一年也没有虚度,让大家再一次领教了这个领域的跌宕起伏。 ...

酒逢知己千杯少
2分钟前
0
0
社交软件系统ThinkSNS+默认配置信息说明

感谢大家一直以来对社交软件系统ThinkSNS的关注,ThinkSNS Plus社交系统一直在不断优化完善。ThinkSNS Plus 本次于2018年12月3日更新发布。 本次重要更新说明如下: 1.优化默认配置信息,服务...

ThinkSNS账号
4分钟前
0
0
阿里云文件存储(NAS)助力业务系统承载双十一尖峰流量

2018天猫双11全球狂欢节,全天成交额再次刷新纪录达到2135亿元,其中总成交额在开场后仅仅用了2分05秒即突破100亿元,峰值的交易量达到惊人的高度,背后离不开阿里云大数据计算和存储能力的支...

阿里云官方博客
6分钟前
0
0
Frost & Sullivan权威报告:阿里云再次领跑云WAF大中华区市场

近日,国际权威分析机构Frost & Sullivan 针对Web应用防火墙(简称“WAF”)领域发布了《2017年亚太区Web应用防火墙市场报告》,阿里云以市场占有率45.8%的绝对优势连续两年领跑大中华区云WAF...

阿里云云栖社区
6分钟前
0
0
Axios使用拦截器全局处理请求重试

Axios拦截器 Axios提供了拦截器的接口,让我们能够全局处理请求和响应。Axios拦截器会在Promise的then和catch调用前拦截到。 请求拦截示例 axios.interceptors.request.use(function (conf...

kisshua
10分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部