注:该文内容部分来源于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.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntim [问题点数:40分,结帖人wangxiaohua_001]

    14:56:10.093 WARN!! Error for /butterfly/plugins/zhonghang/UsefulData/save_usefuldata.bshjava.lang.N ...

  2. MongoDB命令模式下的条件过滤总结

    db.tb1.find() //查询全部,用it查看下一页.db.tb1.find({"age":1}) //查询年龄==1的记录db.tb1.find({},{"age ...

  3. Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)

    分页 要对列表页进行分页,需要知道: ①用户总数 $count ② 页大小 $pageSize:用户自定义 ③ 当前页:$page:GET 方式获取 ④ 总页数:$pageCount = ceil($ ...

  4. PHP 设计模式 笔记与总结(2)开发 PSR-0 的基础框架

    [PSR-0 规范的三项约定]: ① 命名空间必须与绝对路径一致 ② 类名的首字母必须大写 ③ 除入口文件外,其他".php"必须只有一个类(不能有可执行的代码) [开发符合 PS ...

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

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

  6. vue model双向绑定

    view <div id='demo' class="container"> <input type="text" v-model='name ...

  7. mysql控制台命令

    * mysql 链接服务器 mysql -h localhost  -u root -p show processlist; update mysql.user set authentication_ ...

  8. nodejs爬虫

    前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...

  9. netstat 查看TCP状态值

    一.TCP 状态值 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' CLOSED:无连接是活动的或正在进行LI ...

  10. DOCTYPE、指定语言、字符集

    <!DOCTYPE html> 在HTML的最开始部分声明DOCTYPE文档类型,可以让浏览器或其他用户代理知道你要使用的Html语言类型:无论你打算使用何种类型的HTML语言,DOCTY ...