注:该文内容部分来源于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. Java表单类双击提交

    双击制御 有些时候一些操作会非常的耗费时间(Long Lived Operation),例如这个数据库的导出,表表生成等.有些时候程序的使用者看到很长时间服务器 没有反应,倾向于多次点击提交按钮.这样 ...

  2. 【转载】wireshark:no interface can be used for capturing in this system with the current configuration

    转自:wireshark:no interface can be used for capturing in this system with the current configuration 通过 ...

  3. django + ngxin + uwsgi 站点部署

    第一步 创建项目启动脚本 # 创建项目启动脚本 vi /etc/init.d/project_name #!/bin/bash # Description: uwsgi manager scripts ...

  4. 解决蓝屏代吗0x0000007B的几种常见办法

        解决蓝屏代吗0x0000007B的几种常见办法 0x0000007B 蓝屏代码的分析 ◆错误分析:Windows在启动过程中无法访问系统分区或启动卷. 网络上经过收集,主要有四种可能.第一是新 ...

  5. PHP常用正则表达式汇总 [复制链接]

    PHP常用正则表达式汇总 [复制链接] 上一主题下一主题   离线我是小猪头   法师     发帖 539 加关注 发消息 只看楼主 倒序阅读 使用道具楼主  发表于: 2011-06-22 更多 ...

  6. 不再以讹传讹,GET和POST的真正区别

    不再以讹传讹,GET和POST的真正区别 网上的多数答案都是错的 在 2012年05月03日 那天写的     已经有 19940 次阅读了 感谢 参考或原文 www.cnblogs.com   服务 ...

  7. Least_squares 最小二乘法

    https://en.wikipedia.org/wiki/Least_squares 動差估計法( MM, The Method of Moment ) 最小平方法( LSQ, The Method ...

  8. Behavior-Based Intelligence

    Computer Science An Overview _J. Glenn Brookshear _11th Edition Early work in artificial intelligenc ...

  9. 实例讲述PHP面向对象的特性;;;php中const与define的使用区别

    php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...

  10. Solr4.3之拼写检查Spellcheck功能

    原文地址:http://www.656463.com/article/iaquii.htm 拼写检查功能,能在搜索时提供一个较好用户体验,所以,主流的搜索引擎都有这个功能,在这之前,笔者先简单的说一下 ...