Hadoop面试题复习(一)

Hadoop面试题复习(一)

j2ee 常用的设计模式?说明工厂模式。 分几类, 每一类包括哪些.

答: Java 中的 23 种设计模式:
, Builder (建造模式), Factory Method (工厂方法模式),
Prototype (原始模型模式),, Facade (门面模式),
, Bridge (桥梁模式), Composite (合成模式),
, Flyweight (享元模式),

Proxy (代理模式) -> AOP( jdk代理, cglib代理 ) ,
Factory (工厂模式) -> beanFactory spring IOC
Singleton (单例模式) -> 创建数据联接, 创建资源
Adapter (适配器模式) -> Adaptor -> swing,swt事件机制
接口
抽象方法1();
抽象方法2();

                      抽象类 实现接口
                           抽象方法1(){}
                           抽象象方法2(){}

                      自定义的类  继承 抽象类{
                           只重写对应的方法(){   xxx }
                      }

Decorator (装饰模式) -> IO流
new BufferedInputStream( new FileInputStream( new File() ) )

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,
通常这一组类有一个公共的抽象父类并且 实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。
首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个 工厂类,工厂类可以根据条件生成不同的子类实例。
当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

131 、 UML 包括哪些方面 统一建模语言,分析方法.
答: 标准建模语言 UML 。
用例图: 角色-功能 ,
静态图 ( 包括类图、对象图和包图 ),
行为图: ,
交互图 ( 顺序图 , 合作图 ): 顺序图:

一、什么是索引?
一种用于提升查询效率的数据库对象;
通过快速定位数据的方法,减少磁盘I/O操作;
 索引信息与表独立存放;
 ORACLE数据库自动使用和维护索引;
二、索引的分类
唯一性索引;
非唯一性索引;
三、索引的创建

自动创建:在定义主键或唯一键约束时系统会自动在相应的字段创建唯一性索引;
手动创建:用户可以在其他列上创建非唯一性索引;

四、索引优缺点

优点:
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;

五、创建索引的原则

创建索引:创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。
1.在select操作占大部分的表上创建索引;
2.在where子句中出现最频繁的列上创建索引;
3.在选择性高的列上创建索引(补充索引选择性,最高是1,eg:primary key)
4.复合索引的主列应该是最有选择性的和where限定条件最常用的列,并以此类推第二列……。
5.小于5M的表,最好不要使用索引来查询,表越小,越适合用全表扫描。

六、使用索引的原则

1.查询结果是所有数据行的5%以下时,使用index查询效果最好;
2. where条件中经常用到表的多列时,使用复合索引效果会好于几个单列索引。因为当sql 语句所查询的列,全部都出现在复合索引中时,
此时由于 Oracle 只需要查询索引块即可获得所有数据,当然比使用多个单列索引要快得多;
3.索引利于select,但对经常insert,delte尤其update的表,会降低效率。
例如:试比较下面两条SQL语句(emp 表的deptno列上建有ununique index):
语句A:SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);
语句B:SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);
这两条查询语句实现的结果是相同的,但是执行语句A的时候,ORACLE会对整个emp表进行扫描,没有使用建立在emp表上的deptno索引,
执行语句B的时候,由于在子查询中使用了联合查询,ORACLE只是对emp表进行的部分数据扫描,并利用了deptno列的索引,所以语句B的效率要比语句A的效率高。
3. where 子句中的这个字段,必须是复合索引的第一个字段;
例如:一个索引是按f1, f2, f3的次序建立的,若where 子句是f2 = : var2, 则因为f2 不是索引的第1个字段,无法使用该索引。
4. where 子句中的这个字段,不应该参与任何形式的计算:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
5.应尽量熟悉各种操作符对 Oracle 是否使用索引的影响:以下这些操作会显式(explicitly)地阻止 Oracle 使用索引:
is null ; is not null ; not in; !=; like ; numeric_col+0;date_col+0; char_col||‘ ’;
to_char; to_number,to_date 等。
例如: Select jobid from mytabs where isReq=‘0’ and to_date (updatedate) >= to_Date ( ‘2001-7-18’, ‘YYYY-MM-DD’);–updatedate列的索引也不会生效。

七、创建索引

create index abc on student(sid,sname);
create index abc1 on student(sname,sid);
这两种索引方式是不一样的
索引abc对Select * from student where sid=1; 这样的查询语句更有效
索引abc1对Select * from student where sname=‟louis‟; 这样的查询语句更有效
因此建立索引的时候,字段的组合顺序是非常重要的。一般情况下,需要经常访问的字段放在组合字段的前面

八、索引的存储

索引和表都是独立存在的。在为索引指定表空间的时候,不要将被索引的表和索引指向同一个表空间,这样可以避免产生IO冲突。
使Oracle能够并行访问存放在不同硬盘中的索引数据和表数据,更好的提高查询速度。

八、删除索引

drop index PK_DEPT1;

九、索引类型

B树索引(B-Tree Index)
创建索引的默认类型,结构是一颗树,采用的是平衡B树算法:
右子树节点的键值大于等于父节点的键值
左子树节点的键值小于等于父节点的键值
比如有数据:100,101,102,103,104,105,106
位图索引(BitMap Index)
如果表中的某些字段取值范围比较小,比如职员性别、分数列ABC级等。只有两个值。这样的字段如果建B树索引没有意义,不能提高检索速度。这时我们推荐用位图索引
Create BitMap Index student on(sex);

一、管理索引

1)先插入数据后创建索引
向表中插入大量数据之前最好不要先创建索引,因为如果先建立索引。那么在插入每行数据的时候都要更改索引。这样会大大降低插入数据的速度;
2)设置合理的索引列顺序 ;
3)限制每个表索引的数量 ;
4)删除不必要的索引;
5)为每个索引指定表空间;
6)经常做insert,delete尤其是update的表最好定期exp/imp表数据,整理数据,降低碎片;有索引的最好定期rebuild索引(rebuild期间只允许表的select操作,
可在数据库较空闲时间提交),以降低索引碎片,提高效率 。

hive 内部表和外部表区别?

 创建表时:创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
删除表时:在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。

内部表(管理表)和外部表的区别:
内部表(managed table):
(1) 也叫管理表,数据由hive自身管理,数据存储位置为 hive,metastore,warehouse.dir
(2) 对数据拥有完全的控制权限,删除表时存储在RDBMS上的元数据和存储在HDFS上的数据全部被删除。
(3) 默认创建的表是管理表(内部表)
外部表(external table):
(1) 数据由HDFS管理,数据的存储位置由自己制定。
(2) 删除表时之删除存储在RDBMS上的元数据,存储在HDFS上的数据不会被删除
(3) 需要用external关键字来创建外部表
(4) 外部表可以建立在已经存在的数据上而无需load
(5) 外部表不能使用truncate(清空),因为没有权限。

描述 HBase 的 rowKey 的设计原则?
① Rowkey 长度原则
Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,不过建议是越短越好,不要超过 16 个字节。
原因如下:
(1)数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 Rowkey 过长比如 100个字节,1000 万列数据光 Rowkey 就要占用 100*1000 万=10 亿个字节,将近 1G 数据,这会极大影响 HFile 的存储效率;
(2)MemStore 将缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。因此 Rowkey 的字节长度越短越好。
(3)目前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节,8 字节
的整数倍利用操作系统的最佳特性。

② Rowkey 散列原则
如果Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,
这样将提高数据均衡分布在每个Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个 RegionServer 上堆积的热点现象,
这样在做数据检索的时候负载将会集中在个别 RegionServer,降低查询效率。
③ Rowkey 唯一原则
必须在设计上保证其唯一性。

简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?

在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile的数量达到一定程度后,就需要将 storefile 文件来进行 compaction 操作。
Compact 的作用:
① 合并文件
② 清除过期,多余版本的数据
③ 提高读写数据的效率
HBase 中实现了两种 compaction 的方式:minor and major. 这两种 compaction 方式的
区别是:
1、Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过
期版本清理,不做任何删除数据、多版本数据的清理工作。
2、Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果
是整理合并出一个文件。

如何提高 HBase 客户端的读写性能?请举例说明

1 开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 3、4 倍
2 Hbase 对于内存有特别的需求,在硬件允许的情况下配足够多的内存给它
3 通过修改 hbase-env.sh 中的
export HBASE_HEAPSIZE=3000 #这里默认为 1000m
4 增大 RPC 数量
通过修改 hbase-site.xml 中的 hbase.regionserver.handler.count 属性,可以适当的放大RPC 数量,默认值为 10 有点小。

Zookeeper 下 Server工作状态
每个Server在工作过程中有三种状态:
LOOKING:当前Server不知道leader是谁,正在搜寻
LEADING:当前Server即为选举出来的leader
FOLLOWING:leader已经选举出来,当前Server与之同步

shuffle过程?
shuffle在MapReduce中有,在spark中也有,其实他们两个是不同的。
MapReduce中的shuffle是Map之后Reduce之前的一个操作。Map结束后数据会首先写入一个环形缓冲区中,这个环形缓冲区默认100M,
每次当环形缓冲区达到80%满的时候,会先将数据进行一个二次快速排序(先按分区排,再按key排),然后将数据都会溢写到磁盘上生成一个新文件,
每一个map对应的新文件可能有多个,在reduce开始前,会先将所有溢写生成的小文件进行一个merge操作,将它们合并成一个大文件,在这个大文件内包括数据索引和数据本身。
如果在Reducer之前有Combiner操作的话,数据送入到Reducer之前还会进行Combiner操作。
Spark与Hadoop之间的Shuffle过程大致类似,Spark的Shuffle的前后也各有一次聚合操作。
但是也有很明显的差别:Hadoop的shuffle过程是明显的几个阶段:map,spill,merge,shuffle,sort,reduce等,是按照流程顺次执行的,
而Spark不一样,因为Spark的Shuffle没有这么明确的功能阶段,所有的这些功能都依靠算子完成。
Spark与Hadoop的Shuffle之间第二个明显的差别是:Hadoop的Shuffle是sort-based类型的,
而Spark的Shuffle是hash-based类型的,这意味着数据进入Reduce端时不会进行预排序。

Hadoop的sequencefile的格式,并说明下什么是java序列化,如何实现java序列化?

equenceFile文件是Hadoop用来存储二进制形式的key-value 对而设计的一种平面文件;Hadoop 的HDFS 和MapReduce子框架主要是针对大数据文件来设计的,
在小文件的处理上不但效率低下,而且十分消耗磁盘空间(每一个小文件占用一个Block,HDFS 默认block大小为64M)。
解决办法通常是选择一个容器,将这些小文件组织起来统一存储。HDFS提供了两种类型的容器,分别是SequenceFile和MapFile。
SequenceFile的每条记录是可序列化的字符数组。
序列化是指将结构化的对象转化为字节流以便在网络上传输或写入到磁盘进行永久存 储的过程,反序列化是指将字节流转回结构化对象的过程.

HiveRc文件?
Hive 启动时,会先执行 HiveRc文件。例如每次都会使用的 UDF,UDAF 等用户自定义函数,不必每次都命名,可以直接写入HvieRc文件。

HBase 优化?

1)高可用
在 HBase 中 Hmaster 负责监控 RegionServer 的生命周期,均衡 RegionServer 的负载,如果 Hmaster 挂掉了,
那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以 HBase 支持对 Hmaster 的高可用配置。

(2)预分区
每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的rowKey 范围,
则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能 .

(3)RowKey 设计
一条数据的唯一标识就是 rowkey,那么这条数据存储于哪个分区,取决于 rowkey 处于哪个一个预分区的区间内,
设计 rowkey 的主要目的 ,就是让数据均匀的分布于所有的 region中,在一定程度上防止数据倾斜。接下来我们就谈一谈 rowkey 常用的设计方案

(4)7.4 内存优化
HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,
因为 GC 过程持续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

(5)基础优化

列举几个hadoop生态圈的组件并做简要描述

Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。

Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。

Hbase:是一个分布式的、面向列的开源数据库, 利用Hadoop HDFS作为其存储系统.

Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据档映射为一张数据库表,并提供简单的sql 查询功能,可以将sql语句转换为MapReduce任务进行运行。

Sqoop:将一个关系型数据库中的数据导进到Hadoop的 HDFS中,也可以将HDFS的数据导进到关系型数据库中。

mapred.job.tracker 命令的作用

连接jobtrack服务器的配置项,默认不写是local,在本地运行,默认 map 数1,reduce数1。

Hbase是什么?

(1) Hbase一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper进行管理。
(2) Hbase适合存储半结构化或非结构化数据,对于数据结构字段不够确定或者杂乱无章很难按一个概念去抽取的数据。
(3) Hbase为null的记录不会被存储.
(4)基于的表包含rowkey,时间戳,和列族。新写入数据时,时间戳更新,同时可以查询到以前的版本.
(5) hbase是主从架构。hmaster作为主节点,hregionserver作为从节点。

zk的配置管理(文件系统、通知机制)

程序分布式的部署在不同的机器上,将程序的配置信息放在zk的znode下,当有配置发生改变时,
也就是znode发生变化时,可以通过改变zk中某个目录节点的内容,利用watcher通知给各个客户端,从而更改配置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要沉默我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值