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进行排序