1.大数据的概念与特点
“3V” Volume 海量 Variety 多样 Velocity 高速 (value 低密度、价值高)
2.大数据两个核心技术:(分布式)存储和(分布式)计算
分布式系统意为其组件分布在不同的节点上,通过一定方式的沟通和相互协作,完成通过的目标。
分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
分布式存储技术是将数据分散地存储于多台独立的机器设备上
3.大数据的基本
- 两个核心:数据的存储以及数据的计算
4.分布式 存储:
世界上第一款真正意义上的大数据分布式存储系统: Google File System
根据分布式思想,当文件数据的体量超过某一台服务器所能存储的最大容量时,如果希望继续存储,则首先要根据整体规模的大小以及单台服务器所能存储的最大容量,计算出存储该文件数据所需要的服务器总数,总而实现服务器节点数量的规划;
其次,将这些规划好的服务器以网络的形式组织起来,形成一个集群;
然后,在这个集群上部署“分布式文件系统”,统一管理集群中的各个服务器节点的存储资源;
接着,将这个文件切分成很多个“块block”,即分布式文件系统存储文件数据的基本单位;
最后,将这些数据块平均分配到集群的各个服务器节点进行存储,并记录每个块的存放信息、编号以及位置等信息;
分布式文件系统需要提供一个统一的操作入口和出口,当用户访问文件数据的时候,分布式文件系统就会临时拼装来自不同节点的块数据,返回给用户。
5.分布式计算
考虑将文件数据分布式存储在多台服务器上之后,如何分布式的在文件系统上进行数据的并行计算处理:将一个整体数据处理任务Job分解成若干个小任务,提高数据处理效率
考虑:
i. 负载均衡:如何将小任务尽量均分到各个节点上
ii. 计算过程中各个节点的资源如何统一分配和回收
iii. 计算过程产生的中间结果如何及时统计汇总
iv. 集群计算完成之后的最终结果如何统一输出
6.网卡命令
启动/关闭网卡 ifup/ifdown eth0
查看ip: ifconfig/ip addr
/etc/sysconfig/network-scripts/ifcfg-eth0 :指定的是本机eth0的ip地址、mac、子网等信息
/etc/profile: 它是可用于指定环境变量的文件名
错误:它是可用于指定环境变量的文件名、它记录着当前系统的名字、它是一个可运行的脚本文件
网卡自动启动:ONBOOT=yes
网络重启:service network restart (start/stop)
7.防火墙相关命令
查看防火墙状态:/etc/init.d/iptables status
即时生效,重启后复原: service iptables start/stop
永久性生效,重启后不会复原: chkconfig iptables on/off
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld.service
8.Linux用户
“\” 根目录
“\root” Linux中root用户的家目录
“\home\cailei” Linux中普通用户的家目录
9.路径
当前路径 \home\software\fakehadoop\bin
要想进入 \home\software\fakehadoop\sbin目录下用相对路径怎么操作
使用绝对路径进入到/etc/sysconfig/network-scripts目录下,使用相对路径的形式回到/etc目录下
10.常见目录
普通用户可执行文件: /bin
系统管理员可执行文件: /sbin
配置文件: /etc a. 也有可能: config 、 conf
临时文件: /tmp a. 默认存储服务的执行数据、日志数据,通常不使用
内核和启动文件: /boot
服务器数据: /var、 /srv
jar资源共享库: /lib
11.Linux常见命令
创建文件夹:mkdir
修改文件所有者:chown
修改文件权限:chmod
修改文件时间戳:touch
重命名:mv
12.vim编辑器
三种模式:一般模式、编辑模式、命令模式
三种模式之间的转换关系:一般模式才能转换到编辑或是命令,编辑和命令是不能相互转换的
13.免密登录
Ssh-keygen
Ssh-copy-id remoteuser@remoteip
默认保存在/root/.ssh目录下
id_rsa.pub:公钥证书,用于加密
id_rsa:私钥证书,用于解密
14.软件包压缩和解压缩
解压:tar -zxvf
压缩:tar -zcvf
Linux中常见的两种数据压缩算法或格式gzip/bzip2
15.Hadoop核心组件与三种安装方式
hadoop1.0: common、 HDFS、 MapReduce
hadoop2.0: common、 HDFS、 MapReduce、 YARN
hadoop3.0: common、 HDFS、 MapReduce、 YARN、 Ozone对象存储、 submarine机器学习
单机形式、伪分布式、完全分布式
16.配置Java和Hadoop的环境变量
vim /etc/profile
JAVA_HOME=/home/software/java1.8
HADOOP_HOME=/home/software/hadoop2.7.1
PATH=$HADOOP_HOME/bin: $HADOOP_HOME/sbin:$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
Export JAVA_HOME HADOOP_HOME PATH CLASSPATH
17.配置主机名
/etc/sysconfig/network 此文件是针对本计算机的,是给计算机起的一个名字,是计算机的一个标识
/etc/hosts,此文间是在网络上使用的,用于解析计算机名称和IP地址的映射关系,功能相当于windows下面的c:\windows\system32\drivers\etc\hosts文件
**18. **同步时间
手动同步 /usr/sbin/ntpdate cn.pool.ntp.org
自动同步 crontab -e #执行后会打开一个临时文件/tmp/crontab.2n2LyP
#写入
0 1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#表示会在每天凌晨一点自动执行时钟同步的指令
如果时间不一致,就会导致在拿块数据的时候出现不同时间的延迟,可能导致访问文件时间很长甚至失败。
19.** Hadoop核心配置**
core-site.xml
fs.defaultFS hdfs://master:9000 # HDFS的入口地址,hdfs://集群IP:服务PORT
hadoop.tmp.dir /home/software/fakeHadoop/tmp # HDFS数据落地到本地磁盘的路径,持久化目录
hdfs-site.xml
dfs.replication 1 #数据副本数量:此时单机伪分布式设置为1,默认是3
dfs.permission false# HDFS的操作权限:此时为了外部用户访问,设置false
mapred-site.xml
mapreduce.framework.name yarn #指明MR运行资源由YARN来调度
yarn-site.xml
yarn.resourcemanager.hostname master #主进程ResourceManager的入口地址
yarn.nodemanager.aux-services mapreduce_shuffle#具体节点进程NodeManager获取数据的方式
DataNode
NameNode
SecondaryNameNode
ResourceManager
NodeManager
Jps
20.Hadoop安装的简要流程总结
安装Hadoop的简要流程总结说明
(1)配置好Linux系统,配置主机名、网络、编辑host文件,重启
(2)配置免密登录,关闭防火墙,连接其他机器
(3)JDK、Hadoop解压安装,配置hadoop核心文件
(4)复制hadoop文件夹到其他节点,配置环境变量
(5)格式化HDFS: hadoop namenode -format
(6)启动hadoop: start-all.sh
21.Hadoop进程启动顺序说明
namenode –> datanode -> secondarynamenode -> resourcemanager -> nodemanager
(1)namenode:管理集群,存储数据的原信息,并管理记录datanode中的文件信息。
(2)secondarynamenode:它是namenode的一个快照,会根据configuration中设置的值来决定多少时间周期性的去cp一下namenode,记录namenode中的metadata及其它数据。
(3)Datanode:存储数据
(4)ResourceManager:ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
(5)NodeManager:是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点
22.HDFS的核心进程以及优缺点
HDFS中包含的三个核心进程:NameNode、DataNode、 SecondaryNameNode
优缺点:
优势:处理超大文件、流式数据访问模式、运行于廉价的商用机器集群、发生故障时能继续运行而不被用户察觉
局限性:不适合处理低延迟数据访问、无法高效存储大量小型文件、不支持多用户写入及任意修改同一个文件
一、优点
支持超大文件存储: HDFS分布式存储时,只需要扩展DN数据节点的个数,就能实现存储超大文件
检测和快速应对硬件故障: HDFS文件系统中通过心跳机制和故障检测快速排查故障DN
流式数据访问: HDFS的数据处理规模比较大,应用一次需要访问大量的数据,同时这些应用一般是批量处理,牺牲了访问速度来提升数据吞吐量
简化的一致性模型:在HDFS中,一个文件一旦经过创建、写入、关闭之后,一般就不需要修改;这样有利于提升吞吐量
高容错性:数据副本
可构建在廉价的机器上
二、缺点
不能实现低延迟的数据访问:交互式应用需要数据在毫秒或秒的范围内得到响应,由于HDFS针对海量数据的吞吐量做了优化,无法实现低延迟的数据读取
不适合存储大量的小文件: HDFS支持超大文件存储,是通过将数据分布式的存储在数据节点上,而将数据的元数据信息存储在名字节点; NN的内存大小决定了
HDFS文件系统中可保存的文件数量。所以虽然现在的系统内存都比较大,但是大量的小文件还是会影响到NN所在服务器的性能
- 不支持多用户写入、修改文件:对于一个超大文件而言,个别部分数据的修改无实际意义并且修改可能会导致数据要重新进行切分、副本复制等工作,非常浪费性
能; HDFS从2.0之后支持追加数据
- 不支持超强的事务:没有对事务的有利支持
23.数据块block
数据块是HDFS文件系统上存储数据的基本单位
HDFS2.0以上的版本中数据块block的默认大小是128M
当在HDFS上存储小于blockSize大小的文件时,此时只有一个数据块并且数据块的大小就是文件实际大小
24.名字节点NameNode** **
用于存储元数据 && 管理DataNode节点
元数据:元数据信息保存在内存以及磁盘文件
元数据包含文件路径、文件权限、文件大小、文件和block之间的关系、block和datanode之间的关系、 block数量、 block大小
元数据信息持久化到NameNode节点所在的服务器上,目录路径由core-site.xml的hadoop.tmp.dir属性指定
25.管理DataNode:
i. 通过RPC心跳机制来检测DataNode
ii. 当HDFS启动的时候, NameNode会将fsimage中的元数据信息加载到内存中,然后等待每个DataNode向NameNode汇报自身的存储数据的信息,包括存储了哪些文件块、块大小、块ID等等
iii. NN收到这些信息之后,会做汇总和检测,检测数据是否完整、副本数量是否符合配置要求;如果检测发现问题, HDFS就会进入到安全模式中,在此模式下完成数据副本复制等工作,此时HDFS只能提供读取服务
26.SecondaryNameNode
- SNN 辅助NN对fsimage和edit进行合并,即冷备份
- SNN通常不与NN部署在同一个节点
27.SNN如何合并NN
(1)SNN将edits和fsimage从NN复制道自己的服务器所在的内存中,合成生成一个名为fsimage.ckpt的新镜像文件。
(2)SNN将fsimage.ckpt文件复制到NN中,之后删除原有的fsimage文件,并将fsimage.ckpt文件重命名为fsimage。
(3)当SNN将edits和fsimage复制后,NN会立即生成一个新的edits.new文件,用于记录新来的元数据。
(4)合并完成后,原有的edits文件被删除,并将新edits.new文件重命名为edits,开启下一轮流程。
****28.心跳机制 ****
(1) HDFS分布式文件系统是主从架构(主节点进程为NameNode、从节点进程为DataNode)
(2)YARN资源调度器也是主从架构(主节点进程ResourceManager、从节点进程为NodeManager)
(3)主节点启动的时候会开启进程间的通信服务,等待从节点的连接
(4)从节点启动的时候,会主动去连接IPC服务器,并且每隔3秒连接一次;此时间为默认值,可以修改
(5)从节点通过心跳给主节点汇报自己的信息,主节点通过心跳给从节点下达指令。
(6)如果主节点长时间没有收到从节点的心跳信息(一般是10min以内),则认为此从节点已失效
29.、数据节点Data****Node
在HDFS启动的时候,每个DataNode将当前存储的数据块信息告知NameNode节点;之后, DataNode节点会不断的向NameNode节点发送心
跳报告(每隔3秒发送一次心跳信息)
心跳信息:此节点的状态以及数据块信息
ii. 节点状态:
服役
待服役
退役
待退役
如果NameNode超过10分钟都没有收到DataNode的心跳,则认为其已经lost,那么NameNode就会copy此DataNode上的block到其他DataNode上
在HDFS中, DataNode上存储的副本replicas是多副本策略,默认是3个。单机伪分布式副本配置为1个即可
30.、block副本的放置策略
(以三个副本为例)
- 第一个副本:如果是集群内部提交,那么哪个DataNode所在的服务器节点提供就将该副本放在哪个节点上(也叫数据本地化策)
略);如果是集群之外的客户端(windows端)上传的数据,那么就随机选择一台磁盘不太慢、 CPU不太繁忙的节点进行存储
第二个副本:放置在和第一个副本不同的机架的节点上
第三个副本:放置在和第一个副本相同的机架的节点上
若还有更多的副本,随机节点即可,哪个节点比较空闲就放到哪个节点上
31.HDFS的shell命令
hadoop fs -ls
hadoop fs -lsr
hadoop fs -mkdir
hadoop fs -put
hadoop fs -copyFromLocal
hadoop fs -get
hadoop fs -copyToLocal
hadoop fs -cat
hadoop fs -tail
hadoop fsck
hadoop dfsadmin -report
32、HDFS的API命令
查看HDFS目录下的文件:
public void testLs()throws Exception{
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(new URI("hdfs://hadoop101:9000"),conf,"root");
FileStatus[] ls=fs.listStatus(new Path("/"));
for(FileStatus status:ls){
System.out.println(status);
}
}
33、HDFS读写流程说明
读取:** **
(1)客户端Client向NameNode发起RPC请求
(2)NameNode收到请求之后会校验这个文件是否存在;如果文件存在,NameNode就会客户端一个信号
(3)客户端在收到信号之后会读取元数据,NameNode然后将第一个block的地址放入队列中返回给客户端
(4)客户端收到队列之后从中选取一个较近的节点来读取第一个block,读取完成之后,会对这个block进行checksum的验证,即验证读取到的Block大小和声明的Block大小是否一致;如果校验失败,客户端会给NameNode一个信号然后重新选取地址重新读取;如果校验成功,则客户端会向NameNode要第二个block的地址,重复2、3、4三个步骤
(5)客户端读取完成所有的block之后,会给NameNode一个结束信号,NameNode在收到信号之后会关闭文件
写入:** **
(1)客户端Client向NameNode发起RPC请求,并指定上传文件的路径
(2)NameNode会判断路径的合法性,并且进行校验:校验创建者是否有权限进行写操作;校验要创建的文件是否已经存在;成功则会为文件创建一个记录,即NameNode记录元数据,否则会让客户端抛出异常
(3)当客户端开始写入文件的时候,会将文件切分成多个packets(即对数据进行封包),并向NameNode要第一个Block的存储位置
(4)客户端在获取到地址之后,开始以pipeline(管道)的形式将数据包写入所有的副本中。客户端把数据包以流的方式写入第一个DataNode,该DataNode把该数据包存储之后,再将其传递给在此pipeline中的下一个DataNode,直到最后一个DataNode,这种写数据的方式呈流水线的形式
(5)最后一个DataNode成功存储之后会返回一个ack信号给第二个DataNode,第二个DataNode收到ack之后会给第一个DataNode范围ack,这样在pipeline里将ack信号传递至客户端。客户端在收到ack信号之后会继续写下一个Block,然后重复以上操作
(6)当写完所有的block之后,客户端会给NameNode一个结束信号,NameNode就会关闭文件/关流,文件关闭之后,这个文件就不可修改了。
34.HDFS序列化机制
序列化:将结构化的数据或对象转换为字节流,以便于在网络传输或者磁盘存储
反序列化:将序列化之后的字节流重新组织为一个对象
HDFS中使用到的序列化机制:
进程间通信: HDFS中系统间多个计算节点上进程之间的通信是通过远程过程调用RPC实现的, RPC协议将消息序列化成二进制字节流发送到远程节点上,远
程节点接着将字节流反序列化成原始数据,实现了进程间的数据传输通信
存储: HDFS分布式文件系统是用于存储海量数据文件的,它是分布式存储,将一个超大文件切分成若干个数据块,然后将块分发到多个节点上进行存储
特点:
a. 紧凑。高效实时存储空间
b. 快速。读写数据的额外开销较小
c. 可扩展。可以读取较老格式的数据
d. 跨平台。可以使用不同的语言读写存储的数据
35、Map****Reduce
基于Map和Reduce的并行计算模型:
i. 海量数据存储: HDFS上存储的文件数据作为输入源
ii. Map:
接收文件数据的键值对作为输入,经过逻辑运算之后产生一系列键值对
[keyin,valuein]:数据源、数据类型
[keyout,valuout]:数据类型
iii.中间环节处理:
- Map输出的结果也成为中间结果,会在此过程中进行分区、排序、聚合等工作,然后将键相同的值的集合统一交给后续的reduce处理
iv.Reduce:
接收中间结果数据的键-值集合作为输入,经过逻辑运算之后产生最终的结果键值对
[keyin,valuesin]:数据源、数据类型
[keyout,valuout]:数据类型
v. 计算结果落地
易错点:k-v的类型没对上
Mapper组件:
numMapTask应该与文件切片数量一致
Reducer组件:
ReduceTask接收到中间环节处理后的数据,然后每当有一个key就会调用一次reduce函数
36、分区
- Partition分区数据是按照编号发送给对应编号的ReduceTask进行处理的,所以ReduceTask的数量一定要大于等于实际分区所需要的数量,否则执行会抛出异常,因为此时编号大于RT编号的分区数据会非法,无法被处理
- 大于的时候,只是有一个空的ReduceTask运行产生空文件,浪费性能
获取到MapTask的输出KEY-VALUE数据作为分区类的输入数据,按照此函数中定义的业务规则对输入的key进行划分,返回一个分区编号, 默认采用数字给分区进行编号,从0开始
易错点:k-v的类型没对上
37、排序
- MapReduce中的排序发生在mapper执行过后,数据进入到reduce操作之前,并且数据将会按照输出的key进行排序;利用这个特性从而实现了大数据
场景下的排序需求
在MR中如果没有自定义排序规则且map的keyout的类型是Text,默认按照keyout的字典顺序进行排序的
需要自定义排序规则时,要排序的对象对应的类实现WritableComparable接口,重写其中的compareTo,传入要比较的对象,根据返回值的正负决定排序的顺序,正整数、 0、负整数得出大于、等于、小于。默认是升序排序
谁排序谁作为key输出
38、Shuffle机制
Mapper端s****huffle:
(1)在MapReduce程序刚开始的时候会先对文件进行切片,每一个切片会分配给一个MapTask来处理;MapTask在接收到FileSplit之后进行按行读取,每读取一行调用一次map方法
(2)每执行完一次map方法之后会将计算结果写到缓冲区中。缓冲区是维系在内存中的,大小默认是100M;
(3)在缓冲区中,会对数据进行分区-partition,排序 - sort。如果指定了合并 - combine操作,则在缓冲区中也会进行combine操作
(4)当缓冲区的容量利用率达到阈值0.8的时候,会启动给一个后台线程将缓冲区中的数据写到指定目录下的溢写文件中,这个过程称之为是溢写 (Spill),而每次的Spill都会产生一个新的溢写文件
(5)等最后所有的数据都写完之后,会将所有的溢写文件进行一次合并 (merge),合并到一个新的分区并且排序的文件中
Reducer端shuffle****:****
(1) ReduceTask 通过 Http 的方式来得到输出文件的分区,这个过程称之为 fetch
(2)每一个 ReduceTask 将获取的分区的数据再次进行 merge,然后进行排序
(3)将相同的 key 做聚合,将值放入迭代器中,这一步称之为 grouping
(4)调用 reduce 方法,将 key 和迭代器传入
39、YARN如何为MapReduce2的作业提交分配资源并调度任务。
简略版:
(1)将Job提交给ResourceManager中ApplicationsManager
(2)ApplicationsManager接收到任务之后,会在某一个TaskManager上来开启ApplicationMaster线程,并且会将这个任务交给ApplicationMaster;同时这个过程中ApplicationsManager会将这个job任务执行所需要的资源交给ResourceSchedular
(3)ResourceSchedular会将这些资源封装成Container对象(主要包含这个job任务执行所需要的CPU核以及所需内存)分配给ApplicationMaster
(4)ApplicationMaster将任务切分为MapTask和ReduceTask,将任务进行分配给TaskManager执行。在分配过程中,MapTask尽量满足数据本地化策略,ReduceTask要尽量分配在相对空闲的节点上
(5)ApplicationMaster要监控任务的执行情况:
如果MapTask或者ReduceTask执行成功了,ApplicationMaster监控到成功信号,同时ApplicationsManager回收资源;如果执行失败,则ApplicationMaster会监控到任务的失败,同时ApplicationsManager依然会回收资源。ApplicationMaster监控到任务失败之后会和ApplicationsManager重新申请资源,然后会试图重启这个子任务
版权归原作者 Fly_hao.belief 所有, 如有侵权,请联系我们删除。