Hadoop---(1)HDFS(分布式文件系统)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1021979964/article/details/86704738

 

Hadoop的特点:

扩容能力(Scalable):能可靠地(reliably)存储和处理千兆节点(PB)的数据。

成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动重新部署(redeploy)计算任务。

 

单节点物理结构:

 

 

1.HDFS

HDFS:Hadoop Distributed File System 分布式文件系统

 

分布式文件管理系统:可以统一管理多台机器上的文件,比较适用于一次写入多次查询的情况,不支持并发写情况,小文件不适合。

 

特点:

通透性: 让实际上是通过网络来访问文件的动作,由程序与用户看来就像是访问本地的磁盘一般。

容错: 即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。

1.1 HDFS的shell

 

调用文件系统(FS)Shell命令应使用bin/hadoop fs的形式

 

如:hadoop fs -ls

 

  1. -help [cmd]   //显示命令的帮助信息
  2. -ls(r) <path> //显示当前目录下所有文件
  3. -du(s) <path>     //显示目录中所有文件大小
  4. -count[-q] <path>    //显示目录中文件数量
  5. -mv <src> <dst>       //移动多个文件到目标目录
  6. -cp <src> <dst> //复制多个文件到目标目录
  7. -rm(r)             //删除文件(夹)
  8. -put <localsrc> <dst>     //本地文件复制到hdfs
  9. -copyFromLocal  //同put
  10. -moveFromLocal //从本地文件移动到hdfs
  11. -get [-ignoreCrc] <src> <localdst>    //复制文件到本地,可以忽略crc校验
  12. -getmerge <src> <localdst>        //将源目录中的所有文件排序合并到一个文件中
  13. -cat <src>     //在终端显示文件内容
  14. -text <src>   //在终端显示文件内容
  15. -copyToLocal [-ignoreCrc] <src> <localdst>  //复制到本地
  16. -moveToLocal <src> <localdst>
  17. -mkdir <path>    //创建文件夹
  18. -touchz <path>  //创建一个空文件   

 

 

1.2 HDFS的架构 

 

主从结构:

主节点,只有一个:namenode

从节点,有很多个:datanodes

 

Namenode负责:

接收用户操作请求

维护文件系统的目录结构

管理文件与block之间关系,block与datanode之间关系

 

Datanode负责:

存储文件

文件被分成block存储在磁盘上

为保证数据安全,文件会多个副本保存在多个节点

 

 

1.3 NameNode

 

Namenode:是整个文件的管理节点。它维护着整个文件系统的文件目录树,文件/目录的

元信息和每个文件对应的数据块列表。接收用户的操作请求。

 

hdfs-site.xml的dfs.name.dir属性中操作

文件包括有:

fsimage:元数据镜像文件,存储某一时段NameNode内存元数据信息。

edits:操作日志文件。

fstime:保存最近一次checkpoint的时间。

 

 

1.4 DataNode

 

提供真实文件数据的存储服务。

 

文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称为一个block。HDFS默认Block大小是64MB,以一个256MB文件,共有256/64=4个block。

 

不同与普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间,(实际使用了多少就占用多少,只不过是划分为size)。

 

Replication。多副本,默认是三个。想修改在hdfs-site.xml的dfs.replication属性中。

 

 

1.5 SecondaryNameNode

 

 

HA的一个解决方案。但不支持热备,配置即可。

 

执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,同时重置NameNode的edits。

 

默认安装在Namenode节点上。但不太安全。

 

1.6 HDFS的JavaAPI

 

用户代码操作HDFS时,是直接调用FileSystem的子类完成的。

package com.hadoop.hdfs;



import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.URI;

import java.net.URISyntaxException;



import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import org.junit.Before;

import org.junit.Test;



public class HDFSDemo {



private FileSystem fs = null;

public static final String HDFS_PATH = "hdfs://namenode:9000"; //hdfs路径

public static final String DIR_PATH = "/d1000"; //hdfs文件夹路径

public static final String FILE_PATH = "/hello.txt"; //hdfs文件路径



//设置初始化文件    设置hdfs的路径,权限为root

@Before

public void init() throws IOException, URISyntaxException, InterruptedException{

        fs = FileSystem.get(new URI("hdfs://namenode:9000"), new Configuration(),"root");

}



//删除文件  在hdfs删除一个文件(或者文件夹)

@Test

public void testDel() throws IllegalArgumentException, IOException{

        boolean flag = fs.delete(new Path("/iamkevin"), true);

        System.out.println(flag);

}



//创建文件  在hdfs创建一个文件(或者文件夹)

@Test

public void testMkdir() throws IllegalArgumentException, IOException{

        boolean flag = fs.mkdirs(new Path("/iamkevin"));

        System.out.println(flag);

}



//上传文件  将本地文件上传到hdfs

@Test

public void testUpload() throws IllegalArgumentException, IOException{

        //FSDataOutputStream out = fs.create(new Path("hdfs://namenode:9000/track/track_input/"));//hsfd路径上的文件

        //FileInputStream in = new FileInputStream(new File("F:/TrackFile/"));//本地文件

        //IOUtils.copyBytes(in, out, 2048, true);

        Path in = new Path("F:/track_file/");

        Path out = new Path("hdfs://namenode:9000/track/");

        fs.copyFromLocalFile(false, in, out);

        fs.close();

        System.out.println("文件上传成功...");

       

}



//下载文件  将hdfs上的文件下载到本地

@Test

public void downloadData() throws IOException {

        FSDataInputStream in = fs.open(new Path(FILE_PATH)); //打开hdfs源文件

        FileOutputStream out = new FileOutputStream(new File("C://Users//caonanqing//Desktop//Test"));

        IOUtils.copyBytes(in, out, 1024, true); //输出到本地

}



public static void main(String[] args) throws IOException, URISyntaxException {

       

        FileSystem fs = FileSystem.get(new URI("hdfs://cnq:9000"), new Configuration());

        InputStream in = fs.open(new Path("/hello"));

        FileOutputStream out = new FileOutputStream(new File("C://Users//caonanqing//Desktop//hello.txt"));

        //IOUtils.copyBytes(in, System.out, 2048, true); //输出到控制台

        IOUtils.copyBytes(in, out, 2048,true);//输出到



}



}

 

1.7 RPC远程过程调用协议

 

RPC(Remote Procedure Call):远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据,在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

 

RPC采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。首先客户机调用发送一个有进程参数的调用信息到信息进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止,当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

 

Hadoop的整个体系结构就是构建在RPC之上的。

 

RPC示例:

public interface Bizable extends  VersionedProtocol{

public abstract String hello(String name);

}



class Biz implements Bizable{

@Override

public String hello(String name){

        System.out.println("被调用了");

        return "hello "+name;

}

@Override

public long getProtocolVersion(String protocol, long clientVersion)

               throws IOException {

        System.out.println("Biz.getProtocalVersion()="+MyServer.VERSION);

        return MyServer.VERSION;

}

}



//服务器

public class MyServer {

public static int PORT = 3242;

public static long VERSION = 23234l;



public static void main(String[] args) throws IOException {

        final Server server = RPC.getServer(new Biz(), "127.0.0.1", PORT, new Configuration());

        server.start();

}

}





//客户端

public class MyClient {

public static void main(String[] args) throws IOException {

        final InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", MyServer.PORT);

        final Bizable proxy = (Bizable) RPC.getProxy(Bizable.class, MyServer.VERSION, inetSocketAddress, new Configuration());

        final String ret = proxy.hello("kevin");

        System.out.println(ret);

       

        RPC.stopProxy(proxy);

}

}

 

RPC的调用流程:

 

ClientProtocol:是客户端(FileSystem)与NameNode通信的接口。

 

DatanodeProtocol:是DataNode与NameNode通信的接口。

 

NamenodeProtocol:是SecondaryNameNode与NameNode通信的接口。

 

DFSClient:

是直接调用NameNode接口的对象。

用户代码是通过DistributedFileSystem调用DFSClient对象,才能与NameNode打交道。

 

1.8 HDFS操作

 

HDFS:是将客户端的大文件存放在很多节点的数据块中。    

 

NameNode:NameNode的作用是管理文件目录结构,是管理数据节点的。

NameNode维护两套数据,一套是文件目录与数据块之间的关系(数据是静态,放在磁盘上,通过fsimage和edits文件来维护),

另一套是数据块与节点之间的关系(数据是动态,不持久化到磁盘,每当集群启动会自动建立这些信息)

 

DataNode:DataNode的作用是HDFS中真正存储数据的。

 

Block:Block本质上是一个逻辑概念,不会真正的存储数据,只是划分文件的。每个Block是64MB

如果不想使用64MB大小,可以在core-site.xml中的dfs.block.size参数覆盖该值(单位字节)

Block划分文件后存放的位置可以在core-default.xml中的dfs.data.dir参数查看,

以"blk_"开头的文件就是存储数据的block,后缀是"meta"的文件就是block的源数据文件,存放一些元数据信息

 

副本:副本就是备份,目的是为了安全,因为集群环境的不可靠,所有使用副本机制保证数据的安全性。

默认的副本数量为3,在hdfs-default.xml中的dfs.replication参数中设置

 

SecondaryNameNode:作用是合并NameNode中的edits到fsimage中。

 

50070端口,查看NameNode状态  

50075端口,查看DataNode

50090端口,查看SecondaryNameNode

50030端口,查看JobTracker状态    

50060端口,查看TaskTracker    

 

 

HDFS shell

1.0查看帮助

        hadoop fs -help <cmd>

1.1上传(linux路径,hdfs路径)

        hadoop fs -put /hadoop/test/demo.txt /test

1.2下载文件(hdfs路径,linux路径)

        hadoop fs -get /test/demo.txt  /hadoop/test

1.3查看文件列表

        hadoop fs -ls /

1.4递归查看目录结构

        hadoop fs -lsr /user

1.5查看文件内容

        hadoop fs -cat /hbase-env.sh

1.6统计目录下个文件大小(单位字节)

        hadoop fs -du /hbase

1.7汇总统计目录下文件大小

        hadoop fs -dus /hbase

1.8统计文件夹数量

        hadoop fs -count /usr

1.9移动文件(第一个路径是源文件,第二个路径是目的目录)

        hadoop fs -mv /user/root/abc /user

1.10复制文件(第一个路径是源文件,第二个路径是目的目录)

        hadoop fs -cp /user/abc /user/root

1.11删除文件/空白文件夹(不能删除非空目录)

        hadoop fs -rm /user/abc

1.12递归删除(删除指定目录的所有子目录和文件)

        hadoop fs -lsr /user

1.13从本地复制(与put上传一样)

        hadoop fs -copyFromLocal /hadoop/test/demo.txt /test

1.14从本地移动(linux路径,hdfs路径)

        hadoop fs -moveFromLocal /hadoop/test/demo.txt /test

1.15合并到本地(hdfs路径,linux路径)

        hadoop fs -getmerge /hbase abc

1.16查看文件内容(与cat一样)

        hadoop fs -text /hbase-env.sh

1.17创建空白文件夹

        hadoop fs -mkdir /abc

1.18设置副本数量(副本数默认1改为2,多了一个副本,hdfs会自动执行文件的复制工作,产生新的副本)

        hadoop fs -setrep 2 /install.log(文件)

        hadoop fs -setrep -R 2 /install.log(文件夹需要加个-R)

        hadoop fs -setrep -R -w 2 /install.log(加个-w表示等待副本操作结束才退出命令)

1.19创建空白文件

        hadoop fs -touchz /emptyfile

1.20显示文件的统计信息(依次表示文件大小,文件名称,块大小,副本数,访问时间)

        hadoop fs -stat '%b %n %o %r %Y' /install.log

1.21查看文件尾部内容

        hadoop fs -tail /install.log

1.22修改文件权限

        hadoop fs -chmod 755 /emptyfile

1.23修改文件属主

        hadoop fs -chown root /emptyfile

1.24修改文件属组

        hadoop fs -chgrp supergroup /emptyfile

       

猜你喜欢

转载自blog.csdn.net/qq1021979964/article/details/86704738