Hadoop是一个支持海量数据的分布式存储和分布式计算的平台

    包含:

        HDFS

        YARN

        MapReduce

    分布式管理系统(HDFS)

        主要就是把数据存放在多态服务器上

        是MapReduce的基础

    文件切分

        文件存放在一个磁盘上效率是最低的

            读取效率低

            文件特别大会超出单击的存储范围

        文件磁盘上以字节数组的方式存储

        数组可以进行拆分和组装 源文件不会受到影响

        还可以将切分后的数据按照数组的偏移量拼接到一起


        数据存储的原理:

            不管文件的大小,所有的文件都是由字节数组构成

            如果我们要切分文件,就是将一个字节数组分成多份

            我们将切分后的数据拼接到一起,数据还可以继续使用

            我们需要根据数据的偏移量将他们重新拼接到一起

 

前期准备
    准备好三台虚拟机 master node1 node2
    同步时间:
    调整时区:
    检查java环境是否正常:java-version
    修改主机名:vim /etc/hostname
    关闭防火墙:
    配置网络:
    免密登陆
        ssh-keygen -t rsa 三次回车
        ssh-copy-id master
        ssh-copy-id node1
        ssh-copy-id node2
    配置好映射文件:
        vim /etc/hosts
        192.168.100.100:master
        192.168.100.110:node1
        192.168.100.120:node2

搭建Hadoop环境
    1、上传Hadoop安装包到、usr/local/soft/解压
    2、配置系统环境变量
        export HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
        export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin
        加载环境变量使其生效 source /etc/profile
    3、修改hadoop配置文件(可以根据实际的需求来配置自定义文件)
        在/usr/local/soft/hadoop-2.7.6/etc/hadoop目录下存放着与Hadoop相关的配置文件
        1)hadoop-env.sh
            export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
        2)core-site.xml
        3)hdfs-site.xml
        4)mapared-site.xml
        5)yarn-site.xml
        6)slaves

    4、将配置好的hadoop分发到node1 node2节点上
        scp -r hadoop-2.7.6/ node1:`pwd`
        scp -r hadoop-2.7.6/ node2:`pwd`
    5、格式化NameNode
        hdfs namenode -format
    6、启动hadoop集群检查各个节点是否正确
        start-all.sh
        master:namenode ResourceManager secondarynamenode
        node1,node2:datanode nodemanager

 Hadoop序列化的问题

序列化
    把内存中的对象转化为字节序列(或者其他传输协议)以便于存储到磁盘(持久化)和网络传输
反序列化
    将收到的字符序列或者是次磁盘的持久化数据 转化为内存中的对象

特点:
    紧凑、快速、可扩展、互操作

自定义bean对象实现序列化接口
    在Hadoop框架内传递一个bean对象 那么该对象就需要实现序列化接口(Writable)
    步骤:
        1、实现Writable接口
        2、反序列化的时候需要调用空参构造函数,所以必须有空参构造方法
            public FlowBean(){
                super();
            }
        3、重写序列化方法
            public void write(DataOutPut out) throw Exception{
                out.writexxx(xxx);
                out.writexxx(xxx);
                out.writexxx(xxx);
            }
        4、重写反序列化方法
         public void readFields(DataInput in) throw Exception{
            xxx=in.readxxx();
            xxx=in.readxxx();
            xxx=in.readxxx();
         }
         注意反序列化的顺序和和序列化顺序要一致
        5、要把结果显示在文件中,需要重写toString方法 可用"\t"分开
        6、如果想要把自定义的bean放入key中传输,则需要实现Comparable接口,因为MapReduce框架中的Shuffle过程要求对key进行排序