注:该文内容部分来源于ChinaHadoop.cn上的hadoop视频教程。

一. HDFS概述

HDFS即Hadoop Distributed File System, 源于Google发表于2003年的论文,是一种分布式的文件系统。

HDFS优点:

  • 高容错性(数据自动保存多个副本)
  • 适合批处理
  • 适合大数据处理
  • 流式文件访问(一次性写入,多次读取)
  • 建立在廉价机器上

HDFS缺点:

  • 不善于处理低延迟数据访问
  • 不善于处理小文件存取(元数据存放在namenode内存中,消耗大量内存)
  • 不支持并发写入,文件随机修改(一个文件同时只能被一个写者修改,只支持append)

二. HDFS设计思想

以上分布式文件系统的问题在于由于文件的大小不一致,导致了各个服务器的存储空间不均衡,个别服务器相对于其他服务器可能占用率非常高。其次,由于文件是整个存储在一个节点上,在读取文件时,难以实现并行读取,使得某一节点成为系统的网络瓶颈。

HDFS的设计思路是将每个文件分成大小相同的block,以多副本的形式存放在不同节点上,同时维护一个数据块和节点的映射关系,这样的设计解决了第一种方案存在的负载不均衡以及网络瓶颈的问题。

Active NameNode
StandBy NameNode
DataNode
Client
主Master(只有一个) 主Master的热备份 Slaves(有多个) 文件切分
管理HDFS名称空间 定期合并fsimage和fsedits,推送给主Master 存储数据块 管理和访问HDFS
管理数据块映射关系 当Active NameNode出现故障,
快速切换成新的Active NameNode
执行数据读写  
配置副本策略      
处理客户端读取请求      

HDFS数据块

  • 文件被切分成大小相同的数据块,例如64mb,如果文件大小不足64mb的也单独存成一个block。数据块大小可以配置。
  • 数据块如此之大的好处是时间大多花在了数据存取上,而不是寻道上,提高了吞吐率。
  • 每个数据块都有多个副本,个数可以配置。

HDFS写流程的特点是流水线式的写入,DataNode之间互相的写入数据,这样的好处是分摊了网络瓶颈。

HDFS块副本放置策略

  • 副本1:同client的节点上
  • 副本2:不同机架的节点上
  • 副本3:与第二个副本同一机架的不同节点上
  • 其他副本:随机挑选

HDFS可靠性策略对于3种常见错误的处理

  1. 文件损坏:利用CRC32校验,使用其他副本替代。
  2. 网络或者机器失效:DataNode定期向NameNode发送心跳。
  3. NameNode失效:主备NameNode切换。

三. 使用Java API访问HDFS

HDFS Java API介绍

  • Configuration类:该类的对象封装了配置信息,这些配置信息来自core-*.xml;
  • FileSystem类:文件系统类,可使用该类的方法对文件/目录进行操作。一般通过FileSystem的静态方法get获得一个文件系统对象;
  • FSDataInputStream和FSDataOutputStream类:HDFS中的输入输出流。分别通过FileSystem的open方法和create方法获得。

操作文件程序的基本框架

  1. 得到Configuration对象
  2. 得到FileSystem对象
  3. 进行文件操作

代码实例

将本地文件上传到HDFS

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class CopyFromLocal {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path src = new Path("/usr/local/hadoop-2.7.2/README.txt");
Path dst = new Path("hdfs://localhost:9001/home/");
fs.copyFromLocalFile(src, dst);
System.out.println("upload to "+conf.get("fs.default.name"));
fs.close();
}
}

将HDFS上的文件传回到本地

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;public class CopyToLocal {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path src = new Path("hdfs://localhost:9001/home/README.txt");
Path dst = new Path("/home/hadoop/Desktop/");
fs.copyToLocalFile(src, dst);
fs.close();
  }
}

在HDFS上创建文件

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class CreateFile { public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path dfs = new Path("hdfs://localhost:9001/home/test.txt");
FSDataOutputStream outputStream = fs.create(dfs);
byte[] buff = "hello world!".getBytes();
outputStream.write(buff,0, buff.length);
outputStream.close();
fs.close();
}
}

删除文件/目录, 当删除对象为目录时,将第二个参数设为true否则将产生异常

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class DeleteFile {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path dfs = new Path("hdfs://localhost:9001/home/test.txt");
System.out.println(fs.delete(dfs,true));
fs.close();
}
}

创建目录

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class MakeDir { public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path dfs = new Path("hdfs://localhost:9001/home1/");
System.out.println(fs.mkdirs(dfs));
fs.close();
}
}

读取文件

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class ReadFile {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://localhost:9001");
FileSystem fs = FileSystem.get(conf);
Path dst = new Path("hdfs://localhost:9001/home/test.txt");
if(fs.exists(dst) && !fs.isDirectory(dst)) {
FSDataInputStream is = fs.open(dst);
FileStatus stat = fs.getFileStatus(dst);
byte[] buffer = new byte[(int) stat.getLen()];
is.read(buffer);
System.out.println(new String(buffer));
is.close();
fs.close();
} else {
throw new Exception("fail to read file "+dst.toString());
}
}
}

追加文件内容,注:需要将hdfs-site.xml中的dfs.support.append属性设置为true

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*; public class AppendFile { public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop-2.7.2/etc/hadoop/core-site.xml"));
FileSystem fs = FileSystem.get(conf);
Path dfs = new Path("hdfs://localhost:9001/home/test.txt");
FSDataOutputStream outputStream = fs.append(dfs);
byte[] buff = "test".getBytes();
outputStream.write(buff);
outputStream.close();
fs.close();
}
}

Hadoop学习笔记: HDFS的更多相关文章

  1. Hadoop学习笔记—HDFS

    目录 搭建安装 三个核心组件 安装 配置环境变量 配置各上述三组件守护进程的相关属性 启停 监控和性能 Hadoop Rack Awareness yarn的NodeManagers监控 命令 hdf ...

  2. Hadoop学习笔记-HDFS命令

    进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...

  3. Hadoop学习笔记---HDFS

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐 ...

  4. Hadoop学习笔记——HDFS

    1.查看hdfs文件的block信息 不正常的文件 hdfs fsck /logs/xxx/xxxx.gz.gz -files -blocks -locations Connecting to nam ...

  5. hadoop学习笔记(四):HDFS文件权限,安全模式,以及整体注意点总结

    本文原创,转载注明作者和原文链接! 一:总结注意点: 到现在为止学习到的角色:三个NameNode.SecondaryNameNode.DataNode 1.存储的是每一个文件分割存储之后的元数据信息 ...

  6. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  7. Hadoop学习笔记(2)

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  8. Hadoop学习笔记(5) ——编写HelloWorld(2)

    Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...

  9. Hadoop学习笔记(2) ——解读Hello World

    Hadoop学习笔记(2) ——解读Hello World 上一章中,我们把hadoop下载.安装.运行起来,最后还执行了一个Hello world程序,看到了结果.现在我们就来解读一下这个Hello ...

  10. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

随机推荐

  1. HDU 4825 Xor Sum(经典01字典树+贪心)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  2. linux下挂在u盘,移动硬盘的方法,转移服务器资料的时候,使用移动硬盘什么最方便了

    本文章是在centos环境下操作的 最近linux服务器我不小心吧root下面的用户配置,不能远程登录,而且我对linux系统配置也不熟悉,最后的办法就是去了一趟机房,还好是在深圳南山科技园,不算太远 ...

  3. Javascript 笔记与总结(2-10)删除节点,创建节点

    [删除节点] 步骤: ① 找到对象 ② 找到他的父对象 parentObj ③ parentObj.removeChild(子对象); [例] <!DOCTYPE html> <ht ...

  4. phantomjs 安装使用

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  5. 鼠标选择文字事件js代码,增加层问题

    在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...

  6. XPath学习:parent,child

    XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointe ...

  7. IO流学习小结

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  8. 纯css下拉菜单的制作

    通过观察下拉菜单的过程,发现有两种状态,一种是鼠标没有hover时,一种是鼠标hover时. 主菜单hover时,显示子菜单:主菜单没有hover时,不显示子菜单 <!DOCTYPE html& ...

  9. IOS常见的三种回调方法介绍

    认识下三种IOS常见的回调模式. 代理模式作为IOS中最常见的通讯模式,代理几乎无处不在. 这里有一个数组,我们首先通过代理的方式将数组传递到其他方法中去. 设置协议及方法 @protocol Cal ...

  10. 变长数组列表ArrayList

    简介:此数据结构定义为一个ArrayList结构体类型,维护了一个内部堆数组.通过realloc函数实现了数组容量自动扩充,每次扩充到原来的2倍. 通过函数指针实现了使用者根据自己的需求按条件按查找目 ...