文档章节

从零开始最短路径学习Hadoop之03----HDFS分布式文件系统

brian_2017
 brian_2017
发布于 2017/01/17 08:58
字数 1442
阅读 8
收藏 0
1.当数据集的大小超过一台独立物理计算机的存储能力的时候,就有必要对数据进行分区partition并存储到若干台单独的计算机上。管理跨多台计算机存储的文件系统称为分布式文件系统。

2. Hadoop有一个称为HDFS(Hadoop Distributed FileSsytem)的分布式系统。

3. HDFS设计
    超大文件:几百MB,几百GB,几百TB,PB级别数据。
    流式数据访问:一次写入,多次读取。
    商用硬件:不可靠的文件,故障率高。

4. Hadoop的不利之处,不适应以下三种情况:
    低时间延迟的数据访问;
    大量的小文件;
    多用户写入,任意修改文件;

5. HDFS的概念:
    5.1  数据要分块,通常是64M。
            " hadoop fsck / -files -blocks"
    5.2  namenode和datanode
            namenode是管理者,一个。datanode是工作者,多个。
            命名空间镜像文件,编辑日志文件。
            SecondaryNameNode,第二名称节点。
    5.3 命令行接口:
           " hadoop fs -help"
    5.4 Hadoop文件系统
            HDFS是hadoop有一个抽象的文件系统概念。HDFS是其中一个实现。还有其他各种实现。
    5.5 接口:
            Java API可以调用所有Hadoop文件系统的交互操作。也能操作Thrift,C语言,FUSE, WebDAV,HTTP,FTP。

6 从Hadoop URL中读取数据
    6.1 最常用的是FileSystem API读取数据。
    6.2 FileSystemCat.java
package com.cere;

import java.net.URI;
import java.io.InputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
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);
        }
    }
}

    6.3 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    6.4 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ jar -cvf fsc.jar -C ./classes/ .
    6.5 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p1$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fsc.jar com.cere.FileSystemCat o3/part-r-00000

7. 文件定位 seek
    InputStream的可以对文件进行定位seek,可以定位到任何位置。在6的文件里加上几条语句,就可以返回文件头,再次进行读写。
    7.1 FileSystemCat.java
package com.cere;

import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
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);
        FSDataInputStream in = null;
        try{
            in = fs.open(new Path(uri));
            IOUtils.copyBytes(in, System.out, 4096, false);
            in.seek(0);
            IOUtils.copyBytes(in, System.out, 4096, false);
        }finally{
            IOUtils.closeStream(in);
        }
    }
}

    7.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java 
    7.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ jar -cvf fsc.jar -C ./classes/ .
    7.4 运行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p2$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fsc.jar  com.cere.FileSystemCat o3/part-r-00000
    7.5 打印了两遍。如果是seek(10),就跳过10个字节打印。
    7.6 FSDataInputStream实现了PositionedReadable接口,从一个指定偏移量读取文件的一部分。
    7.7 seek函数是高开销,尽量少用。

8 将本地文件复制到hdfs系统
    8.1 FileCopyWithProgress.java
package com.cere;

import java.net.URI;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress{
    public static void main(String[] args) throws Exception{
        String localsrc = args[0];
        String dst = args[1];
        InputStream in = new BufferedInputStream(new FileInputStream(localsrc));

        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(dst), conf);
        OutputStream out = fs.create(new Path(dst), new Progressable(){
            public void progress(){
                System.out.print(".");
            }
        });
        IOUtils.copyBytes(in, out, 4096, true);
    }
}

    8.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    8.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ jar -cvf fcwp.jar -C ./classes/ .
    8.4 运行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar fcwp.jar com.cere.FileCopyWithProgress ~/usr/hadoop/hadoop-1.1.2/hadoop-examples-1.1.2.jar hadoop-examples.jar
    8.5 查看结果: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p3$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop fs -lsr
            能看到hadoop-examples.jar已经hdfs文件系统里了。
    8.6 FSDataOutputStream可以查询文件当前位置的方法。但不能seek,不能随机写。

9. 目录:不需要显示创建目录,调用create方法时候写入文件会自动创建父目录。

10. 文件元数据FileStatus
    它封装了文件系统的文件和目录的元数据,包括文件长度,块大小,备份,修改时间,所有者,权限等信息
    10.1 ShowFileStatus.java
package com.cere;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;

public class ShowFileStatus{
    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        String uri = args[0];
        FileSystem fs = FileSystem.get(URI.create(uri),conf);
        Path file = new Path(uri);
        FileStatus stat = fs.getFileStatus(file);
        System.out.println(stat.getPath());
        System.out.println(stat.getLen());
        System.out.println(stat.getModificationTime());
        System.out.println(stat.getOwner());
        System.out.println(stat.getReplication());
        System.out.println(stat.getBlockSize());
        System.out.println(stat.getGroup());
        System.out.println(stat.getPermission().toString());
    }
}

    10.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar -d ./classes/ src/*.java
    10.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ jar -cvf sfs.jar -C ./classes/ .
    10.4 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p4$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar sfs.jar com.cere.ShowFileStatus 1901.dat

11. 列出一个目录下所有文件
    11.1 ListStatus.java
package com.cere;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileUtil;

public class ListStatus{
    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        String uri = args[0];
        FileSystem fs = FileSystem.get(URI.create(uri),conf);

        Path[] paths = new Path[args.length];
        for(int i = 0; i < args.length; i++){
            paths[i] = new Path(args[i]);
        }

        FileStatus[] status = fs.listStatus(paths);
        Path[] listedPaths = FileUtil.stat2Paths(status);
        for(Path p : listedPaths){
            System.out.println(p);
        }
    }
}

    11.2 编译: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ javac -classpath /home/brian/usr/hadoop/hadoop-1.1.2/hadoop-core-1.1.2.jar  -d ./classes/ src/*.java
    11.3 打包: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ jar -cvf ls.jar -C ./classes/ .
    11.4 执行: brian@brian-i3:~/all/work/learn/hadoop/hdp-train/class-3/p5$ ~/usr/hadoop/hadoop-1.1.2/bin/hadoop jar ls.jar  com.cere.ListStatus hdfs://localhost:9000/user/brian
    11.5 可以有通配模式。可以用PathFilter过滤文件。

12. 删除文件,用函数delete。

13. 文件流的读取和写入剖析。这是hadoop内部处理的,现在可以不用管。

14.一致性模型,每次写满一个块,才能看到一个块。可以强制同步,用sync函数。

15. distcp可以并行复制。

16. hadoop archieve 工具可以进行文件存档。

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
hadoop 配置示例

安装配置hadoop: 1 安装前的准备工作 本示例所演示的过程基于RHEL 5.8(32bit)平台,用到的应用程序如下所示。 JDK: jdk-7u5-linux-i586.rpm Hadoop:hadoop-0.20.2-cdh3u5.tar.gz 安全起见,...

蓝宫卫
2017/02/20
0
0
【hadoop】8.HDFS-常用命令行操作

简介 通过本教程您可以学习到: HDFS命令行语法模式 所有命令列表 常用的命令行操作 命令实际测试及结果 1、基本语法 hadoop的hdfs操作基本语法很简单即 以hadoop fs引导的命令。 2、所有命令...

Areya
01/12
8
0
Hadoop技术体系解读

在一个张口闭口都是大数据云计算的今天,我们有必要思考一下,在目前主流的技术体系层面它所代表的意义是什么,期望我的博文能够给后来人一些启示,少绕一些弯路。 我们还是从Hadoop生态系统...

牧师-Panda
2016/10/16
132
0
[ Hadoop ] 单机伪集群配置试验和分析

同步发在: https://evergreen-tree.github.io/articles/2016-05/daily-hadoop-singleNode-setup 以下内容摘自网路: Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不...

巴林的狗尾草
2016/05/25
2.2K
13
在 Ubuntu16.04 上搭建 Hadoop-2.8.0 伪分布式环境

学校有几门课程的作业需要我们来写个教程,好吧。 环境准备 软件安装 由于该系统是英文系统,有可能对中文字符支持不友好,因此要安装中文的UTF-8字符集。同时因为Hadoop是Java的杰出产物因此...

煎鱼教教主
2017/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部