HDFS原理及操作
1 环境说明
部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放
Hadoop等组件运行包。因为该目录用于安装hadoop等组件程序,用户对shiyanlou必须赋予rwx权限(一般做法是root用户在根目录下
创建/app目录,并修改该目录拥有者为shiyanlou(chown –R shiyanlou:shiyanlou /app)。
Hadoop搭建环境:
- 虚拟机操作系统: CentOS6.6 64位,单核,1G内存
- JDK:1.7.0_55 64位
- Hadoop:1.1.2
2 HDFS原理
HDFS(Hadoop Distributed File System)是一个分布式文件系统,是谷歌的GFS山寨版本。它具有高容错性并提供了高吞吐量的数据访问,非常适合大规模数据集上的应用,它提供了一个高度容错性和高吞吐量的海量数据存储解决方案。
- 高吞吐量访问:HDFS的每个Block分布在不同的Rack上,在用户访问时,HDFS会计算使用最近和访问量最小的服务器给用户提供。由于
Block在不同的Rack上都有备份,所以不再是单数据访问,所以速度和效率是非常快的。另外HDFS可以并行从服务器集群中读写,增加了文件读写的访
问带宽。 - 高容错性:系统故障是不可避免的,如何做到故障之后的数据恢复和容错处理是至关重要的。HDFS通过多方面保证数据的可靠性,多份复制并且分布到物理位置的不同服务器上,数据校验功能、后台的连续自检数据一致性功能都为高容错提供了可能。
- 线性扩展:因为HDFS的Block信息存放到NameNode上,文件的Block分布到DataNode上,当扩充的时候仅仅添加DataNode数量,系统可以在不停止服务的情况下做扩充,不需要人工干预。
2.1 HDFS架构
如上图所示HDFS是Master和Slave的结构,分为NameNode、Secondary NameNode和DataNode三种角色。
- NameNode:在Hadoop1.X中只有一个Master节点,管理HDFS的名称空间和数据块映射信息、配置副本策略和处理客户端请求;
- Secondary NameNode:辅助NameNode,分担NameNode工作,定期合并fsimage和fsedits并推送给NameNode,紧急情况下可辅助恢复NameNode;
- DataNode:Slave节点,实际存储数据、执行数据块的读写并汇报存储信息给NameNode;
2.2 HDFS读操作
- 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象时分布文件系统的一个实例;
- DistributedFileSystem通过使用RPC来调用NameNode以确定文件起始块的位置,同一Block按照重复数会返回多个位置,这些位置按照Hadoop集群拓扑结构排序,距离客户端近的排在前面;
- 前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流,客户端对这个输入流调用read()方法;
- 存储着文件起始块的DataNode地址的DFSInputStream随即连接距离最近的DataNode,通过对数据流反复调用read()方法,可以将数据从DataNode传输到客户端;
- 到达块的末端时,DFSInputStream会关闭与该DataNode的连接,然后寻找下一个块的最佳DataNode,这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流;
- 一旦客户端完成读取,就对FSDataInputStream调用close()方法关闭文件读取。
2.3 HDFS写操作
- 客户端通过调用DistributedFileSystem的create()方法创建新文件;
- DistributedFileSystem通过RPC调用NameNode去创建一个没有Blocks关联的新文件,创建前NameNode会
做各种校验,比如文件是否存在、客户端有无权限去创建等。如果校验通过,NameNode会为创建新文件记录一条记录,否则就会抛出IO异常; - 前两步结束后会返回FSDataOutputStream的对象,和读文件的时候相似,FSDataOutputStream被封装成
DFSOutputStream,DFSOutputStream可以协调NameNode和Datanode。客户端开始写数据到
DFSOutputStream,DFSOutputStream会把数据切成一个个小的数据包,并写入内部队列称为“数据队列”(Data
Queue); - DataStreamer会去处理接受Data
Queue,它先问询NameNode这个新的Block最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的
DataNode,把他们排成一个pipeline.DataStreamer把Packet按队列输出到管道的第一个Datanode中,第一个
DataNode又把Packet输出到第二个DataNode中,以此类推; - DFSOutputStream还有一个对列叫Ack Quene,也是有Packet组成,等待DataNode的收到响应,当Pipeline中的所有DataNode都表示已经收到的时候,这时Akc Quene才会把对应的Packet包移除掉;
- 客户端完成写数据后调用close()方法关闭写入流;
- DataStreamer把剩余的包都刷到Pipeline里然后等待Ack信息,收到最后一个Ack后,通知NameNode把文件标示为已完成。
2.4 HDFS中常用到的命令
1. hadoop fs
- hadoop fs -ls /
- hadoop fs -lsr
- hadoop fs -mkdir /user/hadoop
- hadoop fs -put a.txt /user/hadoop/
- hadoop fs -get /user/hadoop/a.txt /
- hadoop fs -cp src dst
- hadoop fs -mv src dst
- hadoop fs -cat /user/hadoop/a.txt
- hadoop fs -rm /user/hadoop/a.txt
- hadoop fs -rmr /user/hadoop/a.txt
- hadoop fs -text /user/hadoop/a.txt
- hadoop fs -copyFromLocal localsrc dst 与hadoop fs -put功能类似。
- hadoop fs -moveFromLocal localsrc dst 将本地文件上传到hdfs,同时删除本地文件。
2. hadoop fsadmin
- hadoop dfsadmin -report
- hadoop dfsadmin -safemode enter | leave | get | wait
- hadoop dfsadmin -setBalancerBandwidth 1000
3. hadoop fsck
4. start-balancer.sh
相关HDFS API可以到Apache官网进行查看:
3 测试例子1
3.1 测试例子1内容
在Hadoop集群中编译并运行《权威指南》中的例3.2,读取HDFS文件内容。
3.2 运行代码
import java.io.InputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
public class FileSystemCat {
public static void main(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem. get(URI.create (uri), conf);
InputStream in = null;
try {
in = fs.open( new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
3.3 实现过程
3.3.1 创建代码目录
配置本机主机名为hadoop,sudo时需要输入shiyanlou用户的密码:shiyanlou。将hadoop添加到第一行的最后。
sudo vim /etc/hosts
# 将hadoop添加到第一行末尾,修改后类似:# 172.17.2.98 f738b9456777 hadoop
ping hadoop
使用如下命令启动Hadoop
cd /app/hadoop-1.1.2/bin
./start-all.sh
在/app/hadoop-1.1.2目录下使用如下命令建立myclass和input目录:
cd /app/hadoop-1.1.2
rm -rf myclass
rm -rf input
mkdir myclass
mkdir input
3.3.2 建立例子文件上传到HDFS中
进入/app/hadoop-1.1.2/input目录,在该目录中建立quangle.txt文件
cd /app/hadoop-1.1.2/input
touch quangle.txt
vi quangle.txt
内容为:
On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.
使用如下命令在hdfs中建立目录/class4
- hadoop fs -mkdir /class4
- hadoop fs -ls /
(如果需要直接使用hadoop命令,需要把/app/hadoop-1.1.2加入到Path路径中)
把例子文件上传到hdfs的/class4文件夹中
- cd /app/hadoop-1.1.2/input
- hadoop fs -copyFromLocal quangle.txt /class4/quangle.txt
- hadoop fs -ls /class4
3.3.3 配置本地环境
对/app/hadoop-1.1.2/conf目录中的hadoop-env.sh进行配置,如下如所示:
- cd /app/hadoop-1.1.2/conf
- sudo vi hadoop-env.sh
加入对HADOOP_CLASPATH变量值,值为/app/hadoop-1.1.2/myclass,设置完毕后编译该配置文件,使配置生效
- export HADOOP_CLASSPATH=/app/hadoop-1.1.2/myclass
3.3.4 编写代码
进入/app/hadoop-1.1.2/myclass目录,在该目录中建立FileSystemCat.java代码文件,命令如下:
- cd /app/hadoop-1.1.2/myclass/
- vi FileSystemCat.java
输入代码内容:
3.3.5 编译代码
在/app/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:
- javac -classpath ../hadoop-core-1.1.2.jar FileSystemCat.java
3.3.6 使用编译代码读取HDFS文件
使用如下命令读取HDFS中/class4/quangle.txt内容:
- hadoop FileSystemCat /class4/quangle.txt
4 测试例子2
4.1 测试例子2内容
在本地文件系统生成一个大约100字节的文本文件,写一段程序读入这个文件并将其第101-120字节的内容写入HDFS成为一个新文件。
4.2 运行代码
注意:在编译前请先删除中文注释!
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
public class LocalFile2Hdfs {
public static void main(String[] args) throws Exception {
// 获取读取源文件和目标文件位置参数
String local = args[0];
String uri = args[1];
FileInputStream in = null;
OutputStream out = null;
Configuration conf = new Configuration();
try {
// 获取读入文件数据
in = new FileInputStream(new File(local));
// 获取目标文件信息
FileSystem fs = FileSystem.get(URI.create(uri), conf);
out = fs.create(new Path(uri), new Progressable() {
@Overridepublic void progress() {
System.out.println("*");
}
});
// 跳过前100个字符
in.skip(100);
byte[] buffer = new byte[20];
// 从101的位置读取20个字符到buffer中int bytesRead = in.read(buffer);
if (bytesRead >= 0) {
out.write(buffer, 0, bytesRead);
}
} finally {
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
}
}
4.3 实现过程
4.3.1 编写代码
进入/app/hadoop-1.1.2/myclass目录,在该目录中建立LocalFile2Hdfs.java代码文件,命令如下:
- cd /app/hadoop-1.1.2/myclass/
- vi LocalFile2Hdfs.java
输入代码内容:
4.3.2 编译代码
在/app/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:
- javac -classpath ../hadoop-core-1.1.2.jar LocalFile2Hdfs.java
4.3.3 建立测试文件
进入/app/hadoop-1.1.2/input目录,在该目录中建立local2hdfs.txt文件
- cd /app/hadoop-1.1.2/input/
- vi local2hdfs.txt
内容为:
Washington (CNN) -- Twitter is suing the U.S. government in an effort to loosen restrictions on what the social media giant can say publicly about the national security-related requests it receives for user data.
The company filed a lawsuit against the Justice Department on Monday in a federal court in northern California, arguing that its First Amendment rights are being violated by restrictions that forbid the disclosure of how many national security letters and Foreign Intelligence Surveillance Act court orders it receives -- even if that number is zero.
Twitter vice president Ben Lee wrote in a blog post that it's suing in an effort to publish the full version of a "transparency report" prepared this year that includes those details.
The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.
4.3.4 使用编译代码上传文件内容到HDFS
使用如下命令读取local2hdfs第101-120字节的内容写入HDFS成为一个新文件:
- cd /app/hadoop-1.1.2/input
- hadoop LocalFile2Hdfs local2hdfs.txt /class4/local2hdfs_part.txt
4.3.5 验证是否成功
使用如下命令读取local2hdfs_part.txt内容:
- hadoop fs -cat /class4/local2hdfs_part.txt
5 测试例子3
5.1 测试例子3内容
测试例子2的反向操作,在HDFS中生成一个大约100字节的文本文件,写一段程序读入这个文件,并将其第101-120字节的内容写入本地文件系统成为一个新文件。
5.2 程序代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class Hdfs2LocalFile {
public static void main(String[] args) throws Exception {
String uri = args[0];
String local = args[1];
FSDataInputStream in = null;
OutputStream out = null;
Configuration conf = new Configuration();
try {
FileSystem fs = FileSystem.get(URI.create(uri), conf);
in = fs.open(new Path(uri));
out = new FileOutputStream(local);
byte[] buffer = new byte[20];
in.skip(100);
int bytesRead = in.read(buffer);
if (bytesRead >= 0) {
out.write(buffer, 0, bytesRead);
}
} finally {
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
}
}
5.3 实现过程
5.3.1 编写代码
进入/app/hadoop-1.1.2/myclass目录,在该目录中建立Hdfs2LocalFile.java代码文件,命令如下:
- cd /app/hadoop-1.1.2/myclass/
- vi Hdfs2LocalFile.java
输入代码内容:
5.3.2 编译代码
在/app/hadoop-1.1.2/myclass目录中,使用如下命令编译代码:
- javac -classpath ../hadoop-core-1.1.2.jar Hdfs2LocalFile.java
5.3.3 建立测试文件
进入/app/hadoop-1.1.2/input目录,在该目录中建立hdfs2local.txt文件
- cd /app/hadoop-1.1.2/input/
- vi hdfs2local.txt
内容为:
The San Francisco-based firm was unsatisfied with the Justice Department's move in January to allow technological firms to disclose the number of national security-related requests they receive in broad ranges.
"It's our belief that we are entitled under the First Amendment to respond to our users' concerns and to the statements of U.S. government officials by providing information about the scope of U.S. government surveillance -- including what types of legal process have not been received," Lee wrote. "We should be free to do this in a meaningful way, rather than in broad, inexact ranges."
在/app/hadoop-1.1.2/input目录下把该文件上传到hdfs的/class4/文件夹中
- hadoop fs -copyFromLocal hdfs2local.txt /class4/hdfs2local.txt
- hadoop fs -ls /class4/
5.3.4 使用编译代码把文件内容从HDFS输出到文件系统中
使用如下命令读取hdfs2local.txt第101-120字节的内容写入本地文件系统成为一个新文件:
- hadoop Hdfs2LocalFile /class4/hdfs2local.txt hdfs2local_part.txt
5.3.5 验证是否成功
使用如下命令读取hdfs2local_part.txt内容:
- cat hdfs2local_part.txt
HDFS原理及操作的更多相关文章
- 读Hadoop3.2源码,深入了解java调用HDFS的常用操作和HDFS原理
本文将通过一个演示工程来快速上手java调用HDFS的常见操作.接下来以创建文件为例,通过阅读HDFS的源码,一步步展开HDFS相关原理.理论知识的说明. 说明:本文档基于最新版本Hadoop3.2. ...
- HDFS原理介绍
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Googl ...
- Hadoop入门进阶课程4--HDFS原理及操作
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan ...
- HDFS 原理、架构与特性介绍--转载
原文地址:http://www.uml.org.cn/sjjm/201309044.asp 本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前H ...
- Hadoop之HDFS原理及文件上传下载源码分析(上)
HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随 ...
- Hadoop之HDFS原理及文件上传下载源码分析(下)
上篇Hadoop之HDFS原理及文件上传下载源码分析(上)楼主主要介绍了hdfs原理及FileSystem的初始化源码解析, Client如何与NameNode建立RPC通信.本篇将继续介绍hdfs文 ...
- [Hadoop]Hadoop章2 HDFS原理及读写过程
HDFS(Hadoop Distributed File System )Hadoop分布式文件系统. HDFS有很多特点: ① 保存多个副本,且提供容错机制,副本丢失或宕机自动恢复.默认存3份. ② ...
- Hadoop原理之——HDFS原理
Hadoop 3个核心组件: 分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统) 分布式运算编程框架:Mapreduce——实现在 ...
- HDFS 原理、架构与特性介绍
本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前HDFS架构详尽分析 HDFS架构 •NameNode •DataNode •Senc ...
随机推荐
- h5微信浏览器复制粘贴--ios兼容问题的解决方法(clipboard.js插件)
前段时间在做微信h5的时候,遇到了ios兼容,使用clipboard.js插件完美解决 下载地址:下载地址: https://github.com/zenorocha/clipboard.js cnd ...
- vs2013 在按F5调试时,总是提示 “项目已经过期”的解决方案
这个是由于缺少某些文件(如.h,xxx.icon),或者文件时间不对 引起的. 如图在工具选项设置 最小为 “诊断”. 然后编译一下,会提示 xxx过期,确认下即可.
- rwcheck:为嵌入式设备设计的读写压测工具
我设计的一款读写压测工具,开源在我的github仓库 rwcheck是一个对嵌入式设备进行读写压测的工具 什么是rwcheck 正如其名,rwcheck工具用于读写压测.它是什么工作原理呢?为什么要用 ...
- vue 实现数据绑定原理
案例: Vue 底层原理 // 目的: 使用原生js来实现Vue深入响应式 var box = document.querySelector('.box') var button = ...
- 帝国CMS(EmpireCMS) v7.5 后台XSS漏洞分析
帝国CMS(EmpireCMS) v7.5 后台XSS漏洞分析 一.漏洞描述 该漏洞是由于代码只使用htmlspecialchars进行实体编码过滤,而且参数用的是ENT_QUOTES(编码双引号和单 ...
- 关于selenium自动化对iframe内嵌元素的处理
今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的iframe,楼主,以前也遇到过,但是一直也没搞懂怎么处理的,都是抄别人的代码,今天决定独立解决试试.首先先来认识什么是iframe,它就长下图这样 ...
- tomcat启动nio,apr详解以及配置
tomcat启动nio,apr详解以及配置 前言 在正文开始之前,我们先在idea工具中看看启动的信息,顺便看下启动的基本信息 在这里插入图片描述可以看到信息有tomcat版本操作系统版本java版本 ...
- Spark应用场景以及与hadoop的比较
一.大数据的四大特征: a.海量的数据规模(volume) b.快速的数据流转和动态的数据体系(velocity) c.多样的数据类型(variety) d.巨大的数据价值(value) 二.Spar ...
- .Net 基于Memcache集群的分布式Session
简述 基于Memcache的Session大家都各有各的说法,比方说:当memcached集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线等等,每种技 ...
- TextCNN 代码详解(附测试数据集以及GitHub 地址)
前言:本篇是TextCNN系列的第三篇,分享TextCNN的优化经验 前两篇可见: 文本分类算法TextCNN原理详解(一) 一.textCNN 整体框架 1. 模型架构 图一:textCNN 模型结 ...