注:该文内容部分来源于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. GDUT——1169: Krito的讨伐(优先队列BFS)

    1169: Krito的讨伐 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 619  Solved: 102 Description Krito终于干 ...

  2. MyBatis 配置sql语句输出

    版权声明:本文为博主原创文章,未经博主允许不得转载. 此处使用log4j,加入jar包,然后在src路径下加入:log4j.properties文件 填入以下配置就可以打印了 log4j.rootLo ...

  3. Thinkphp 不显示生成的验证码 【转载】

    在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify-& ...

  4. Web 在线文件管理器学习笔记与总结(6)jQuery UI 预览图片

    ① 查看文件内容,如果文件是图片类型,点击直接查看图片: ② 如果不是图片类型,显示文件中的内容: ③ 使用 jQuery UI 中的 Dialog 显示图片 a.引入: <script src ...

  5. sql语句什么时候用双引号或者单引号

    INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须 ...

  6. Python的包管理工具--PIP安装使用

    最新安装方式 # wget https://bootstrap.pypa.io/get-pip.py # python get-pip.py  // 使用该方式安装已经不再要求提前安装setuptoo ...

  7. centos 6.X 安装scrapy-原创

    特别注意[坑]: python版本一定大于 2.7.5,scrapy python 必须2.7以上centos 6.X系列 系统默认安装的python是2.6.6 ,本人折腾了很久2.7.3 在这里升 ...

  8. XPath学习:parent,child

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

  9. jQuery 复选框全选反选

    <script type="text/javascript"> $(function(){ //全选 $("#CheckedAll").click( ...

  10. 毕老师的Editplus

    简介 EditPlus是一款由韩国 Sangil Kim (ES-Computing)出品的小巧但是功能强大的可处理文本.HTML和程序语言的Windows编辑器,你甚至可以通过设置用户工具将其作为C ...