1、hadoop的mapereduce编程模型
map阶段:
(1)读取文件系统中的文件
(2)将键值对集合输入到mapper进行业务处理形成key-value的输出,
(3)进行partition进行分区操作,默认式hashpartitioner,可以重写hashpartitioner的getparttition方法
(4)将分区后的数据按照key值进行sort、grouping等操作进行分组排序,可以自定义数据类型,重写writeableComparator的Comparable方法
(5)进行一次combiner操作,其实是本地的reduce的预处理,用来减少数据的网络传输延时
reduce阶段:
(6)reduce task阶段就是对相同的key值做业务处理
(7)reduce处理完的数据保存,并结束job
2、hadoop的TextInputFormat作用是什么,如何自定义实现
InputFormat是hdfs的输入文本格式,TextInputFormat是HDFS默认的输入格式,
(1)getSplits,负责对输入数据进行分片操作,
(2)getRecordReader,返回一个recorder对象,对每个split分片进行“key-value”转换并传给mapper操作
3、hadoop和Spark的都是并行计算,那么他们有什么相同和区别
(1)两者都是用mr模型来进行并行计算,hadoop的一个作业称为job,job里面分为map task和reduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束
(2)spark用户提交的任务成为application,一个application对应一个sparkcontext,app中存在多个job,每触发一次action操作就会产生一个
job这些job可以并行或串行执行,每个job中有多个stage,stage是shuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成taskset有TaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算
(3)hadoop在job运行过程中,频繁的对hdfs进行文件读取/写入操作,io操作频繁。
spark是内存计算框架,RDD操作和DAG(有向无环图)等
4、简单说一下hadoop和spark的shuffle过程
hadoop:
map端保存分片数据,通过网络传输到reduce端
spark:
spark的shuffle是在DAGSchedule划分Stage的时候产生的,TaskSchedule要分发Stage到各个worker的executor
5、Hive中存放是什么?
存放的是外部表、表、分区表、bucket等
使用hive可以创建与hdfs上文件的映射表,对hdfs上的数据进行CURD操作
6、Hive与关系型数据库的关系?
没有关系,hive依赖于hdfs,每次执行hive任务实质上是执行MR job任务,而关系型数据库是可以实时数据操作
7、Hbase行健列族的概念,物理模型,表的设计原则?
行键:每一条行键记录就是一条记录
列簇:列的集合,作为一个文件单独存储,通过时间戳来区分。
物理模型:
(1)region是regionserver管理表的基本单元,有点类似于HDFS的Block(128M)
(2)一张表通常会被划分为多个region
(3)根据rowkey划分region,master将这些region分配给不同的regionserver管理
(4)当某个regionserver出现物理损坏,zookeeper集群会监控到这个regionserver的损坏情况,将此regionserver损坏的信息发送给master,master将本来分配给这台regionserver管理的数据重新分配给其他regionserver;
(5)默认情况下,一个表开始对应一个region,随着数据量增大并达到阈值,会生成新的region
(6)Region是分布式存储的最小单元,由一个或多个store组成,每个store保存一个“列族”
每个store又由一个memStore和0-多个StoreFile组成;memstore存储在内存中,StoreFile存储在HDFS上
(7)DataNode和regionserver都是安装在同一台服务器;
8、Spark Streaming和Storm有何区别?
Spark Streaming是准实时计算框架,秒级
storm 是实时计算框架,毫秒级
spark streaming 比 storm吞吐量大
9、hadoop配置文件设置?
hadoop:修改
hadoop-env.sh配置java环境变量
core-site.xml配置zk地址,临时目录等
hdfs-site.xml配置nn信息,rpc和http通信地址,nn自动切换、zk连接超时时间等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使用yarn
slaves配置节点信息
格式化nn和zk。
hbase:修改
hbase-env.sh配置java环境变量和是否使用自带的zk
hbase-site.xml配置hdfs上数据存放路径,zk地址和通讯超时时间、master节点
regionservers配置各个region节点
zoo.cfg拷贝到conf目录下
spark:
安装Scala
修改spark-env.sh配置环境变量和master和worker节点配置信息
环境变量的设置:直接在/etc/profile中配置安装的路径即可,或者在当前用户的宿主目录下,配置在.bashrc文件中,该文件不用source重新打开shell窗口即可,配置在.bash_profile的话只对当前用户有效。
10、spark工作机制
用户想client提交作业后,会由Driver运行main方法,并创建spark context上下文。
执行RDD算子,形成DAG图输入DAGschedule,按照RDD之间的依赖关系划分stage,
task scheduler 将stage 划分为task子任务到各个executor上。
11、spark-PageRank
url:
split–>distinct–>groupbykey
rank:
key=>(key,1)
思路:
url.join(key)–>flatMap–>(url,rank/url.size)
12、spark on yarn的原理
client提交application给spark集群,在Driver程序中创建SparkContext,将其作为调度的总入口,初始化过程中分别创建DAGSchedule和TaskSchedule两个模块。DAGSchedule模块是依赖TaskSchedule模块的,将spark job分解成多个stage任务阶段,将每个stage划分为一组具体的任务并交给底层TaskSchedule执行,TaskSchedule是具体执行和监控task的,然而task运行的资源需要向clusterManager申请,每个Spark Application都有自己的Executor进程
13、spark数据倾斜
数据倾斜产生在数据shuffer过程,对数据按照key进行分组,有可能部分key对应的数据比较大,大部分task很快执行完毕,但因为某个或者几个task没有而导致整个job延时完成任务。
找原因:
(1)寻找代码中出现shuffle的算子
(2)寻找出现OOM的stage
解决方案:
(1)聚合源数据,使用hive聚合,聚合SQL(groupby)
(2)丢弃某些数据,使用hive表操作过滤点几个key值