大数据是一个术语用来描述一个拥有高速,复杂,和复杂数据;但是需要先进的技术和技能能够获得,存储,描述,管理和分析信息
QPS:query per second每秒响应
大数据四大特点:
容量大(Volume);速度快(Velocity);数据多样性(Variety);价值密度比较低(Value)
数据多种格式(Variety):
结构化数据:SQL,主要是关系型数据库,表格形式的数据,CSV文件也属于
半结构化的数据:xml,json,数据格式不加要求
非结构化数据:网上的文件,Web数据,email
结构化数据包含的数据一般比非结构化数据包含的数据量大
大数据两大核心技术(通过Hadoop实现):
分布式计算 --> Map/Reduce YARN;分布式存储 --> HDFS
统计分析,爬虫
大数据两大特性:
基于时间序列(Time-based);可追溯的(Immutable)
分布式计算:
传统的分布式计算:
计算已被CPU限制,相对较小的数据量,对数据执行大量复杂的处理
几十年来,主要的推动力是提高单机的计算能力;通常在计算时,数据被复制到计算节点
浏览器访问url:
URL --> IP地址
主机IP:50070
Windows中hosts加入IP地址+名称
才能使用名称:50070来访问
新的分布式计算:Hadoop
把数据量很大的数据块,切成小块,每一块放到不同的机器上
- 分布式存储:大数据不是复制来处理的
- 将计算移到数据
- 低成本的大型(硬件)商用机器集群
- 允许并行计算的算法(软件)
Hadoop:
Hadoop是一个开源软件框架,用于存储数据并在商品硬件集群上运行应用程序。它为任何类型的数据提供了巨大的存储空间、强大的处理能力以及处理几乎无限并发任务或作业的能力。
- 框架解决数据密集型过程
- 大规模设计
- 对于大的工作来说非常快
- 各种加工发动机,如Tez、Spark和Storm
- 专为硬件和软件故障设计
Hadoop的优点:
数据处理的时候互不干涉,Hadoop可伸缩性很好,可以进行容错处理,哪里死掉了从哪里开始
|
关系型数据库 |
Hadoop |
模式 |
写的时候需要格式 |
读的时候需要格式 |
速度 |
读的时候很快 |
写的时候很快 |
管理 |
标准的,有结构的 |
结构很松 |
处理 |
有限的或者没有数据处理 |
与数据结合的处理 |
数据类型 |
结构化的 |
结构化的,半结构化的,非结构化的 |
适用方面 |
交互式联机分析技术 复杂的ACID事务 操作数据存储 |
数据发现 处理非结构化数据 大规模存储/处理 |
Hadoop不是用来替代关系数据库的。Hadoop用于存储大数据,这种数据通常是由于大小或成本限制而无法存储在数据库中的数据类型。 |
Hadoop的结构:
1. 通用Hadoop:支持所有其他模块的通用实用程序
2. Hadoop分布式文件系统(HDFS)【核心功能模块】:
文件系统,它跨越Hadoop集群中用于数据存储的所有节点
链接本地节点上的文件系统,使其成为一个大文件系统
3. Hadoop MapReduce【核心功能模块】:Hadoop 1.x以来可用的核心计算框架
4. Hadoop YARN:
Hadoop 2.x上新的分布式处理框架
解决了MR 1.0中的多个限制
5. Hadoop生态系统
开放的Apache项目
Zookeeper:集群管理软件,在不同的机器之间协调,沟通,交互,通信
Flume:把不同数据源里的数据送到不同的地方
Sqoop:在数据采集的时候,在关系型数据库和Hadoop之间进行数据的转换,是双向的,不需要转码。
HBase:是NoSQL数据数据库系统中的一种,数据处理非常优秀,是NoSQL数据库系统的鼻祖
MapReduce1.0:就是一个数据导入,分布式计算的
Mahout:机器学习库
Pig:早期的脚本语言
Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表
Yarn:是资源管理器
Tez:用来提升hive查询速度的
Spark:一个全面、统一的框架用于管理各种有着不同性质的数据集和数据源的大数据处理的需求
Presto:是一个接口处理数据,对SQL的支持比较强
Impala:和hive对应的一个产品
HCatalog:元数据的存储管理中心
Ambari:基于web的集群管理平台,可以看到平台上的工具和服务,监控管理工具
HDP是免费的,但是只能配置一个集群;CDH收费
Zookeeper:
Zookeeper是一种分布式协调服务,由集群(一组节点)使用,用于协调自身和应用程序,并以健壮的同步维护共享数据。
Zookeeper本身就是一个为分布式应用提供服务的分布式应用。
在分布式环境中协调和管理服务和应用程序。
Zookeeper提供的一般服务:
命名服务——按名称标识集群中的节点
配置管理——集群的最新配置信息
集群管理——集群中节点的加入/退出以及节点的实时状态
领导选择——选择一个节点作为集群中协调的领袖
锁定和同步服务——在修改数据时锁定数据
高度可靠的数据注册表——当一个或几个节点停止时,数据和服务的可用性。
HCatalog(就是一个元数据):
HCatalog向数据处理工具(pig,Hive,MapReduce)方便地从Hadoop集群中读写数据
共享元数据存储还允许跨工具的用户更容易地共享数据(基于RDB的)
可以通过使用REST的WebHCat访问HCatalog API
HCatalog支持来自RCFile,Parquet,ORC和的数据的关系视图存储在HDFS中的SequenceFile
Hadoop(HDFS)的作用:
主节点(NN):
管理文件系统的名称空间/元数据/文件块(内存要足够多)
在一台机器上运行到多台机器上
第二名称节点(SNN):【主节点的助手】
元数据发生变化就会把变化写出来,并不是把所有的元数据都写一遍,第二名称节点就是重新写一个镜像
执行空间管理工作这样主节点就不需要工作了
需要和主节点硬件相同的环境
并不是高可用性,也并不是主节点的备用
数据节点(DN):
存储和检索数据块
向主节点汇报
在很多机器上使用
Hadoop(HDFS)的组成部分:
客户端:
用户/App界面与集群、DN交互,一般使用EdgeNode
命名空间:
文件/目录——与普通文件系统分割成块相同
文件块——系统默认值64M(V1);128M(V2)
小文件问题——如果文件很小,又有很多小文件,就会使Hadoop性能下降,文件越小打开时需要的资源越多,需要的文件块保存在NN中的元数据
块储存器——默认3个,并为新添加的节点重新平衡
第一个副本在本地机架上。第二个在本地机架上但不同的节点。第三个在不同的机架上
Hadoop v1(MapReduce)的引擎:
工作追踪器(JT):
在主节点工作
接受客户工作请求
给任务追踪器TT提交工作
主节点的对应
任务追踪器(TT):
接受来自JT的任务
执行map、shuffle、reduce等操作
寻找可用的工作槽
把心跳发送到JT
数据节点的对应
Hadoop v2.0的 YARN:
MapReduce的限制:
单一的计算引擎—MapReduce
缺乏系统资源意识
JT的开销太大
YARN的改变:
支持更多计算引擎
兼容MapReduce
将JT的资源管理拆分为ResourceManager
将JT的作业调度和监控分配给ApplicationMaster
NodeManager是TT来执行和监控容器的替代选择
Hadoop v2.0的 YARN的架构:
Active NameNode是当前工作的节点,standby NameNode是备份的节点,Secondary NameNode是第二名称节点,Yarn是当前的资源管理器,Data Node中有容器和任务管理器,Node Manager节点管理器和任务管理器沟通
Hadoop的高可用性:
在Hadoop v1中,主节点NN有单点故障(SPOF)问题的解决方法:
1. 通过在多个分隔的namenode上对文件系统命名空间进行分区,从而实现HDFS联合
DNs注册所有的NNs,并发送块位置信息和心跳到所有的NNs
2. 活动和备用神经网络共享编辑日志的存储空间
HDFS读取文件:
Client通过HDFS拿数据数据是先从NameNode中把块的位置信息拿到,然后再并行从每个DataNode数据块中读取数据
HDFS写文件:
先创建文件,在NameNode中找到应该写入的节点,FDS OutputDtream开始写数据并把数据分块,分一个块就写一部分,只要有块就开始写,分块和写是并行的,并且在写块的时候也在写块的备份,只有写完并且备份完之后才算写文件结束
读写示例:
public class HDFSFile {
final static int BUFFER_SIZE = 2048;
//hdfs://192.168.80.107:9000
static String hdfsUrl ="hdfs://192.168.80.107:9000";
static String localFile = "D:\\a.log";
static FileSystem fs;
static Path hdfsFile;
public static void main(String[] args) {
//创建配置
Configuration cfg =new Configuration();
//设置默认操作的HDFS文件系统
cfg.set("fs.defaultFS", hdfsUrl);
//指定要操作的文件路径
hdfsFile = new Path("/a.txt");
try {
//创建文件系统操作对象
fs = FileSystem.get(cfg);
//测试读取
read();
}catch(Exception e) {
e.printStackTrace();
}
}
//读取HDFS文件系统里面的文件
static void read() throws Exception{
boolean exs = fs.exists(hdfsFile);
if(exs) {
//打开HDFS文件系统里的文件,获取输入流
FSDataInputStream fsdiStream = fs.open(hdfsFile);
//输出到本地文件
FileOutputStream foStream = new FileOutputStream(localFile);
//分割成每个都为2048的小块
byte[] buffer = new byte[BUFFER_SIZE];
//读出文件以BUFFER_SIZE为标准放进buffer里
int count = fsdiStream.read(buffer, 0, BUFFER_SIZE);
while (count>0) {
//读取特定长度
foStream.write(buffer, 0, count);
//检查还可以读取几次
count=fsdiStream.read(buffer, 0, BUFFER_SIZE);
}
foStream.close();
fsdiStream.close();
}else {
//HDFS文件不存在
}
fs.close();
}
static void write() throws Exception{
//判断文件是否存在
boolean exs = fs.exists(hdfsFile);
if(!exs) {
//获取输出流
FSDataOutputStream fsdoStream = fs.create(hdfsFile);
FileInputStream fiStream = new FileInputStream(localFile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = fiStream.read(buffer, 0, BUFFER_SIZE);
while ( count > 0 ) {
fsdoStream.write( buffer, 0, count );
count = fiStream.read(buffer, 0, BUFFER_SIZE);
}
fiStream.close();
fsdoStream.close();
fs.close();
}else {
//文件已经存在
}
}
}
HDFS命令行(CLI):
用户通常通过HDFS 的渠道hdfs dfs或hadoop fs命令访问HDFS
HDFS常用命令:
hdfs dfs -mkdir -p /user/data |
在hdfs中创建路径 |
hdfs dfs -ls /user/data |
显示路径中的文件清单 |
hdfs dfs -put log.txt /user/data |
把log.txt放进/user/data中 |
hdfs dfs -cat /user/data/log.txt | head |
查看/user/data/log.txt中头几行的信息 |
hdfs dfs -get /user/data/log.txt |
从hdfs中取出文件到当地 |
hdfs dfs -rm /user/data/log.txt |
删除文件,放到一个地方 |
hdfs dfs -rm –skipTrash /user/data/log.txt |
直接删除文件 |
hdfs dfs -rm -r -skipTrash /folder_name |
删除文件夹 |
hdfs dfs -test /user/data/log.txt |
判断文件存在或者不存在 |
echo $? |
查看存不存在 |
hdfs fsck / |
查看集群的详细信息 |
hdfs dfs -df -h |
查看集群的硬盘空间情况 |
hdfs dfs -du / |
查看每一个目录的硬盘使用情况 |
hdfs dfs –copyFromLocal t.txt hdfs://localhost/user/data |
从本地复制文件 |
hdfs dfs -copyToLocal /user/data/t.txt tt.txt |
把文件复制到本地 |
hdfs dfsadmin -report |
查看当前节点的使用情况 |
分配数据存储;将计算移到数据源头的一侧
HDFS=Hadoop;distributed;file system
jps查看java进程