大数据面试题总结,数据面试题总结


1.HashTable,HashMap,CurrentHashMap
HashTable:哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。
HashMap:基于哈希表的Map接口实现。此实现提供所有可选的映射操作,并允许使用null值和null键。
(除了非同步和允许使用null之外,HashMap类与Hashtable大致相同。)此类不保证映射的顺序。
特别是它不保证该顺序恒久不变。
CurrentHashMap:此类与Hashtable相似,但与 HashMap不同,它不允许将null用作键或值。
2.Hive表关联查询,如何解决数据倾斜问题?
1.首先过滤掉无用的数据。
2.通过参数控制set
hive.groupby.skewinda=true;实现负载均衡,
3.通过优化sql语句,比如casewhen实现数据的负载均衡
3.Yarn的新特性
(1)ResourceManager HA
在apache hadoop 2.4或者CDH5.0.0版本之后,增加了
ResourcemManager HA特性,支持基于Zookeeper的热主备切换
(2)磁盘容错
在apache hadoop 2.4或者CDH5.0.0版本之后,增加了几个对多磁盘非常友好地参数,这些参数允许YARN更好地使用NodeManager上的多块磁盘,相关jira为:YARN-1781,主要新增了三个参数;
yarn.nodemanager.disk-health-checker.min-healthy-disks;
NodeManager上最少保证健康磁盘比例,当健康磁盘比例低于该值时,NodeManager不会在接收和启动新的Container,默认值为0.25,表示25%;
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage;一块磁盘的最高使用率,当一块磁盘使用率超过该值时,则认为该盘为坏盘,不再使用该盘,默认是100,表示100%,可以适当调低;
yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb;一块磁盘最少保证剩余空间大小,当某块磁盘剩余空间低于该值时,将不再使用该盘,默认是0,表示0MB。
(3)资源调度器
Fair Scheduler:Fair Scheduler增加了一个非常有用的新特性,允许用户在线将一个应用程序从一个队列转移到另外一个队列,比如将一个重要作业从一个低优先级队列转移到高优先级别队列,操作命令是:bin/yarn appalication -movetoqueue appID -queue targetQueueName,相关jira为:YARN-1721
Capacity Scheduler:Capacity Scheduler中资源抢占功能经过了充分的测试,可以使用了。
4.如何使用Mapreduce实现2个表的Join
常见的join方法介绍
假设要进行join的数据分别来自File1和File2
(1)reduce side join
reduce side join是一种最简单的join方式,其主要思想如下:在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签(tag),比如:tag=0表示来自文件File1,tag=2表示来自文件File2.即:map阶段的主要任务是对不同文件中的数据打标签
在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list,然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)即:reduce阶段进行实际的连接操作。
(2)map side join
之所以存在reduce side join ,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。
Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。
map side join是针对以下场景进行的优化:两个带连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中,这样,我们可以将小表复制多份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
为了支持文件的复制,Hadoop提供了一个类DistributedCache,使用该类的方法如下:
用户使用静态方法DistributedCache.addCacheFile()指定要复制的文件,它的参数是文件的URI(如果是HDFS上的文件,可以这样:hdfs://namenode:9000/home/XXX/file,其中9000是自己配置的NameNode端口号)JobTracker在作业启动之前会获取这个URL列表,并将相应的文件拷贝到各个TaskTracker的本地磁盘上。
(2)用户使用DistributedCache.getLocalCacheFiles()方法 获取文件目录,并使用标准的文件读写API读取相应的文件。
(3)SemiJoin
SemiJoin,也叫半连接,是从分布式数据库中借鉴过来的方法,它的产生动机是:对于reduce side join,跨机器的数据传输量非常大,这成了join操作的一个瓶颈,如果能够在map端过滤掉不会参加join操作的数据,则可以大大节省网络IO。
实现方法很简单;选取一个小表,假设是File1,将其参与join的key抽取出来,保存到文件File3中,File3文件一般很小,可以放到内存中。在map阶段,使用DistributedCache将File3复制到各个TaskTracker上,然后将File2中不在File3中的key对应的记录过滤掉,剩下的reduce阶段的工作与reduce side join相同。
更多关于半连接的介绍,可参考:半连接介绍;

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/weixin_41462230/article/details/78982995

相关内容

    暂无相关文章