初始大数据
什么是大数据?
大数据是一个概念也是一门技术,是在以Hadoop为代表的大数据平台框架上进行各种数据分析的技术。
大数据包括了以Hadoop和Spark为代表的基础大数据框架。
还包括实时数据处理、离线数据处理;数据分析,数据挖掘和用机器算法进行预测分析等技术。
学习基础要求
会 Linux 常用命令
有一定的 Python 或者 Java 编程基础
对 Hadoop 有一定的了解,可以搭建自己的测试环境
Hadoop 的功能和优势
hadoop 是开源的、分布式存储、分布式计算平台,可以用来搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务
Hadoop包括两个核心组成:
- HDFS:分布式文件系统,存储海量的数据
- MapReduce:并行处理框架,实现任务分解和调度
相关开源工具:
- hbase 放弃了事务的特性,追求更高的扩展,提供了数据的随机读写和实时访问,实现对表数据的读写功能
- zookeeper 监控 hadoop 每个节点的状态,管理集群配置,维护节点间数据的一致性。
- hive 将简单的 sql 语句转化为 hadoop 任务,降低使用 hadoop 的门槛
Hadoop 安装
1. 准备Linux环境
2. 安装JDK Java编写
3. 配置Hadoop
hadoop安装及配置:
- 下载hdoop安装包并进行解压
- 配置hdoop-env.sh文件,目的是配置jdk,并在profile配置haddoop的安装位置
export JAVA_HOME=安装好的JDK(配置的JAVA_HOME)
export HADOOP_HOME=/opt/hadoop-1.2.1
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$PATH
-
配置core-site.xml文件:hdoop的核心文件,里面有关于hdoop的节点端口与主机端口
<configuration> <propery> <name>hadoop.tmp.dir</name> <value>/hadoop</value> <!-- 工作目录 --> </propery> <name>dfs.name.dir</name> <value>/hadoop/name</value> <!-- 所有元数据的目录 --> <propery> <name>fs.default.name</name> <value>hdfs://imooc:9000</value> <!-- 表示文件系统如何访问 namenode --> </propery> </configuration>
-
配置hdfs-site.xml文件:hadoop的文件存储的基本信息与目录
<property> <name>dfs.data.dir</name> <value>/hadoop/data</value> <!-- 文件系统的数据存放路径 --> </property>
-
配置mapred-site.xml文件:hadoop的计算节点的端口号
<property> <name>mapred.job.tracker</name> <value>imooc:9001</value> <!-- 配置任务调度器如何访问 --> </property>
-
格式化:
hadoop namenode -format
- 启动
hadoop:start-all.sh
- 查看端口:
jps
,可以看到五大守护进程说明正确 - 停止
hadoop:stop-all.sh
Hadoop 核心 HDFS
HDFS 基本概念
- 块 Block 文件分块存储 默认64MB 逻辑单元
- NameNode (管理节点,存放文件元数据)
- 文件与数据库的映射表
- 数据库与数据节点的映射表
- DataNode (工作节点,存放数据块)
数据管理策略
- hdfs是采用master-slave的模式关管理文件,即一个master(namenade:保存datanode的一些基本信息和元数据)和多个slave(datanode:真正的存贮单元,里面存储了真实数据)
- hdfs默认保存三份文件,有两份保存在同一台机器上,另外一份(备份文件)保存到另外一台机器上,确保当一台机器挂了时能保存数据的存在
- namenade也有一个备用节点:Secondary NameNode,当namenode挂了时secondaryNameNode就变为nameNode的角色进行管理数据
- datandoe会采用心跳的方式时不时的想namenode报告自己的基本信息,比如网络是否正常,运行是否正确常
HDFS 中文件读写的流程
客户端发出读写请求,namenode根据元数据返回给客户端,下载需要的block并组装
HDFS 读取文件的流程:
- 客户端向namenode发起独立请求,把文件名,路径告诉namenode;
- namenode查询元数据,并把数据库返回客户端;
- 此时客户端就明白文件包含哪些块,这些块在哪些datanode中可以找到;
HDFS 写入文件的流程:
- 客户端将文件拆分成块
- 客户端通知NameNode,NameNode返回可用的DataNode节点地址
- 客户端根据返回的DataNode将数据块写入到可用的DataNode中
- 因为数据块要有三份,所以会通过一个复制管道将每个数据块复制出另外两份并保存
- 更新元数据NameNode
HDFS 特点
- 数据冗余,硬件容错(一式三份来保证)
- 流式数据访问:写一次,读多次,一旦写入无法修改,只能通过写入到新的块删除旧的块进行处理
- 存储大文件(特适合,因为小文件多,势必加重NameNode的负担)
优点:存储块大,吞吐量高,为存储大文件设计;适合一次写入多次读取,顺序读写
缺点:延迟高,不适合交互式访问,不支持多用户并发写相同文件
HDFS 使用
它提供了 shell 接口,可以进行命令行操作,常用Hadoop的shell命令:
#hadoop fs -format #格式化操作
#hadoop fs -ls / #展示文件
#hadoop fs -cat input/hsdf-site.xml #查看Hadoop里面的指定文件
#hadoop fs -mkdir input #未指明目录,表示在Hadoop的文件系统下的默认目录/user/root下新建
#hadoop fs -put hdsf-site.xml input/ #上传文件到Hadoop
#hadoop fs -get hdfs-site.xml hdfs-site2.xml #从Hadoop下载文件
#hadoop dfsadmin -report #查看HADF使用情况(所有信息)
Hadoop 核心 MapReduce
MapReduce 的原理
Mapreduce原理:分而治之,一个大任务分成多个子任务(map),并行执行之后,合并结果(reduce)。eg:做统计的时候,把统计的文件拆分,然后分别统计每一个数据出现的次数,然后合并拆分项,就可以统计每一个数据出现的总次数。
在正式执行Map前,需要将输入数据进行”分片”。所谓分片,就是将输入数据切分为大小相等的数据块,每一块作为单个Map Worker的输入被处理,以便于多个Map Worker同时工作。
分片完毕后,多个Map Worker就可以同时工作了。每个Map
Worker在读入各自的数据后,进行计算处理,最终输出给Reduce。Map Worker在输出数据时,需要为每一条输出数据指定一个Key。这个Key值决定了这条数据将会被发送给哪一个Reduce Worker。Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据。
在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻。如果用户指定了”合并操作”(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合。Combiner的逻辑可以由用户自定义实现。这部分的处理通常也叫做”洗牌”(Shuffle)。
接下来进入Reduce阶段。相同的Key的数据会到达同一个Reduce
Worker。同一个Reduce Worker会接收来自多个Map Worker的数据。每个Reduce Worker会对Key相同的多个数据进行Reduce操作。最后,一个Key的多条数据经过Reduce的作用后,将变成了一个值。
MapReduce 的运行流程
Job & Task:
一个 Job
(任务、作业) 被切分为多个 Task
,Task 又分为 MapTask
和 ReduceTask
mapReduce 作业执行过程
JobTracker :将一个Job拆分成多个Map和Reduce任务;分配Map和Reduce任务
- 作业调度
- 分配任务、监控任务
- 监控 TaskTracker 的状态
TaskTracker :Map任务分发给下面的TaskTracker做实际 的任务;TaskTracker与DataNode保持对应关系
- 执行任务
- 向
JobTracker
汇报任务状态
mapReduce 容错机制
- 重复测试:如果一个TaskTracker节点在测试过程中失败,mapreduce会重新执行该任务,如果执行四次后仍失败,就停止执行该任务
- 推测测试:如果一个taskTracker执行得很慢,mapReduce就会重新开启一个taskTracker节点去计算相同的该任务,原来那个继续执行,重新开启的taskTracker如果先执行完,则mapReduce取到该结果后就会停止原来那个很慢的taskTracker节点