大数据面试题3

1.RDD 的缓存方法:

RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的Action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

2.select * from table;为什么不会生成MapReduce 任务

由于hive本身的优化机制,一些简单的语句如select *,select 字段1,字段2 from table,hive不会启动MapReduce任务。但是有时候我们并不希望他这么做,比如:通过hiveserver2使用Java的jdbc发送select * from aaa,这个语句,当aaa这个表数据量超大的时候,比如我遇到的3000+的字段,5000万的数据量,程序就卡死了,查看hdp的后台页面,发现该hiveserver2的机器,CPU使用很高,并且已经几乎不会响应其他请求。原因就是因为hive的优化,使得没有进行MapReduce任务,而是在那个hiveserver2本地机器上启动fetch task,数据量巨大的时候,就可能使它崩溃了。

3. Stage 的 Task 的数量由什么决定

partition
首先job的划分是遇到action操作时,被发现后经过sparkcontext的runjob方法来到DAGscheduler,这个类中它会通过依赖关系划分出stage,一个stage是一个taskset,里面的每个task对应着rdd的一个分区。task可以理解为并行的分片

4.Scala中静态的概念-伴生对象

Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。
但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象。
这个类的所有静态内容都可以放置在它的伴生对象中声明和调用
在这里插入图片描述

伴生对象的小结
1)Scala中伴生对象采用object关键字声明,伴生对象中声明的全是 "静态"内容,可以通过伴生对象名称直接调用。
2)伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
3)伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问
4)从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合
5)从技术角度来讲,scala还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类,实现属性和方法的调用。
6)从底层原理看,伴生对象实现静态特性是依赖于 public static final MODULE$ 实现的。
7)伴生对象的声明应该和伴生类的声明在同一个源码文件中(如果不在同一个文件中会运行错误!),但是如果没有伴生类,也就没有所谓的伴生对象了,所以放在哪里就无所谓了。
8)如果 class A 独立存在,那么A就是一个类, 如果 object A 独立存在,那么A就是一个"静态"性质的对象[即类对象], 在 object A中声明的属性和方法可以通过 A.属性 和 A.方法 来实现调用
9)当一个文件中,存在伴生类和伴生对象时,文件的图标会发生变化

5.Shuffle过程Combiner的作用

Hadoop矿建使用Mapper将数据处理成一个个<key,value>键值对,在网络节点间对其进行整理(shuffle),然后使用Reduce处理数据并进行最后的输出。
这时会出现性能上的瓶颈:
(1)如果我们有10亿个数据,Mapper会产生10亿个键值对在网络间进行传输,但是如果我们对数据求最大值,那么很明显的Mapper值需要输出它所知道的最大值即可。这样不仅可以减少轻网络压力,同样也可以大幅度提高程序效率。
总结:网络带宽严重被占降低效率。
(2)有时候数据远远不是一致性的或者说是平衡分布的,这样不仅Mapper中的键值对,中间阶段(shuffle)的键值对等,大多数的键值对最终会聚集于单一的Reducer上,压倒这个Reducer,从而大大降低程序的性能。
总结:单一节点承载过重降低程序性能。

6.累加器的特点:

支持加法,支持数值类型,可并行,支持自定义类型

7.Rowkey设计的原则

尽量保证越短越好, 可以使用汉字,以使用字符串

8.描述mapreduce中的combine和partition的作用

combiner是发生在map的最后一个阶段,其原理也是一个小型的reducer。
combiner主要作用是减少输出到reduce的数据量,缓解网络传输瓶颈,提高reducer的执行效率。 partition的主要作用将map阶段产生的所有kv对分配给不同的reducer task处理。
partition可以将reduce阶段的处理负载进行分摊

9.mapreduce自定义数据类型

write()序列化属性顺序和readFields()方法反序列化属性顺序必须一致。
可以自定义toString()方法
write()把每个对象序列化到输出流
readFilds()把输入流字节反序列化到输入流
自定义数据类型实例

1.定义私有变量
2.setter,getter方法
3.无参有参构造器
4.set()方法,帮助构造器初始化数据(Hadoop偏爱)
5.hashCode()方法和equals()方法
6.toString()方法
7.implement Writable并实现write()方法readFilds()方法
8.implement WritableComparable并实现compareTo()方法

10.Scala集合叙述

所有的集合都扩展自Iterable特质。
集合有可变和不可变两种类型。
immutable类型的集合初始化后就不能改变了

11.关于构造器说法

每个类都有主构造器。
除了主构造器,还可以定义辅助构造器。
用this关键字定义辅助构造器。
构造器参数可以不带val或var

12.怎么保证数据全局有序

1)保证生产有充、消费有序、存储有序
2)只能有一个生产者,一个partition,一个consumer
ps:但是这违背分布式系统初衷,因此这是一个伪命题

13.什么是热点问题? 怎么解决?

大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)
解决方法 加盐 哈希 反转 时间戳反转

14.Hive在HDFS上的文件结构

(1)rcfile:Hive推出的一种专门面向列的数据格式
(2)textfile:Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大
(3)squencefile:二进制文件,将数据以<key,value>形式序列化到文件中
(4)orcfile:数据按行分块,每块按照列存储

15.项目开发流程

窗体顶端
需求:数据的输入和数据的产出;
数据量、处理效率、可靠性、可维护性、简洁性
数据建模
架构设计:数据怎么进来,输出怎么展示,最最重要的是处理流出数据的架构;
再次思考大数据系统和企业IT系统的交互
最终确定选择、规范等;
基于数据建模写基础服务代码
正式编写第一个模块
实现其它的模块,并完成测试和调试等;
测试和验收

16.hive的排序

窗体顶端
order by普通排序
sort by对每个reduce结果进行排序
distribute by设置分区
cluster by =distribute by+sort by只能升序
窗体底端

17.什么是ETL

窗体顶端
ETL的英文全称是 Extract-Transform-Load 的缩写,用来描述将数据从来源迁移到目标的几个过程:
1.Extract,数据抽取,也就是把数据从数据源读出来。
2.Transform,数据转换,把原始数据转换成期望的格式和维度。如果用在数据仓库的场景下,Transform也包含数据清洗,清洗掉噪音数据。
3.Load 数据加载,把处理后的数据加载到目标处,比如数据仓库。

18. HBase跟hive有什么区别

Hive的定位是数据仓库,虽然也有增删改查,但其删改查对应的是整张表而不是单行数据,查询的延迟较高。其本质是更加方便的使用mr的威力来进行离线分析的一个数据分析工具。
HBase的定位是hadoop的数据库,是一个典型的Nosql,所以HBase是用来在大量数据中进行低延迟的随机查询的。

19.HBase 作用

存储大量结果集数据,并提供低延迟的随机查询。说的通俗一些,就是一个超级版的数据库,相比较与mysql、postgresql和oracle、sqlserver等关系型数据库而言,能够存储的数据量更大(比关系型数据库大很多很多),同时查询延迟相比较与其他hadoop产品(pig、hive)要低。

20.hbase 的结构和作用

窗体顶端
答案解析:client:使用RPC协议机制与HMaster(管理类)和

HRegionServer(数据读写类)进行通信
zookeeper:管理元数据
hmaster:通过zookeeper动态感知hregionserver,保证始终有一个master运行,HMaster,对表的管理,管理hregionserver的负载均衡,调整region分布,region split后,负责新的region的分配hregionserver上的regions迁移
HRegionServer:主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块,HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个ColumnFamily的存储。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。
HLog:每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中

21.HBase中高表和宽表的优缺点

因为HBase是列式存储的nosql,宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少,而高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大。
经过查询,总结出如下结论:
  高表优势:查询性能更好------因为查询条件都在row key中,而高表的行数据较少,所以查询缓存BlockCache能缓存更多的行;
  分片能力更强------同样因为高表中行数据少,宽表中行数据多。HBase按行(row key)来进行分片,所以分片能力更强;
  宽表优势:元数据开销较小—高表中行多,row key多,可能造成region数量也多,过大的元数据开销,可能引起HBase集群的不稳定;
  事务(业务)能力更强----宽表事务性更好。HBase对一行的写入(Put)是有事务原子性的,一行的所有列要么全部写入成功,要么全部没有写入。但是多行的更新之间没有事务性保证;
  数据压缩比更高—故名思议,宽表中行数据远远大于高表,故获得的压缩比更高。

Hbase列中没有值就插入(),占用底层物理存储很少的空间

占的空间为空值“ ”

Nil与null的区别

一、概念不同
Nil:表示无值,任何变量在没有被赋du值之前的值都为nil
Null:是在计算中具dao有保留的值。
二、功能不同
Nil:用于区别其他任何值。
Null:用于指示指针不引用有效对象。
三、针对不同
Nil:针对对象,而空对象不是说不占用空间,相当于一个“洗白”,回到初始状态。
Null:针对指针,对对象指针和非对象指针都有效,Null不会占用空间。

spark 序列化?

1.java serialization:spark默认使用java 的objectoutputSream框架来序列化对象。可以对任何实现类java.io.Serialization的任何类进行序列化。用户也可以通过集成类是吸纳更紧密的序列化性能控制;
2. Kryo serialization:spark也可以使用Kryo库(version 2)来实现更快的对象序列化。Kryo比java序列化更快、数据格式更紧凑,但不支持所有的serialization类型。用户如果希望使用kryo来获取更好的性能,需要先去注册应用程序中会使用到的类。

spark sql为什么比Hadoop快

首先,Spark Task的启动时间快。Spark采用fork线程的方式,而Hadoop采用创建新的进程的方式。
其次,Spark只有在shuffle的时候将数据写入磁盘,而Hadoop中多个MR作业之间的数据交互都要依赖于磁盘交互。
第三,Spark的缓存机制比HDFS的缓存机制高效。
所以,整体而言,Spark比Hadoop的MR程序性能要高,正常在三到四倍左右,而并不是官网所说的高几百倍

DataFrame 和 RDD 的区别

RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。DataFrame多了数据的结构信息,即schema。RDD是分布式的Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化,比如filter下推、裁剪等

spark的执行流程

1.application启动之后, 会在本地启动一个Driver进程 用于控制整个流程,(假设我们使用的Standalone模式)
2 首先需要初始化的是SparkContext, SparkContext 要构建出DAGScheduler,TaskScheduler
3 在初始化TastScheduler的时候,它会去连接master,并向master 注册Application ,master 收到信息之后,会调用自己的资源调度算法,在spark集群的work上,启动Executor,并进行资源的分配,最后将Executor 注册到TaskScheduler, 到这准备工作基本完成了
4 现在可以进行我们编写的的业务了, 一般情况下通过sc.textFile(“file”) 去加载数据源( 这个过程类似于mr的inputformat加载数据的过程), 去将数据转化为RDD,
5 DagScheduer 先按照action将程序划分为一至多个job(每一个job对应一个Dag), 之后对DagScheduer按照是否进行shuffer,将job划分为多个Stage 每个Stage过程都是taskset , dag 将taskset交给taskScheduler,由Work中的Executor去执行, 至于tast交给那个executor去执行, 由算法来决定。

为什么spark强于mr?

1spark是基于内存运算的,
2 ,spark中间结果不落地, mr每次执行完成都回将结果重新写入磁盘,
一次mr只能完成一个job, spark中的一个action相当于一个job,一个spark程序可以有多个action,中间的job计算的结果,会存放在内存中, 当内存不够的情况下 ,才会落地倒磁盘

spark 1.0和spark 2.0 的区别?

Spark2.x 引入了很多优秀特性,性能上有较大提升,API 更易用。在“编程统一”方面非常惊艳,实现了离线计算和流计算 API 的统一,实现了 Spark sql 和 Hive Sql 操作 API 的统一。Spark 2.x 基本上是基于 Spark 1.x 进行了更多的功能和模块的扩展,及性能的提升。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值