HDFS 的 API 操作

使用url方式访问数据(了解)

  1. @Test
  2. public void urlHdfs() throws IOException {
  3. //1.注册url
  4. URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
  5. //2.获取hdfs文件的输入流
  6. InputStream inputStream=new URL("hdfs://hadoop101:8020/a.txt").openStream();
  7. //3.获取本地文件的输出流
  8. OutputStream outputStream= new FileOutputStream(new File("E:\\hello.txt"));
  9. //4.实现文件的拷贝
  10. IOUtils.copy(inputStream,outputStream);
  11. //5.关流
  12. IOUtils.closeQuietly(inputStream);
  13. IOUtils.closeQuietly(outputStream);
  14. }

使用文件系统方式访问数据(掌握)

获取 FileSystem 的几种方式

  1. /*
  2. 获取FileSystem,方式1
  3. */
  4. @Test
  5. public void getFileSystem1() throws IOException{
  6. //1.创建Configuration对象
  7. Configuration configuration=new Configuration();
  8. //2.设置文件系统类型
  9. configuration.set("fs.defaultFS","hdfs://hadoop101:8020");
  10. //3.获取指定的文件系统
  11. FileSystem fileSystem= FileSystem.get(configuration);
  12. //4.输出
  13. System.out.println(fileSystem);
  14. }

②用的次数比较多

  1. /*
  2. 获取FileSystem,方式2
  3. ctrl+alt+v自动补全返回值
  4. */
  5. @Test
  6. public void getFileSystem2() throws URISyntaxException, IOException, InterruptedException {
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop101:8020"), new Configuration(),"root");
  8. System.out.println(fileSystem);
  9. }

  1. /*
  2. 获取FileSystem,方式3
  3. ctrl+alt+v自动补全返回值
  4. */
  5. @Test
  6. public void getFileSystem3() throws IOException {
  7. Configuration configuration = new Configuration();
  8. configuration.set("fs.defaultFS","hdfs://hadoop101:8020","root");
  9. //3.获取指定的文件系统
  10. FileSystem fileSystem= FileSystem.newInstance(configuration);
  11. //4.输出
  12. System.out.println(fileSystem.toString());
  13. }

  1. /*
  2. 获取FileSystem,方式4
  3. ctrl+alt+v自动补全返回值
  4. */
  5. @Test
  6. public void getFileSystem4() throws URISyntaxException, IOException, InterruptedException {
  7. FileSystem fileSystem= FileSystem.newInstance(new URI("hdfs://hadoop101:8020"), new Configuration(),"root");
  8. System.out.println(fileSystem);
  9. }

遍历 HDFS中所有文件

  1. /*
  2. hdfs文件的遍历
  3. */
  4. @Test
  5. public void listFiles() throws URISyntaxException, IOException, InterruptedException {
  6. //1.获取FileSystem实例
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop101:8020"), new Configuration(),"root");
  8. //2.调用方法listFiles获取/目录下的所有文件信息
  9. RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
  10. //3.遍历迭代器
  11. while (iterator.hasNext()){
  12. LocatedFileStatus fileStatus = iterator.next();
  13.  
  14. //获取文件的绝对路径:hdfs://hadoop101:/xxx
  15. System.out.println(fileStatus.getPath()+"----"+fileStatus.getPath().getName());
  16. //文件的block信息
  17. BlockLocation[] blockLocations = fileStatus.getBlockLocations();
  18. System.out.println("block数目:"+blockLocations.length);
  19. }
  20. }

输出:

HDFS 上创建文件夹

  1. /*
  2. hdfs创建文件夹
  3. */
  4. @Test
  5. public void mkdirsTest() throws URISyntaxException, IOException, InterruptedException {
  6. //1.获取FileSystem实例
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop101:8020"), new Configuration(),"root");
  8. //2.获取文件夹
  9. boolean bl=fileSystem.mkdirs(new Path("/aaa/bbb/ccc/a.txt"));
  10. //fileSystem.create(new Path("/aaa/bbb/ccc/a.txt"));
  11. System.out.println(bl);
  12. //3.关闭FileSystem
  13. fileSystem.close();
  14. }

下载文件

  1. /*
  2. 文件下载2:使用方法copyToLocalFile下载到本地E盘下的bbb.txt
  3. */
  4. @Test
  5. public void downloadFile2() throws URISyntaxException, IOException, InterruptedException {
  6. //1.获取FileSystem
  7. FileSystem fileSystem=FileSystem.get(new URI("hdfs://hadoop101:8020"),new Configuration(),"root");
  8.  
  9. fileSystem.copyToLocalFile(new Path("/a.txt"),new Path("E://bbb.txt"));
  10.  
  11. fileSystem.close();
  12.  
  13. }
  14. /*
  15. 文件下载
  16. */
  17. @Test
  18. public void downloadFile() throws URISyntaxException, IOException {
  19. //1.获取FileSystem
  20. FileSystem fileSystem=FileSystem.get(new URI("hdfs://hadoop101:8020"),new Configuration());
  21. //2.获取hdfs的输入流
  22. FSDataInputStream inputStream = fileSystem.open(new Path("/a.txt"));
  23. //3.获取本地路径的输出流
  24. FileOutputStream outputStream = new FileOutputStream("E://a.txt");
  25. //4.文件的拷贝
  26. IOUtils.copy(inputStream,outputStream);
  27. //5.关闭流
  28. IOUtils.closeQuietly(inputStream);
  29. IOUtils.closeQuietly(outputStream);
  30. fileSystem.close();
  31. }

HDFS 文件上传

  1. /*
  2. 文件的上传
  3. */
  4. @Test
  5. public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
  6. FileSystem fileSystem=FileSystem.get(new URI("hdfs://hadoop101:8020"),new Configuration(),"root");
  7. fileSystem.copyFromLocalFile(new Path("E://hello.txt"),new Path("/"));
  8. fileSystem.close();
  9. }

小文件合并

由于 Hadoop 擅长存储大文件,因为大文件的元数据信息比较少,如果 Hadoop 集群当中有大
量的小文件,那么每个小文件都需要维护一份元数据信息,会大大的增加集群管理元数据的
内存压力,所以在实际工作当中,如果有必要一定要将小文件合并成大文件进行一起处理
在我们的 HDFS 的 Shell 命令模式下,可以通过命令行将很多的 hdfs 文件合并成一个大文件下
载到本地

  1. cd /export/servers
  2. hdfs dfs -getmerge /*.xml ./hello.xml

既然可以在下载的时候将这些小文件合并成一个大文件一起下载,那么肯定就可以在上传的
时候将小文件合并到一个大文件里面去

  1. /*
  2. 小文件的合并
  3. */
  4. @Test
  5. public void mergeFile() throws URISyntaxException, IOException, InterruptedException {
  6. //1.获取FileSystem
  7. FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop101:8020"), new Configuration(), "root");
  8. //2.获取hdfs大文件的输出流
  9. FSDataOutputStream outputStream = fileSystem.create(new Path("/big_txt.txt"));
  10.  
  11. //3.获取一个本地文件系统
  12. LocalFileSystem localFileSystem = FileSystem.getLocal(new Configuration());
  13. //4.获取本地文件夹下的所有文件的详情
  14. FileStatus[] fileStatuses = localFileSystem.listStatus(new Path("E:\\input"));
  15. //5.遍历每个文件,获取每个文件的输入流
  16. for (FileStatus fileStatus:fileStatuses){
  17. FSDataInputStream inputStream=localFileSystem.open(fileStatus.getPath());
  18. //6.将小文件的数据复制到大文件
  19. IOUtils.copy(inputStream,outputStream);
  20. IOUtils.closeQuietly(inputStream);
  21. }
  22. IOUtils.closeQuietly(outputStream);
  23. localFileSystem.close();
  24. fileSystem.close();
  25. }

输出:

里面的内容是:在E盘下input文件夹下的5个txt文件的总和

完成本地小文件的合并,上传

HDFS的高可用机制

在Hadoop 中,NameNode 所处的位置是非常重要的,整个HDFS文件系统的元数据信息都由
NameNode 来管理,NameNode的可用性直接决定了Hadoop 的可用性,一旦NameNode进程
不能工作了,就会影响整个集群的正常使用。
在典型的HA集群中,两台独立的机器被配置为NameNode。在工作集群中,NameNode机器中
的一个处于Active状态,另一个处于Standby状态。Active NameNode负责群集中的所有客户端
操作,而Standby充当从服务器。Standby机器保持足够的状态以提供快速故障切换(如果需
要)。

Hadoop的联邦机制(Federation)

HDFS Federation是解决namenode内存瓶颈问题的水平横向扩展方案。
Federation意味着在集群中将会有多个namenode/namespace。这些namenode之间是联合的,
也就是说,他们之间相互独立且不需要互相协调,各自分工,管理自己的区域。分布式的
datanode被用作通用的数据块存储存储设备。每个datanode要向集群中所有的namenode注
册,且周期性地向所有namenode发送心跳和块报告,并执行来自所有namenode的命令。

Federation一个典型的例子就是上面提到的NameNode内存过高问题,我们完全可以将上面部分
大的文件目录移到另外一个NameNode上做管理.更重要的一点在于,这些NameNode是共享集
群中所有的DataNode的,它们还是在同一个集群内的**。**
这时候在DataNode上就不仅仅存储一个Block Pool下的数据了,而是多个(在DataNode的datadir
所在目录里面查看BP-xx.xx.xx.xx打头的目录)。

概括起来:
多个NN共用一个集群里的存储资源,每个NN都可以单独对外提供服务。
每个NN都会定义一个存储池,有单独的id,每个DN都为所有存储池提供存储。
DN会按照存储池id向其对应的NN汇报块信息,同时,DN会向所有NN汇报本地存储可用资源
情况。

HDFS Federation不足:

HDFS Federation并没有完全解决单点故障问题。虽然namenode/namespace存在多个,但是从
单个namenode/namespace看,仍然存在单点故障:如果某个namenode挂掉了,其管理的相
应的文件便不可以访问。Federation中每个namenode仍然像之前HDFS上实现一样,配有一个
secondary namenode,以便主namenode挂掉一下,用于还原元数据信息。
所以一般集群规模真的很大的时候,会采用HA+Federation的部署方案。也就是每个联合的
namenodes都是ha的。

hdfs学习(三)的更多相关文章

  1. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  2. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  3. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  4. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

  5. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

  6. [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点

    深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...

  7. SVG 学习<三>渐变

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

随机推荐

  1. 波士顿动力狗 SPOT 权威购买指北

    两周前 油管科技视频播主 Lew Later 发布了一支 波士顿动力狗子的开箱视频,短短两周的时间内这支视频的播放量就达到了367万, 在Lew Later 近期发布的视频中,这支视频的播放量绝对算得 ...

  2. nginx 日志功能详解

    nginx 日志功能 在 nginx 中有两种日志: access_log:访问日志,通过访问日志可以获取用户的IP.请求处理的时间.浏览器信息等 error_log:错误日志,记录了访问出错的信息, ...

  3. 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)

    图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...

  4. 如何在Windows、Linux系统中安装Redis

    一:Windos下安装Redis并设置自动启动 1.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网已经没有windows版本的下载地址,只 ...

  5. 小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  6. 数据结构C语言实现----顺序查找

     建立上图的一个txt文件: 1004 TOM 1001002 lily 951001 ann 931003 lucy 98 用一个c程序读入这个表一个结构体数组中: 结构体如下: //学生数据结构体 ...

  7. Series结构(常用)

    1.创建 Series 对象 fandango = pd.read_csv("xxx.csv") series_rt = fandango["RottenTomatoes ...

  8. PHP pclose() 函数

    定义和用法 pclose() 函数关闭由 popen() 打开的进程. 如果失败,该函数返回 FALSE. 语法 pclose(pipe) 参数 描述 pipe 必需.规定由 popen() 打开的进 ...

  9. 2080ti的各种问题

    1.循环登录 https://blog.csdn.net/miclover_feng/article/details/79201865 2.多版本cuda切换 https://blog.csdn.ne ...

  10. 自定义 Mybatis 框架

    分析流程 1. 引入dom4j <dependencies> <!--<dependency> <groupId>org.mybatis</groupI ...