大数据是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。
4V特征
固有特征
传统分布式计算 | 新的分布式计算 - Hadoop | |
---|---|---|
计算方式 | 将数据复制到计算节点 | 在不同数据节点并行计算 |
可处理数据量 | 小数据量 | 大数据量 |
CPU性能限制 | 受CPU限制较大 | 受单台设备限制小 |
提升计算能力 | 提升单台机器计算能力 | 扩展低成本服务器集群 |
Hadoop是一个开源分布式系统架构
分布式文件系统HDFS——解决大数据存储
分布式计算框架MapReduce——解决大数据计算
分布式资源管理系统YARN
处理海量数据的架构首选
非常快得完成大数据计算任务
已发展成为一个Hadoop生态圈
为什么使用?
高扩展性,可伸缩
高可靠性
多副本机制,容错高
低成本
无共享架构
灵活,可存储任意类型数据
开源,社区活跃
RDBMS | Hadoop | |
---|---|---|
格式 | 写数据时要求 | 读数据时要求 |
速度 | 读数据速度快 | 写数据速度快 |
数据监管 | 标准结构化 | 任意结构数据 |
数据处理 | 有限的处理能力 | 强大的处理能力 |
数据类型 | 结构化数据 | 结构化、半结构化、非结构化 |
应用场景 | 交互式OLAP分析 ACID事务处理 企业业务系统 | 处理非结构化数据 海量数据存储计算 |
强调:支持sql:Impala、presto、hive、sqoop 玩大数据要sql过关,java功底也要强
重要的hdfs、hive、spark、Oozie、Hbase、sqoop、flume
是一个分布式应用程序协调服务
解决分布式集群中应用系统的一致性问题
提供的功能
配置管理、命名服务、分布式同步、队列管理、集群管理等
特性:
全局数据一致
可靠性、顺序性、实时性
数据更新原子性
HDFS(Hadoop Distributed File System)
分布式文件系统,解决分布式存储
MapReduce
分布式计算框架
YARN
分布式资源管理系统
在Hadoop 2.x中引入
Common
支持所有其他模块的公共工具程序
HDFS优点
支持处理超大文件
可运行在廉价机器上
高容错性
流式文件写入
HDFS缺点
不适合低延时数据访问场景
不适合小文件存取场景
不适合并发写入,文件随机修改场景
基本格式
hdfs dfs -cmd
hadoop fs -cmd(已过时)
命令和Linux相似
-ls
-mkdir
-put
-rm
-help
命令 | 描述 |
---|---|
hdfs dfsadmin -report | 返回集群的状态信息 |
hdfs dfsadmin -safemode enter/leave | 进入和离开安全模式 |
hdfs dfsadmin -saveNamespace | 保存集群的名字空间 |
hdfs dfsadmin -rollEdits | 回滚编辑日志 |
hdfs dfsadmin -refreshNodes | 刷新节点 |
hdfs dfsadmin -getDatanodeInfo node1:8010 | 获取数据节点信息 |
hdfs dfsadmin -setQuota 10 /hdfs | 设置文件目录配额 |
Client:客户端
NameNode (NN):元数据节点—大脑
管理文件系统的Namespace/元数据
一个HDFS集群只有一个Active的NN(可以有standby的NN备用(与active的NN同步备份),万一Active的NN挂掉,备用NN顶替)
DataNode (DN):数据节点—心跳向NN表示还在运行
数据存储节点,保存和检索Block
数据计算
一个集群可以有多个数据节点
Secondary NameNode (SNN):从元数据节点(助手)
合并NameNode的edit logs到fsimage文件中
辅助NN将内存中元数据信息持久化
Block:数据块
HDFS最基本的存储单元
默认块大小:128M(2.x)
副本机制
作用:避免数据丢失
副本数默认为3
存放机制:
一个在本地机架节点
一个在同一个机架不同节点
一个在不同机架的节点
在1.x版本中
存在Namenode单点问题
在2.x版本中
解决:HDFS Federation方式,共享DN资源
Active Namenode
对外提供服务
Standby Namenode
Active故障时可切换为Active
HDFS支持以不同格式存储所有类型的文件
文本、二进制
未压缩、压缩
为了最佳的Map-Reduce处理,文件需可分割
SequenceFile
Avro File
RCFile&ORCFile
Parquet File
向hdfs写入本地文件
public class TestHDFS {
public static void writeToHDFS(String hdfsFile,String hdfsURL,String fileName) throws IOException {
Configuration cfg = new Configuration();
cfg.set("fs.defaultFS",hdfsURL);
FileSystem fs = FileSystem.get(cfg);
if (fs.exists(new Path(hdfsFile))){
FSDataOutputStream fsdos = fs.create(new Path(hdfsFile));
FileInputStream fis = new FileInputStream(fileName);
byte[] bytes = new byte[2048];
//首次读
int count = fis.read(bytes,0,2048);
while(count>0){
fsdos.write(bytes,0,count);
count = fis.read(bytes,0,2048);
}
fis.close();
fsdos.close();
fs.close();
}
}
public static void main(String[] args) throws IOException {
writeToHDFS(args[0],args[1],args[2]);
}
}
本地文件写hdfs
public class TestLOCAL {
public static void writeToLOCAL(String hdfsFile,String hdfsURL,String fileName) throws IOException {
Configuration cfg = new Configuration();
cfg.set("fs.defaultFS",hdfsURL);
FileSystem fs = FileSystem.get(cfg);
if (fs.exists(new Path(hdfsFile))){
FSDataInputStream fsdos = fs.open(new Path(hdfsFile));
FileOutputStream fis = new FileOutputStream(fileName);
byte[] bytes = new byte[2048];
//首次读
int count = fsdos.read(bytes,0,2048);
while(count>0){
fis.write(bytes,0,count);
count = fsdos.read(bytes,0,2048);
}
fis.close();
fsdos.close();
fs.close();
}
}
public static void main(String[] args) throws IOException {
writeToLOCAL(args[0],args[1],args[2]);
}
}