Hadoop相关
   2019-06-12 13:58:50
1:hadoop 的四大组件
HDFS:分布式存储系统
MapReduce:分布式计算系统
YARN: hadoop 的资源调度系统
Common: 以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等
2:针对数据存放(HDFS)
a:NameNode(以下简称nn)是master,主要负责管理hdfs文件系统,具体地包括namespace管理(其实就是目录结构),block管理(其中包括filename->block,block->ddatanode list的对应关系)。HDFS的守护进程,用来管理文件系统的命名空间,负责记录文件是如何分割成数据块,以及这些数据块分别被存储到那些数据节点上,它的主要功能是对内存及IO进行集中管理。
b:DataNode(简称dn)主要是用来存储数据文件,HDFS将一个文件分割成一个个的block,这些block可能存储在一个DataNode上或者是多个DataNode上。dn负责实际的底层的文件的读写,如果客户端client程序发起了读hdfs上的文件的命令,那么首先将这些文件分成block,然后nn将告知client这些block数据是存储在哪些dn上的,之后,client将直接和dn交互。文件系统的工作节点,根据需要存储和检索数据块,并且定期向namenode发送他们所存储的块的列表。
c:两个属性项: fs.default.name 用来设置Hadoop的默认文件系统,设置hdfs URL则是配置HDFS为Hadoop的默认文件系统。dfs.replication 设置文件系统块的副本个数
文件系统的基本操作:hadoop fs -help可以获取所有的命令及其解释
常用的有:
hadoop fs -ls / 列出hdfs文件系统根目录下的目录和文件
hadoop fs -copyFromLocal 从本地文件系统将一个文件复制到HDFS
hadoop fs -rm -r 删除文件或文件夹及文件夹下的文件
hadoop fs -mkdir 在hdfs中新建文件夹
HDFS的文件访问权限:只读权限(r),写入权限(w),可执行权限(x)
3:针对MapReduce
a:JobTracker协作作业的运行;负责调度分配每一个子任务task运行于TaskTracker上,如果发现有失败的task就重新分配其任务到其他节点。
•JobTracker负责资源监控和作业调度
•JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
•JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源
b:TaskTracker运行作业划分后的任务;TaskTracker是运行在多个节点上的slaver服务;TaskTracker主动与JobTracker通信,接收作业,并负责直接
执行每一个任务,为了减少网络带宽TaskTracker最好运行在HDFS的DataNode上。
•TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
•TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用
c:mapreduce程序的运行流程(经典面试题)
(1) 一个 mr 程序启动的时候,最先启动的是 MRAppMaster, MRAppMaster 启动后根据本次 job 的描述信息,计算出需要的 maptask 实例数量,然后向集群申请机器启动相应数量的 maptask 进程
(2) maptask 进程启动之后,根据给定的数据切片(哪个文件的哪个偏移量范围)范围进行数 据处理,主体流程为:
A、 利用客户指定的 inputformat 来获取 RecordReader 读取数据,形成输入 KV 对
B、 将输入 KV 对传递给客户定义的 map()方法,做逻辑运算,并将map()方法输出的 KV 对收 集到缓存
C、 将缓存中的 KV 对按照 K 分区排序后不断溢写到磁盘文件 (超过缓存内存写到磁盘临时文件,最后都写到该文件,ruduce 获取该文件后,删除 )
(3) MRAppMaster 监控到所有 maptask 进程任务完成之后(真实情况是,某些 maptask 进 程处理完成后,就会开始启动 reducetask 去已完成的maptask 处 fetch 数据),会根据客户指定的参数启动相应数量的 reducetask 进程,并告知 reducetask 进程要处理的数据范围(数据
分区)
(4) Reducetask 进程启动之后,根据 MRAppMaster 告知的待处理数据所在位置,从若干台 maptask 运行所在机器上获取到若干个 maptask 输出结果文件,并在本地进行重新归并排序, 然后按照相同 key 的 KV 为一个组,调用客户定义的 reduce()方法进行逻辑运算,并收集运
算输出的结果 KV,然后调用客户指定的 outputformat 将结果数据输出到外部存储
4:YARN资源调度系统
a:ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)
b:NodeManager是运行在单个节点上的代理,它管理Hadoop集群中单个计算节点,功能包括与ResourceManager保持通信,管理Container的生命周期、监控每个Container的资源使用(内存、CPU等)情况、追踪节点健康状况、管理日志和不同应用程序用到的附属服务等。
6:Hive数据仓库工具(把SQL翻译成MapReduce)
7:HDFS是Hadoop提供的分布式存储框架,它可以用来存储海量数据,MapReduce是Hadoop提供的分布式计算框架,它可以用来统计和分析HDFS上的海量数据,而Hive则是SQL On Hadoop,Hive提供了SQL接口,Hive负责把SQL翻译成MapReduce,提交运行。
8:数据采集(采集后使用Hive和MapReduce进行分析)
a:HDFS PUT命令;HDFS API
b:Sqoop(主要用于Hadoop/Hive与传统关系型数据库Oracle/MySQL/SQLServer等之间进行数据交换的开源框架,Sqoop把你指定的参数翻译成MapReduce,提交到Hadoop运行,完成Hadoop与其他数据库之间的数据交换。)
c:Flume(一个分布式的海量日志采集和传输框架,可以实时的从网络协议、消息系统、文件系统采集日志,并传输到HDFS上)
d:DataX(Hadoop与关系型数据库数据交换的工具)
9:分析完的结果从Hadoop上同步到其他系统和应用中去
a:HDFS GET命令(把HDFS上的文件GET到本地);HDFS API
b:Sqoop
c:DataX
10:Hive后台使用MapReduce作为执行引擎,有点慢,可以使用SparkSQL或Impala或Presto.
11:Kafka(满足数据的一次采集<通过Flume采集>、多次消费的需求)
12: Apache Oozie(任务调度与监控系统)
13:Kafka + Storm或Spark Streaming(实时计算)
14:通常对外(业务)提供数据访问,大体上包含以下方面:
离线:比如,每天将前一天的数据提供到指定的数据源(DB、FILE、FTP)等;
离线数据的提供可以采用Sqoop、DataX等离线数据交换工具。
实时:比如,在线网站的推荐系统,需要实时从数据平台中获取给用户的推荐数据,这种要求延时非常低(50毫秒以内)。
根据延时要求和实时数据的查询需要,可能的方案有:HBase、Redis、MongoDB、ElasticSearch等。
OLAP分析:OLAP除了要求底层的数据模型比较规范,另外,对查询的响应速度要求也越来越高,可能的方案有:Impala、Presto、SparkSQL、Kylin。如果你的数据模型比较规模,那么Kylin是最好的选择。
即席查询:即时查询的数据比较随意,一般很难建立通用的数据模型,因此可能的方案有:Impala、Presto、SparkSQL。
15、Pig与Hive的相同与区别:
相同:
1、Hive和Pig都是数据分析引擎,除此之外,还有Spark中的Spark SQL和Cloudera开发的Impala等。
2、Hive和Pig都简化了MapReduce程序的开发。
不同:
1、Hive作为数据分析引擎有一定限制,只能分析结构化数据,因为Hive的数据模型是表结构,虽然没有数据存储引擎,需要用户在创建表时指定分隔符(默认以Tab键作为分隔符):row format delimited field terminated by ‘,’,而Pig的数据模型是包结构,由tuple和field组成,因此可以分析任意类型的数据。
2、Hive使用的是sql语句分析数据,sql语句是一种声明式语言,Pig使用的是PigLatin语句分析数据,PigLatin语句是一种过程式语言/脚本语句。
3、Hive中的内置函数不用大写,Pig中的内置函数必须要大写。
举例:按照部门号对员工表分组并求每个部门中薪水的最大值:
sql语句:select deptno,max(sal) from emp group by deptno;
PigLatin语句:emp1 = group emp by deptno;
emp2 = foreach emp1 generate group,MAX(emp.sal)
dump emp2;
(PigLatin语句注意事项:等号前后要有空格)
4、Hive保存元信息,因此数据模型不用重建,而Pig不保存元信息,因此数据模型需要重建。
5、由于PigLatin语句是脚本语言,因此Hive执行速度比Pig更快。
6、 由于Hive的数据模型是表结构,因此Hive是先创建表,后加载数据,而Pig的数据模型是包结构,Pig在加载数据的同时创建包。