1、hadoop的各种进程及其作用
NameNode:是hdfs的主服务器,管理文件系统的目录树以及对集群中存储文件的访问,保存有metadate,不断读取记录集群中dataNode主机状况和工作状态。
SecondaryNameNode:NameNode的冷备,负责周期性的合并esimage以及editslog,将少NameNode的工作量。
DataNode:负责管理各个存储节点,每个存储数据的节点都有一个datanode守护进程。
DFSZKFailoverController:负责监控NameNode的状态,并及时把信息状态写入zk,通过一个独立的线程周期性的调用Namenode上的一个特定接口来获取NameNode的健康状态,也有选择谁为Active的权利,但是最多只能有两个namenode,所以选择策略为先到先得。
QuorumPeerMain:zookeeper主进程
JournalNode:高可用情况下用于存放namenode的editlog文件(元数据),也是多节点高可用。
Fsimage:元数据镜像文件(文件系统的目录树)。Edits:元数据的操作日志(针对文件系统做的修改操作记录。
editsLog:修改日志,当文件系统客户端client进行写操作的时候,我们就要把着条记录放在修改日志中,之后namenode修改内存中的数据结构,每次写操作执行之前,editsLog都会同步到文件系统中
2、mapreduce
Combiner:是一个特殊的reduce,是一个在map端执行的reducer,能够减少I/O操作,降低reducer端的负荷,也就是map端的聚合操作。
3、yarn
ResourceManager(JobTracker):负责调度DataManager上的资源,每个DataNode都有一个NodeManager(TaskTracker)来执行实际工作
NodeManager:管理slave节点的资源
ApplicationMaster:用于调度任务,任何要在yarn上启动的作业类型,必须有一个。
工作流程:客户端发送请求到资源管理器ResourceManager,所有的NodeManager向资源管理器进行反馈节点状态,ResourceManager向资源比较空闲的NodeManager发送任务,NodeManager创建appMaster(ApplicationMaster),任务节点的appMaster向ResourceManager申请资源,ResourceManager会在其他的节点开辟新的资源环境(spark中是executor)。计算的结果反馈给AppMaster然后由appMaster向ResourceManager反馈处理的数据结果,就明确哪些节点有资源可用了,接下里就可以派发任务了。
hadoop调度机制
默认的调度起FIFO:先进先出
计算能力调度器Capacity Scheduler:支持多个队列,每个队列可以配置一定的资源,每个队列采用FIFO调度策略,会对同意用户提交的作业所占资源进行限定以防止一个用户作业独占队列的资源。计算每个队列中正在运行的任务数与其应该分配得到的计算资源之间的比值,选择一个比值最小的队列,然后按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存的限制。
公平调度起FairScheuler:支持多个队列多个用户,每个队列资源可配置,每个队列中的作业公平共享队列中的所有资源。
4、hadoop操作命令
hadoop dfsadmin -report 查看hdfs集群的存储空间使用情况。
hadoop fs -du -h 目录 查看当前目录下各个文件占得内存 详细说明
Hadoop fs –rmr /tmp/aaa删除一个目录
Hadoop fs –put文件hdfs文件目录上传一个文件
Hadoop fs –get hdfs文件下载地址目录下载一个文件
Hadoop fs –moveFromLocal文件hdfs文件目录上传一个文件同时删除本地文件
Haddop fs –text hdfs目录查看文件内容
Haddopfs –cat hdfs目录查看文件内容
Hadoop job –list获取任务列表
Hadoop job –kill job-id杀死一个job
Hadoop-daemon.sh start datanoe加入一个新的节点
Hadoop mradmin/dfsadmin –refreshnones删除一个节点
yarn application -kill application_任务id:停止在yarn上运行的spark任务,在resourcemanager上执行
5、Hbase存储流程
一个region由多个store组成,每个store中包含一个列蔟的所有数据。Store包括位于内存中的memstore和位于硬盘的storefile。
写数据的时候,先写入memstore,当memstore中的数据达到某个阀值的时候,HRegionServer会启动flushCache进程将数据写入到一个新的storefile,而当storefile文件的数量增长到一定程度的时候,系统会将storefile进行合并,进行版本合并以及删除操作,形成更大的storefile。而当storefile文件不断合并,数据量再次超过一定阀值的时候,就会将region分割为两个region,并有HMaster分配到响应的region服务器,实现了负载均衡。
客户端在检索数据的时候,现在memstore中找数据,没有的话再寻找storefile。
Hbase适用于比较成熟的数据分析主题,查询模式已经确立,并且不会轻易改变,传统的关系型数据库已经无法承受负荷,高速插入和大量的读取。适合海量的同时也是简单的查询操作,比如keyvalue形式。
Family数量选择:如果是离线应用,写操作比较多,那么尽量使用一个family,因为当一个family达到flush条件的时候,该region会出发所有family所属的memstore进行flush,即使其他memstore数据很少也会flush而声称小文件,容易增加compaction发生的几率,而compaction是一region为单位的,很容易导致降低系统的整体吞吐率。但是如果使在线应用则可以根据实际情况多设置family,每次读取数据不用加载多有family,io更少,并且多个family导致数据被分配到多个hfile中,减少了split发生的几率,会让系统提供更加稳定的在线服务。
6、Spark各个进程以及作用
Master进程:管理整个集群资源,Yarn中为ResouceManager
Worker进程:负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Executor。Yarn中为NodeManager
client:客户端进程,负责提交作业到Master。在yarn-cluster模式中,在Resource Manager端提交应用程序,会生成SparkSubmit进程,该进程只用来做Client端,应用程序提交给集群后,就会删除该进程。
Application:基于spark的用户程序,包含了driver程序和集群上的executor
Driver:一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业代码的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。在yarn-cluster模式中,resourcemanager会选取一个nonemanager上运行applicationManager,该AM会同时运行着Driver。
ClusterManager:在集群上获取资源的外部服务(如standalone、yarn)
Executor:在worker上为某个应用启动的一个进程,负责接收taskSet,运行任务,以及将数据存储到内存或者是磁盘上,每个应用都有自己独立的executors。
Task:被送到某个executor上的工作节点
Job:和spark的action对应,包含很多任务的并行计算
Stage:一个job被拆分为多组任务,每组任务被称为stage
DAGScheduler:基于stage构建DAG,决定每个任务的最佳位置;记录哪个RDD或者stage需要物化;将taskset(一组task)传给底层调度起TaskScheduler;重新提交shuffle输出丢失的stage
TaskScheduler:提交taskset到集群运行并汇报结果;出现shuffle输出lost要报告fetch
sparkContext:整个应用的上下文,控制应用的生命周期
SparkConf:负责存储配置信息
failed错误;碰到straggle任务需要放到别的节点上重试;为每一个taskset维护一个taskSetmanager(追踪本地性及错误信息)
7、Flume进程以及作用
Agent:是一个java进程,运行在日志收集节点,包括sorce、channle、sink组件
Source:用于收集日志,可以处理各种格式的日志数据,包括:avro/thrigt/exec/jms/spooling/directory/netcat/sequence
generator/syslog/http/legacy/自定义,收集之后存放在channel中
Channel:用于临时存储数据,可以放在memory/jdbc/file/自定义中,channel中的数据只有sink发送成功之后才会被删除
Sink:用于将数据发送到目的地,目的地包括hdfs/logger/avro/thrigt/ipc/file/null/hbase/solr/自定义
在整个数据传输过程中流动的是event,事务保证是在event级别。
8、Hbase进程以及作用
Client:包含访问hbase的接口并维护cache来加快对hbase的访问
Zookeeper:保证Master的唯一性,存储Region的寻址入口,实时监控RegionServer的上线和下线信息,并实时通知Master、存储Hbase的schema和table的元数据
HMaster:为RegionServer分配region、负责RegionServer的负载均衡、发现实效的RegionServer并重新分配其上的region、管理永辉对table的增删改查。
HRegionServer:维护region并处理对这些region的IO请求,负责切分在运行过程中变大的region。
9、kafka进程机器作用
Producer:生产者
Consumer:消费者
Broker:kafka集群的server,负责处理消息读写请求,存储消息
Topic:消息队列、分类
Queue:里边有生产者消费者模型
10、spark中client和cluster的区别和作用
(1)client
Driver运行在客户端(启动在本地机器上)。
这里Driver会负责所有任务的调度,频繁与集群上的多个executor通信(task启动消息、执行统计消息、运行状态、shuffle输出结果等),频繁大量的通信(一般情况本地机器与集群不在一个机房),会导致本地通信负载高。但是所有的日志都会在本地机器上看到,适合做测试时候使用。
Spark-Standlone-Client
客户端启动后直接运行程序启动Driver相关工作:DAGScheduler和BlockManagerMaster等。客户端的Driver向Master注册。Master会让Worker启动Executor,Worker创建一个ExecutorRunner线程,executorRunner会启动ExecutorBackend进程。ExecutorBackend启动后向Driver的ExecutorBackend注册,Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的task通过taskScheduler分配给executor执行。最后所有的stage执行完之后作业结束
Spark-Yarn-Client
本地机器提交Application到ResourceManager,会直接在本地机器启动Driver程序,RM在资源充足的一台NodeManager启动ApplicationMaster,之后AM向RM申请executor,RM根据各个节点的资源情况分配container,并告知AM,各个NodeManager启动executor,启动之后各个NodeManager向Driver反向注册,这时候Driver就知道自己有哪些资源可以使用了,然后就可以执行job、拆分stage等的计算任务了。
感觉ApplicationMaster除了申请executor没有其他作用了。
(2)cluster
Driver执行在任务节点(在其中一台NodeManager,和ApplicationMaster运行在一起)
Spark-Standlone-Cluster
作业提交给Master,Master让一个worker启动Driver(SchedulerBackend),创建一个DriverRunner线程,启动SchedulerBackend进程。Master会让其他worker启动Executor(ExecutorBackend)创建一个ExecutorRunner线程,启动ExecutorBackend进程。ExecutorBackend启动之后向Driver的SchedulerBackend注册,SchedulerBackend进程中包含DAGScheduler,它会根据用户程序生成执行计划并调度执行。对每个stage的task都会存放到taskScheduler中,当executorScheduler向SchedulerBackend汇报的时候吧taskScheduler中的task调度到executorBackend执行。最后所有的stage运行完之后作业结束。
Spark-Yarn-Cluster
本地机器提交Application到ResourceManager,RM在资源充足的一台NodeManager启动ApplicationMaster,Driver与其一同启动,之后向RM申请executor,RM根据各个节点的资源情况分配container,并告知AM,ApplicationManager向各个NodeManager启动executor,启动之后各个NodeManager向AM反向注册,这时候ApplicationManager(Driver)就知道自己有哪些资源可以使用了,然后就可以执行job、拆分stage等的计算任务了。
(3)注意点
Standlone模式下,application的注册(executor的申请)以及任务调度都是由driver来的。
spark on yarn模式下,application的注册(executor的申请)由AM进行,任务调度由Driver,是分离开来的
11、HDFS读写流程
(1)HDFS读流程:
第一步:客户端通过Distributed file system的api的open方法;
第二步:open方法发送请求到namenode,获得Block的位置信息(位置信息只有元数据才知道),将block的全部位置信息返还给客户端;
第三步:客户端收到block位置后开始读取,通过FSDataInputStream着api中的read方法读取;
第四步:通过FSDataInputStream着api进行并发的读取各个block,也就是一起读,在读的过程中只读其中的一个副本就可以类,优先读取离同一个机架;
第五步:关闭,并在客户端形成一个统一的文件。
(2)HDFS写流程
第一步:客户端通过调用Distributed File System的api的create方法可以取创建一个文件;
第二步:Nameode可以接受到你的文件名是什么,文件大小用户是谁,namenode确定block的数量以及需要存放的datenode;
第三步:客户端开始读数据,通过FSDataInputStream的write方法进行写;
第四步:着方法只将一个block写到databode上,由当前的datanode去创建一个线程,往其他的datanode上按照当前的副本规则取复制其他副本;
第五步:返回一个回馈信息,表示上传完成
第六步:关闭,并汇报给namenode一个上传完毕的信息
12、spark on yarn和mapreduce on yarn区别
(1)mapreduce使用多进程来运行多个独立task,方便细粒度空值每个任务占用的资源,但会消耗更多启动时间,不适合运行低延迟类型作业;spark使用多个executor进程,每个中用多个task线程运行,适合低延迟类型作业。
(2)spark有利于内存共享,所有任务运行在一个进程中,适合内存密集型任务(如需要加载大量词典的应用程序),executor申请的资源可被多批任务重复使用。Mapreduce每个task单独申请资源用完后释放,2.0没有支持jvm重用功能。
(3)spark会导致严重的资源争用,难以细粒度控制每个任务的资源量,而mapreduce控制资源占用量有利于大作业平稳运行。
(4)mapreduce:每个task运行在一个独立jvm进程中;支持内存、cpu两种资源的调配;task运行完就释放资源
(5)spark:每个节点运行一个或多个executor服务,每个executor配有一定数量的slot,表示该executor可以同时运行多少个shufflemaptask或者reduceTask。每个executor运行在一个jvm进程中,每个task是运行在executor中的一个子进程;同一个executor内部的task共享内存(比如广播变量),executor一旦启动将一直运行,资源一直被task复用,知道spark程序运行完成才释放退出。