层层递进-解开hdfs的面纱

  1、hdfs是什么?它与普通服务器的文件系统有什么区别?它的特性有什么?

  2、hdfs的工作原理是怎样的?

  3、每台机器都单独启动有什么弊端?假设有1000台机器需要启动?该怎么解决呢?

  4、hdfs配置与使用

  5、利用javaApi充当客户端访问hdfs

hdfs简介

  hdfs就是一个分布式文件系统。简单说,就是一个“分鱼展”的大硬盘,跟普通的文件系统没什么区别,只是它有多台机器共同承担存储任务。

  分鱼展指的是hdfs的特性分别指分布式、冗余性、可拓展。

  普通服务器文件系统:上传文件到服务器

  

  hdfs分布式文件系统:相当于一块大硬盘、百度云网盘(内部实现就是hdfs)。

  

hdfs工作原理

  举例:上传一个1G的文件。

  1. 客户端与Master(NameNode)建立连接。
  2. 把文件名、文件的分割的数据块号告知Master(NameNode)。
  3. 告知客户端,存储数据Slave的ip、存储位置、块号。
  4. 客户端写文件到Slave1(也有可以是其他的Slave,Master根据机器的内存大小、存储空间进行分配)。然后Slave1远程存放数据以后,将会复制一份到Slave2、Slave3。
  5. 那什么是块呢?因为Master收到上传文件以后,hdfs默认一块128M(可修改)。那1G文件将会被分成10块。
  6. Slave1、Slave2、Slave3都复制一份?那跟一台服务器存储又有什么区别呢?假设有100台Slave机器呢?
  7. hdfs默认是配置备份数据到3台,可通过配置文件修改。
  8. 假设有100台Slave(DataNode),1G分为10块分别为B1、B2、......、B10,它内部是怎么进行分配呢?
  9. hdfs系统根据内存和存储空间。假设在Slave1、Slave2、Slave5存储B1,Slave2、Slave8、Slave10存储B2,Slave3、Slave12、Slave15存储B3,依次类推。

  分布式:别把hdfs理解得有多难,多抽象,只是数据从存储到一台机器上变成存储到多台机器上罢了。对于客户端而言,它就是一块硬盘,就是一台机器文件系统,跟JavaIO并没有很大差异。

  冗余性:因为分布式很难控制,一不小心就宕了一台机器呢?数据容易丢失,备份多份数据是非常有必要的,这也是hdfs的容错性。

  拓展性:拓展就是机器之间解耦,随时拓展集群、增加机器维持服务的供给。假设服务器正常运行中,突然之间Slave1宕了,那么怎么办?在我们潜意识当中,肯定分布式系统会自动去备份一份数据到另外一台内存占用比较低的机器。在hadoop有一概念叫做“心跳”检测,就是Master会每隔一段时间给集群发送一个消息,如果没有回应就默认机器宕了,然后Master会把重新把宕了的机器数据重新分配备份到内存占有率比较低的机器。善于思考的大佬们又想了,假设Master宕了呢?这么严重的问题,hadoop的开发者当然要考虑进去,在hadoop里面有一个类似于NameNode东西叫做SecondaNameNode,它将会隔一段时间将NameNode的快照和日志备份一遍到自己机器,并且通知NameNode更新日志,当NameNode宕了,SecondaNameNode将会及时顶上。有分析很透彻的文章,我就不班门弄斧了。http://blog.csdn.net/xh16319/article/details/31375197

每台机器都单独启动的弊端

  1、回顾之前命令
    查看结点启动情况:jps
    启动|关闭NameNode:hadoop-daemon.sh start|stop namenode
    启动|关闭DataNode:hadoop-daemon.sh start|stop datanode
    查看集群情况:hdfs dfsadmin -report或者利用网页http://192.168.56.100:50070

  2、集中式管理集群(注意:我们修改过的配置文件:/etc/hadoop/slaves)
    slave1 slave2 slave3

  3、启动集群(如果没有配置环境变量:start-dfs.sh、stop-dfs.sh在/usr/local/hadoop/sbin目录下找)
    切换至目录/usr/local/hadoop/sbin
    使用start-dfs.sh启动集群
    使用stop-dfs.sh关闭集群

  问题:需要依次输入远程机器的登录账号密码?这样貌似作用不大啊?
  答:在master机器上可以设置ssh远程登录的免密工作。ssh slave1输入账号密码就能远程登录

  cd
  ls -la
  cd .ssh
  ssh-keygen -t rsa (四个回车)
  #会用rsa算法生成私钥id_rsa和公钥id_rsa.pub
  ssh-copy-id slave1
  ssh-copy-id slave2
  ssh-copy-id slave3

  

hdfs的使用  

1、解释hdfs最简陋的/usr/local/hadoop/etc/hdfs-site.xml配置文件。注意:修改完配置以后,一定要对master进行 hadoop NameNode -format

<configuration>
<!--文件的存储位置-->
<property>
<name>dfs.name.dir</name>
<value>/usr/local/hadoop/data</value>
</property>
<!--关闭dfs权限,以免待会不允许客户端访问-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<!--备份数据多少份,默认三份,我配置了两份测试-->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!--心跳检测-->
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>10000</value>
</property>
</configuration>

2、hdfs的使用(最好通过网页查看 http:192.168.56.100:50070)

  1. hadoop fs -ls /
  2. hadoop fs -put file / (举例:hadoop fs -put hello.txt /)
  3. hadoop fs -mkdir /dirname
  4. hadoop fs -text /filename
  5. hadoop fs -rm /filename

  

  

利用JavaAPI充当客户端访问hdfs集群

1、添加jar-pom.xml包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ccut.aaron.test</groupId>
<artifactId>HadoopHdfs</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>HadoopHdfs</name>
<description/>
<properties>
<webVersion>3.0</webVersion>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>

<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->

<dependency>

<groupId>org.apache.hadoop</groupId>

<artifactId>hadoop-hdfs</artifactId>

<version>2.7.3</version>

</dependency>
<span style="color: #008000;">&lt;!--</span><span style="color: #008000;"> https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common </span><span style="color: #008000;">--&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span>org.apache.hadoop<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span>hadoop-common<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span>2.7.3<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span>
<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;<br /><br /></span>

</dependencies>

</project>

2、读文件

public class ReadFile {
public static void main(String[] args) throws MalformedURLException, IOException {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
InputStream in = new URL("hdfs://192.168.56.100:9000/hei.txt").openStream();
IOUtils.copyBytes(in, System.out, 4096, true);
} }

3、写文件

public class WriteFile {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.56.100:9000");
FileSystem fileSystem = FileSystem.get(conf);
        </span><span style="color: #0000ff;">boolean</span> b = fileSystem.exists(<span style="color: #0000ff;">new</span> Path("/hello"<span style="color: #000000;">));
System.out.println(b); </span><span style="color: #0000ff;">boolean</span> success = fileSystem.mkdirs(<span style="color: #0000ff;">new</span> Path("/mashibing"<span style="color: #000000;">));
System.out.println(success); success </span>= fileSystem.delete(<span style="color: #0000ff;">new</span> Path("/mashibing"), <span style="color: #0000ff;">true</span><span style="color: #000000;">);
System.out.println(success); FSDataOutputStream out </span>= fileSystem.create(<span style="color: #0000ff;">new</span> Path("/hei.txt"), <span style="color: #0000ff;">true</span><span style="color: #000000;">);
FileInputStream fis </span>= <span style="color: #0000ff;">new</span> FileInputStream("f:/hei.txt"<span style="color: #000000;">);
IOUtils.copyBytes(fis, out, </span>4096, <span style="color: #0000ff;">true</span><span style="color: #000000;">); FileStatus[] statuses </span>= fileSystem.listStatus(<span style="color: #0000ff;">new</span> Path("/"<span style="color: #000000;">));
</span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(statuses.length);</span>
<span style="color: #0000ff;">for</span><span style="color: #000000;">(FileStatus status : statuses) {
System.out.println(status.getPath());
System.out.println(status.getPermission());
System.out.println(status.getReplication());
} }

}

版权声明

  作者:xiaoyongAaron(邱勇)

  出处:http://www.cnblogs.com/qiuyong/

  您的支持是对博主深入思考总结的最大鼓励。

  本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,尊重作者的劳动成果。

Hadoop化繁为简(二)—层层递进轻松入门hdfs的更多相关文章

  1. Hadoop化繁为简(三)—探索Mapreduce简要原理与实践

    目录-探索mapreduce 1.Mapreduce的模型简介与特性?Yarn的作用? 2.mapreduce的工作原理是怎样的? 3.配置Yarn与Mapreduce.演示Mapreduce例子程序 ...

  2. Hadoop大数据平台入门——HDFS和MapReduce

    随着硬件水平的不断提高,需要处理数据的大小也越来越大.大家都知道,现在大数据有多火爆,都认为21世纪是大数据的世纪.当然我也想打上时代的便车.所以今天来学习一下大数据存储和处理. 随着数据的不断变大, ...

  3. 二、vue组件化开发(轻松入门vue)

    轻松入门vue系列 Vue组件化开发 五.组件化开发 1. 组件注册 组件命名规范 组件注册注意事项 全局组件注册 局部组件注册 2. Vue调试工具下载 3. 组件间数据交互 父组件向子组件传值 p ...

  4. Hadoop 学习之路(六)—— HDFS 常用 Shell 命令

    1. 显示当前目录结构 # 显示当前目录结构 hadoop fs -ls <path> # 递归显示当前目录结构 hadoop fs -ls -R <path> # 显示根目录 ...

  5. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

  6. 层层递进Struts1(八)之总结

    先来看一下Struts1学习总结的思维导图,画的主要是Struts1中的重点和博客分布,如下所示: 系列博客的侧重点是: Struts1是什么? 为什么要使用它? 如何使用Struts1? Strut ...

  7. 『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现

    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现 1.基本设定和软件版本 主机名 ip 对应角色 mas ...

  8. Hadoop(二):MapReduce程序(Java)

    Java版本程序开发过程主要包含三个步骤,一是map.reduce程序开发:第二是将程序编译成JAR包:第三使用Hadoop jar命令进行任务提交. 下面拿一个具体的例子进行说明,一个简单的词频统计 ...

  9. AngularJs轻松入门

    AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...

随机推荐

  1. Android系统--输入系统(六)模拟输入驱动程序

    Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...

  2. 03(3) 基于GMM-HMM的SR基础

    1.GMM-HMM的训练 1)训练GSM-HMM (1)确定HMM拓扑结构 (2)初始化HMM模型参数 (3)在所有的utterances中计算所需的统计量 (4)使用公式更新模型参数 (5)不收敛, ...

  3. vue.js2.0 自定义组件初体验

    理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...

  4. MySQL游标的简单实践

    Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行 ...

  5. oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)

    1. 相同字段上的多重索引   在Oracle 12c R1之前,一个字段是无法以任何形式拥有多个索引的.或许有人会想知道为什么通常一个字段需要有多重索引,事实上需要多重索引的字段或字段集合是很多的. ...

  6. Docker - 终端交互

    进入容器交互终端 使用docker attach命令进入容器交互终端. 注意:如果多个窗口同时attach到同一个容器,那么所有窗口都会同步显示.如果某个窗口因命令阻塞时,那么其他窗口将无法执行操作. ...

  7. python循环

    #!/usr/bin/python #coding:utf-8 lcf_age = "19" count = 0 while count < 3: c_lcf_age = i ...

  8. 学习MVC之租房网站(七)-房源管理和配图上传

    在上一篇<学习MVC之租房网站(六)-用户登录和权限控制>完成了后台用户登录和权限控制功能的开发,接下来要完成的是房源的管理,用户在后台新增.编辑房源信息,供前台用户操作. 一 房源管理 ...

  9. Redis学习-SortedSet

    Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联, ...

  10. 关于struts2 Could not find action or result错误

    今天来配置这个S2SH框架的的时候,刚把环境搭建好,启动时并没有报错,但是当我写了一个action,我也准备通过这个action来访问页面,但是这里我访问的时候却给我报Could not find a ...