Hdoop的HDFS

一.hdfs是什么

概念说明:

Hadoop Distributed File System 是分布式文件系统

特点特征:

高容错和高可用性:提供了文本的存储副本策略,可以实现错误的自检并且快速修复

流式数据访问:采用流式读取,做批量处理,提高吞吐量

弹性存储,支持大规模数据集 : 可以存储大量的数据

简单一致性模型: 实现了一次写,多次读的操作,也是提高了吞吐量

移动计算而非移动数据

协议和接口多样性

多样的数据管理功能

应用场景:

        各大电信运营商

        中大型互联网公司,如BAT、京东、乐视、美团等

        金融银行保险类公司

        各大云平台底层存储平台

        其他本地系统无法承载存储能力的应用

代码实现:

        跟shell操作类似

        经典的问题:hdfs读取流文件

public class HdfsFileOperatorUtil {
   
    /** 从HDFS上读取文件 */
    public static String readFromFile(String srcFile) throws Exception {
        //文件路径的空判断
        if (srcFile == null || srcFile.trim().length() == 0) {
            throw new Exception("所要读取的源文件" + srcFile + ",不存在,请检查!");
        }
        //将文件内容转换成字节数组
        byte[] byteArray = readFromFileToByteArray(srcFile);
        if (byteArray == null || byteArray.length == 0) {
            return null;
        }
        //将utf-8编码的字节数组通过utf-8再进行解码
        return new String(byteArray, "utf-8");
    }
    /**
     * 将指定的文件路径从hdfs读取并转换为byte array.
     * @param srcFile
     * @return
     */
      // 加载配置文件到内存对象
    static Configuration hadoopConf = new Configuration();
    public static byte[] readFromFileToByteArray(String srcFile)
            throws Exception {
        if (srcFile == null || srcFile.trim().length() == 0) {
            throw new Exception("所要读取的源文件" + srcFile + ",不存在,请检查!");
        }
        //获取hadoopConf对应的hdfs集群的对象引用
        FileSystem fs = FileSystem.get(hadoopConf);
        //将给定的srcFile构建成一个hdfs的路径对象Path
        Path hdfsPath=new Path(srcFile);
        FSDataInputStream hdfsInStream = fs.open(hdfsPath);
        
        //初始化一块字节数组缓冲区,大小为65536。缓存每次从流中读取出来的字节数组
        byte[] byteArray = new byte[65536];
        //初始化字节数输出流, 存放最后的所有字节数组
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // 实际读过来多少
        int readLen = 0;
        //只要还有流数据能读出来,就一直读下去
        while ((readLen = hdfsInStream.read(byteArray)) > 0) {
            bos.write(byteArray,0,readLen);
            //byteArray = new byte[65536];
        }
        //读取完成,将hdfs输入流关闭
        hdfsInStream.close();
        //将之前写到字节输出流中的字节,转换成一个整体的字节数组
        byte[] resultByteArray=bos.toByteArray();
       bos.close();
       return resultByteArray;
    }
    
    public static void main(String[] args) throws Exception {
        //定义要读入的hdfs的文件路径
        String hdfsFilePath = "/tmp/tianliangedu/input.txt";
        //将文件从hdfs读取下来,转化成字符串
        String result = readFromFile(hdfsFilePath);
        //根据题意,将字符串通过命令行输出
        System.out.println(result);
    }
}

二.hdfs的架构设计:(主从式 master/slave 的体系结构)

角色名称:

        该架构是由client ,NameNode,DataNode组成

角色作用/联系:

        client:面向client编程,与NameNode,DataNode进行交互,实现了解耦

        NameNode:管理文件的元数据,记录文件如何被分成为数据块,并且他们存储在哪些节点上

DataNode:存储实际数据的地方,也是工作节点,根据NameNode发送的指令,进行数据块的读写和检索,并通过心跳机制向NameNode,汇报自己的工作情况,确定是否存活

三.mave仓库的分类

1.本地仓库

        默认,自定义

2.中央仓库

3.第三方独立仓库源: 如阿里云

        scope 本意是范围,视野

决定jar包在java项目中的声明周期

四.打包插件

<plugin>

    <artifactId>maven-compiler-plugin</artifactId>

    <version>2.3.2</version>

    <configuration>

        <source>1.8</source>

        <target>1.8</target>

        <encoding>UTF-8</encoding>

    </configuration>

</plugin>

五.maven依赖的分类

应用依赖:默认走镜像,仓库源

系统依赖:

        默认走中央仓库

        修改系统以来的配置,使自定义走仓库源

六.经典面试基础题

        把文件路径的内容读取成字符串

第一种方法:

1.先给一个路径 String filePath="";

2.创一个文件的对象 File file=new File(filePath);

3.把文件以流的形式读出来 InputStream is = new FileInPutStream(file);

4.转换成字符流 Reader reader= new InPutStreamReader(is,"utf-8");

5. 把字符流准换成缓冲流 BufferReader br= new BufferedReader(reader);

6.给一个默认行开始读

String tempLine=null;

while((tempLine=br.readLine())!=null){

System.out.println(tempLine);

}

7.关闭流 ; 规则 先开的后关 后开的先关

第二种方法:以字节数组缓存的方式读取

以字节数组缓存的方式读取
	File file=new File(filePath);
	InputStream is = new FileInPutStream(file);
	//定义内存的缓存数组
	byte[] byteArray=new byte[1024];
	//定义一个获取从is中读取的实际字节的大小
        int realLength=0;
        //定义一个缓存所有字节的大内存块
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        //循环读取文件的字节数组,并写入到大内存块中
        while((realLength=is.read(byteArry))!=-1){
            baos.write(byteArry,0,realLength);
        }
        //关闭字节流
        is.close();
        //将大内存块的流转换成一个大的字节数组
        byte[] byteArrayTotal=baos.toByteArray();
        //关掉流
        baos.close();
        //将字节数组转换成字符串
        String content=new String(byteArrayTotal,"utf-8");
        System.out.println(content); 

java当中的输入流inputstream和输出流outputstream 的参考对象是谁: 内存

6.1如何阅读java文件

        1.先读main函数

        2.其次找构造函数

        3.最次就是从上往下

6.2maven之package和install有什么区别

        package:仅仅是将源码和依赖进行统一打包

        install:将项目的本身打成的jar包会拷贝到Maven本地仓库一份

6.3jar包的分类

        1.独立运行的jar包-runnable jar

       2.被依赖的jar包

七.经典的问题

7.1Hdfs为何要将文件分成block块存储?:

        减少系统的io读取的寻址时间,方便更高效的流式读取,提高吞吐量

7.2HDFS block的默认大小? :

        在hdfs.sist.xml中的dfs.blocksize为设置block的大小的参数,版本不同,默认值不同

7.3HDFS block块的大小是否可以改变:

        可以修改,修改对以前的文件不起作用,也对上传 文件临时修改啊,指定-D dfs.blocksize

7.4一个block块文件是否可以存多个数据:

        不可以 一个block最多只存在一个文件的数据,不会跨文件存储

7.5如果一个文件的大小,小于一个blocksize,那么它实际占用多大空间?

文件有多大就占有多大

7.6HDFS block越大越好?还是越小越好?

         适中就好 ,越大分块越少 namenode压力越小,并行的处理能力降低

        越小的话分块越多,namenode压力越大,寻址时间就,不利于吞吐量.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值