基础
1、 hashmap的初始值大小---16
2、 ArrayList的初始值大小---10
3、 hashmap的排序问题
Map
map.put("d", 2);
map.put("c", 1);
map.put("b", 1);
map.put("a", 3);
List
new ArrayList
//排序
Collections.sort(infoIds, new Comparator
public int compare(Map.Entry
//return (o2.getValue() - o1.getValue());
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
4、 Java异常 多线程
java中广义的异常是指Throwable接口,这个接口下有两个实现类:Error和Exception。Error表示严重的错误,一旦产生,则不做处理或者重写代码;如果是Exception,分为检查异常和运行异常。检查异常在出现时必须处理,或者抛出或者捕获;运行异常在出现时可以处理可以不处理。
多线程是指一个进程中多个逻辑后者任务的执行,会产生安全问题,为了解决这个问题,可以利用同步代码块或者lock()方法
5、 Java String
String类是用final修饰的,因此不可被继承,其中重写了equals和hashCode方法,因此调用equals方法时比较的是两个字符串的值;String提供了比较多的构造方法,需要注意不同的构造方法所产生的对象的个数也不一样。用+连接运算拼接字符串的时候,调用的是StringBuilder中的append方法
6、 string stringbuffer stringbuilder对比
这三个类都是final修饰的,都不可以被继承。String这个类是线程不安全的,其中的+连接运算用的是StringBuilder中的append方法,每一次的+都会产生一个新的StringBuilder,concat方法是将字符串转化为字符数组之后再进行合并,然后转化为字符串。StringBuilder和StringBuffer中的方法几乎一致,其不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。
7、 string常量池
常量池是在方法区中的,用于存储计算机中的常量
8、 Finally final
finally是异常中用于异常处理捕获后的一些后续操作的关键字,final可以用来修饰类、方法和属性。修饰类这个类不能被继承,修饰方法这个方法不能被重写可以被重载,final不能修饰抽象方法;修饰属性这个属性在被初始化之后就不能在被改变(对于基本类型的数据而言是值不可变,对于引用类型而言是地址不可改变)
9、 wait notify
这两个方法都是设计在了Object类上,因此任何一个类产生的对象都可以调用这两个方法。wait方法会使当前执行的对象转入冻结状态;notify方法使冻结的对象转入活跃状态
10. sleep
11、gc垃圾回收原理
GC的工作原理: 引用计数,标记复制
"引用计数"是一种简单但速度很慢的垃圾回收技术.所有对象都有一个引用计数器,当有引用连接时计数器加1,当引用离开作用域时或者被置于NULL时,计数器-1,垃圾回收器会在所以包含对象引用的列表上进行遍历,当发现某个对象的引用计数为0时,就释放占用的空间.
"标记复制"的运行机制,垃圾回收器遍历包含所有引用的列表,当发现存活的对象引用时做上标记,这样当遍历完所有对象引用并做上标记的时候,执行垃圾回收,将没有标记的对象堆空间释放.
12、jvm内存管理机制
将内存空间划分为堆、JVM方法栈、方法区、本地方法栈、PC寄存器。
堆:堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例;当空余堆内存大于70%时,JVM会减小Heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRatio=来指定这个比例,对于运行系统而言,为避免在运行时频繁调整Heap 的大小,通常将-Xms和-Xmx的值设成一样。
JVM方法栈:为线程私有,其在内存分配上非常高效。当方法运行完毕时,其对应的栈帧所占用的内存也会自动释放。当JVM方法栈空间不足时,会抛出StackOverflowError的错误,在Sun JDK中可以通过-Xss来指定其大小。
方法区:要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。在Sun JDK中这块区域对应Permanet Generation,又称为持久代,默认最小值为16MB,最大值为64MB,可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值。
本地方法栈:用于支持native方法的执行,存储了每个native方法调用的状态。在Sun JDK的实现中,和JVM方法栈是同一个。
PC寄存器:占用的可能为CPU寄存器或操作系统内存。
13、多线程安全
多线程安全是通过synchronize代码块或者lock()方法进行控制来保障其安全性的,但是也有可能造成死锁等为题
14、map的实现类有哪些
HashTable,HashMap,LinkedHashMap,TreeMap等
15、hashmap存储原理
HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象。当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每个 LinkedList 节点中储存键值对对象。
16、抽象类和接口的作用
抽象类是将一些类中的共有属性和方法进行抽取,其中一些共有方法由于实现细节不一样,因此以抽象方法的形式存在。接口更类似于一个标准,定义实现这个接口的实例中的方法,但是具体的实现细节不用这个接口来管理。
17、java的反射
Class,Method,Constructor,Field这四个类是java实现反射的API。在一些场景下无法直接通过new关键字来创建变量,例如配置文件中数据库的配置,那么这时候就需要用反射来完成相关的操作
18、int和Integer所有区别?
int是基本数据类型,其变量是存储到占内存中的,其上是没有任何方法的。Integer是一个引用数据类型,是int的包装类,其中含有大量的方法。
19、String和StringBuffer的区别?
参照6
20、说出ArrayList,vector,LinkedList的存储性能和特性?
ArrayList是基于数组的,其内存空间是连续的,因此存储的时候更快一些,便于查询不便于增删;vector是基于数组的,其内存空间也是连续的,由于它线程的安全性,因此存储的时候相对较慢;LinkedList是基于指针(链表)的,因此内存空间是不连续的,其便于增删不便于查询
21、&和&&的区别?
&可以是位运算也可以是逻辑运算,&&是逻辑运算,在运算的时候如果前面的表达式为false,则&&后的表达式就不在进行
22、final,finally,finalize的区别?
final和finally参看8,finalize是gc中的方法,程序员可以调用这个方法通知过程进行内存的回收
23、程序中捕获异常的方法?
try-catch-finally代码块
24、用最有效的方法算出2乘以8等于几
2<<3
25、写一个方法,用一个for循环打印九九乘法表
for (int i = 1, j = 1; j <= 9; i++) {
System.out.print(i + "*" + j + "=" + i * j + " ");
if (i == j) {
i = 0;
j++;
System.out.println();
}
}
26、如何避免java多线程的死锁
减少共享资源,避免锁嵌套
27、两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?
对,如果重写equals和hashcode方法可能会出现这种情况
28、重载和重写的主要区别是什么?重载的方法能否根据返回类型进行区别?
重载是发生在了一个类中,只看同名方法中的参数列表是否相同,对修饰符和返回值类型没有限制;重写是放生在了父子类中,函数同名,参数列表一致,权限修饰符要大于等于父类,返回值类型要小于等于父类;重载是编译时多态,重写是运行时多态。
29、抽象类和接口有什么区别?
抽象类中允许存在实体方法,允许存在静态方法,有构造函数,有变量;接口中没有实体函数,没有静态函数,变量默认是静态常量
30、tcp和udp的区别
UDP:没有建立连接;不可靠的传输;底层是用流进行传输;传输速度快;进行封包
TCP:需要建立连接;底层用的也是流进行数据的传输;经过三次握手,是一个可靠的连接;不限制数据的大小;安全性比较高,但是传输速度比较
SQL部分
1、sql语句题
|mobile|date
|13972647899|时间
|13927484736|时间
|13627274848|时间
- 各个手机号码出现的次数?
Select mobile,count(mobile) from tab group by mobile;
b.手机号码前三位各自出现的次数?
Select left(mobile,3) headnum,count(left(mobie,3)) from tab group by headnum;
2、sql group by having的使用场景
Group by 进行分组查询
Having 在分组后进行过滤
3、事务种类
Uncommitted
Read committed
Repeatable read
Serializable
4、大量数据处理方法
总体思路:分而治之 最终汇总
方式一:单机模式下,内存有限,可以将要处理的数据进行分块,依次加载入内存,进行处理,最终进行汇总,灵活利用分桶、分区的思想,对数据进行处理
方式二:利用多机处理,将数据分块后,并行在多台机器中进行处理,最终汇总,即分布式处理。目前有成熟的分布式大数据处理框架,如hadoop、storm、spark等。
5、sql关键字 例如trancate和delete的比较
Delete 删除数据,可以删除表中的部分行,也可以删除正表数据,删除时是真的去移除表中记录,所以删除正表数据时,如果数据量较大,效率会比较低。
Trancate删除数据,只能删除整表数据,原理是直接摧毁表,再重新创建表,效率会很高,但是只能删除整表数据,无法进行部分数据的删除。
6、trancate是啥?
参考题10
7、where和having的区别
Where用来在分组之前过滤,having用来在分组之后过滤。
Where语句中不能出现聚合函数,having可以
8、乐观锁和悲观锁的区别
都是用来解决更新丢失问题的方案。
悲观锁通过在查询阶段加排他锁在在查询阶段就避免了更新丢失的可能
乐观锁通过版本字段进行检测,在修改阶段检查更新丢失,如果发现产生了更新丢失再进行补救。
根据其特点,如果查询多而修改少,则用乐观锁,如果查询少而更新多,则用悲观锁。
9、select有事务吗
看隔离级别,默认情况下非Serializable隔离级别下查询不加锁,Serializable隔离级别下查询加共享锁。也可以根据需要在查询阶段手动加锁。
10、学生表 学生 课程关系表 课程表
三表的关联查询 group by使用
11、sql 查找学生成绩都大于80的学生姓名;
Student S# Sname Sage Ssex 学生表
Course C# Cname T#课程表
SC S# C# score 成绩表
Teacher T# Tname 教师表
select * from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by sc.sname having min(sc.score)>80;
12、sql 删除按姓名分组后对应成绩最小的学生;
Delete from student where sname = (
Select sname from (Select Student.sname from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by sc.sname order by sum(sc.score) asc limit 0,1) a) ;
13、如何防止sql注入
使用preparedstatment防止sql注入
14、写出学生表的建表语句
Create table student (sid int primary key auto_increment,sname varchar(20),sage int,ssex varchar(1));
15、查询姓“张”的学生名单
Select * from student where sname like ‘张%’;
16、查询所有学生的学号、姓名、选课数、总成绩
select student.sid,student.sname,count(course.cname),sum(sc.score) from student,course,sc where sc.sname=student.sname and sc.cname=course.cname group by student.sid;
17、查询选修“叶萍”老师所授课程的学生中,成绩高的学生姓名及其成绩
Select student.sname,sum(sc.score) from student,course,sc,teacher where student.sname = sc.sname and course.cname = sc.cname and teacher.tname =course.tname and teacher.tname = ‘叶萍’ group by student.sname order by sum(sc.score) desc limit 0,1 ;
18、在数据库中,查看表中重复记录
Select * from tab group by colm having count(colm)>1;
大数据
- hadoop和spark的应用场景?
SparkSpark是一个基于内存计算的开源集群计算系统,目的是更快速的进行数据分析。Spark由加州伯克利大学AMP实验室Matei为主的小团队使用Scala开发开发,类似于Hadoop MapReduce的通用并行计算框架,Spark基于Map Reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点,但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的Map Reduce的算法。
Spark的适用场景:
1)多次操作特定数据集的应用场合
Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小。
2)粗粒度更新状态的应用
由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如Web服务的存储或者是增量的Web爬虫和索引。就是对于那种增量修改的应用模型不适合。
总的来说Spark的适用面比较广泛且比较通用。
Hadoop是实现了MapReduce的思想,将数据切片计算来处理大量的离线数据数据。Hadoop处理的数据必须是已经存放在HDFS上或者类似HBase的数据库中,所以Hadoop实现的时候是通过移动计算到这些存放数据的机器上来提高效率。
Hadoop的适用场景:
1)海量数据的离线分析处理
2)大规模Web信息搜索
3)数据密集型并行计算
- 数据处理都要经过哪些步骤?
数据采集 提取清洗 整合汇聚 存储 分析处理 可视化展示
- 做的项目最后生成报表目的是什么?
原始数据量通常大而混杂,隐含着大量业务内容,通过分析计算后通过报表形式表现数据背后隐含的数据含义。
- 你做的项目中数据来源都有哪些?
网站后台日志
传统数据库历史数据
网站实时数据流
爬虫采集
等等
- 你会什么脚本语言?请用一种脚本语言将某条日志数据写到hive表中?
Shell
Python
。。。。。根据自身情况回答。。。。。
- hive如何从hbase中读取数据?
参考文档:使用hive读取hbase数据.mht
- hdfs工作原理.
简单来说,将大文件进行切块上传到hdfs集群中进行分布式存储,利用集群的力量提高海量数据处理时的吞吐能力。另外块在保存时会自动进行备份操作,默认3份,从而保证了集群中数据的可靠性。
- zookeeper相关知识介绍
zookeeper是一个开放源码的分布式协调服务,是一种典型的分布式数据一致性解决方案。由雅虎创建,贡献给了apache。
利用zookeeper可以实现数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能。
具有 顺序一致性 原子性 单一视图 可靠性 实时性的特点
采用选举 投票 过半同意 的机制保证了分布式数据协调时的数据一致性。
- hdfs的角色
Hadoop分布式数据存储技术。
是mapreduce hbase hive 等技术采用的底层分布式数据存储技术
- flume的扇入扇出
flume是分布式的,可靠的,用于从不同的来源有效收集 聚集 和 移动 大量的日志数据用以集中式的数据存储的系统。
可以通过自由配置agent来实现日志的收集汇聚传输存储。可以实现收集日志时多级传输、扇入、扇出等操作,并支持负载均衡失败恢复,实现日志的可靠传输。
扇入,即多个agent向一个agent发送日志,通常用来实现日志信息的汇聚。
删除,即一个agent向多个agent发送日志,可以采用复制或路由方式工作,通常用来实现日志的分发。
- hive的建表 hive如何存储数据
create table book (id bigint, name string) partitioned by (category string) row format delimited fields terminated by '\t';
hive中的数据以文件的形式保存在hdfs文件系统中。Hdfs文件中的一行对应hive表中的一行数据,字段间通过指定分隔符进行分隔。
- hadoop版本
Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0。第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则NameNode HA等新的重大特性。第二代Hadoop包含两个版本,分别是0.23.x和2.x,它们完全不同于Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN两个系统,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility两个重大特性
- hive有几个模块
HiveQL:这是Hive的数据查询语言,与SQL非常类似。Hive提供了这个数据查询语言与用户的接口,包括一个
shell的接口,可以进行用户的交互,以及网络接口与JDBC接口。
JDBC接口可以用于编程,与传统的数据库编程类似,使得程序可以直接使用Hive功能而无需更改
Driver: 执行的驱动,用以将各个组成部分形成一个有机的执行系统,包括会话的处理,查询获取以及执行驱动
Compiler:Hive需要一个编译器,将HiveQL语言编译成中间表示,包括对于HiveQL语言的分析,执行计划的生成以及优化等工作
Execution Engine:执行引擎,在Driver的驱动下,具体完成执行操作,包括MapReduce执行,或者HDFS操作,或者元数据操作
Metastore:用以存储元数据:存储操作的数据对象的格式信息,在HDFS中的存储位置的信息以及其他的用于数据转换的信息SerDe等
- Java nio nio组成部分(channel buffer selector)
Java的非阻塞式io
Jdk5开始提供。
解决了传统java bio阻塞式工作,服务器无法在高并发场景下实现少量线程处理多客户端请求的问题。
由channel buffer selector组成
Channel称为通道,类比bio中的流,实现数据传输,但不同的是,为双向传输。
Buffer为缓冲区,channle面向缓冲区进行数据处理
Selector为选择器,多个通道可以注册到一个选择器中,通过少量线程从selector中选择就绪通道进行处理,从而实现少量线程处理多个客户端通道的效果。
- hive和hbase比较一下,各自优势,应用场景
hive和hbase的底层都是通过hdfs进行数据存储,通过mapreduce进行数据处理。
但应用场景不同,hive是基于hadoop的数据仓库工具,通过类sql的方式进行操作,简化了离线数据的处理过程,但是仍然是一种离线数据处理工具。
Hbase则是基于hadoop的非关系型数据库。可以实现毫秒级别的实时查询,是一种在线数据库系统。相对于传统的数据,适合于存储非结构化半结构化的数据,按列存储、通过rowkey来实现查询,可以存储海量数据。
- 用大数据生态的那个组件做过项目,做了什么,怎么做的?具体处理流程。
可以描述下zebra/网站流量分析项目的流程。
- mapreduce过程
从物理过程来讲:
客户端提交一个mr的jar包给JobClient(提交方式:hadoop jar ...)
JobClient通过RPC和ResourceManager进行通信,返回一个存放jar包的地址(HDFS)和jobId
client将jar包写入到HDFS当中(path = hdfs上的地址 + jobId)
开始提交任务(任务的描述信息,不是jar, 包括jobid,jar存放的位置,配置信息等等)
JobTracker进行初始化任务
读取HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个MapperTask
TaskTracker通过心跳机制领取任务(任务的描述信息)
下载所需的jar,配置文件等
TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
将结果写入到HDFS当中
从逻辑过程来讲:
map任务处理
读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
对输出的key、value进行分区。
对相同分区的数据,按照key进行排序(默认按照字典顺序进行排序)、分组。相同key的value放到一个集合中。
(可选)分组后的数据进行归约。
reduce任务处理
对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程并不是map将数据发送给reduce,而是reduce主动去获取数据。
对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
把reduce的输出保存到文件中。
简单来说,整个过程经过:map suffle (partition sort combiner spile merge)reduce
- hbase的region
hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中
这样做的目的是在查询时可以将工作量分布到多个RegionServer中以提高速度
region由[startkey,endkey)表示
HRegion是hbase分布式存储和负载均衡的最小单元
要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,因为内存空间毕竟是有限的)中存储数据以提高查询性能,对于修改会将数据同步到hdfs中,以持久化数据。
hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位 如果相同再比较第二位。。。)按序存储,所以当以rowkey查询数据时,可以提高速度。
hregion的分裂,当hregion变的很大时会分裂成两个,存放到不同的RegionServer中,防止一个Region过大,导致查询其中数据时速度很慢
- hbase和hive区别
参考18题
- hbase如何导入超大文件
将文件导入hbase主要有三种方式,应对与不同应用场景:
(1) 使用HBase的API中的Put方法 - 单机效率低,适用于少量数据的场景
(2) 使用bulk load 工具从TSV文件中导入数据 – hbase提供更的工具,效率高,可以处理大文件,但只能处理固定格式的文件。
(3)自己编写mapreduce来进行导入操作 – 灵活,能处理大量的数据及各种格式,但是需要手动编写mr
- hbase行键建立时需要注意哪些?
~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唯一原则
必须在设计上保证其唯一性。
- hive怎样实现分页查询?
~借助唯一标识字段
如果分页的表有唯一标识的字段,可以通过这个字段来实现分页:
获取第一页数据:
注:同时需要记录这10条中最大的id为preId,作为下一页的条件。
select * from table order by id asc limit 10;
获取第二页数据:
注:同时保存数据中最大的id替换preId。
select * from table where id >preId order by id asc limit 10;
后续的页数获取同理。
~使用row number()函数
如果分页的表没有唯一标识的字段,可以通过row number()函数来实现分页。
首先使用row number()函数来给这个表做个递增的唯一标识:
create table newtable as select row number(1) as id ,* from table;
通过row number函数给表加了唯一标识之后,就可以利用第一个方法来进行分页
- 介绍下hbase写入数据流程
数据在更新时首先写入Log(WAL log)和内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并 且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时,系统会在zookeeper中 记录一个redo point,表示这个时刻之前的变更已经持久化了。(minor compact)
当系统出现意外时,可能导致内存(MemStore)中的数据丢失,此时使用Log(WAL log)来恢复checkpoint之后的数据。
前面提到过StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更 新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行split,等分为两个StoreFile。
- 我给他介绍hbase行键列簇建立时注意事项时说建立行键尽量不要用数字,他问为什么不能
虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为String类型,保证通用性;如果在开发过程中将RowKey规定为其他类型,譬如Long型,那么数据的长度将可能受限于编译环境等所规定的数据长度。
- 了解region么?介绍下,数据插入region会怎样?然后说完了又问region怎样让他不分裂?
a) 将hbase.hregion.max.filesize配置的足够大
b) 在hbase-site.xml配置文件中,添加:
name为hbase.regionserver.region.split.policy
value为org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy
- flume数据源有哪些?使用过http+AVro搭配吗?
Avro Source
Exec Source
Spooling Directory Source
NetCat Source
Sequence Generator Source
HTTP Source
Custom source
- 要做一个类似Hadoop 的软件,如何做架构,api接口如何设计?
参考zebra的java实现
- hbase内部原理;
hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中
这样做的目的是在查询时可以将工作量分布到多个RegionServer中以提高速度
HRegion是hbase分布式存储和负载均衡的最小单元
要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,因为内存空间毕竟是有限的)中存储数据以提高查询性能,对于修改会将数据同步到hdfs中,以持久化数据。
hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位 如果相同再比较第二位。。。)按序存储,所以当以rowkey查询数据时,可以提高速度。
hregion的分裂,当hregion变的很大时会分裂成两个,存放到不同的RegionServer中,防止一个Region过大,导致查询其中数据时速度很慢
为什么hbase可以很快:
从逻辑结构上来说:
表按照行键进行了排序,所以查询时可以很快定位
数据按照行键切分为多个HRegion,分布在多个RegionServer中,查询大量数据时,多个RegionServer可以一起工作,从而提高速度
从物理结构上来说:
HRegion是存活在RegionServer的内存中的,读写会非常的高效
还有HFile和HLog的支持保证大量的数据可以保存
数据最终落地到HDFS中,分布式的存储,保证数据段可靠性和可扩展性
为什么hbase可以存储很多数据:
基于hdfs,所以支持可扩展性,可以通过增加大量的廉价的硬件提高存储容量
按列存储,空的数据不占用空间,当存储稀疏数据时,不会浪费空间
按列存储,同一列的数据存放在一起,而同一列的数据一般都是同样的类型的内容相似的数据,可以实现非常高效的压缩,节省空间
为什么hbase的数据是可靠的:
基于hdfs,由hdfs的可靠性保证了hbase的可靠性--即数据可以有多个备份
利用zookeeper实现了HA,即使某一台机器挂掉另外的机器也可以很快的替换它
- nio io区别,高并发编程
Nio 非阻塞失IO,面向通道操作缓冲区,在执行READ WRITE CONNECT ACCEPT 操作时不会产生阻塞。
BIO 传统IO,面向流操作字节/字符。在执行READ WRITE CONNECT ACCEPT操作时会有阻塞。
传统BIO由于执行如上四种操作时,会产生阻塞所以无法实现用少量线程处理多个客户端通道的连接。
NIO利用非阻塞特点,解决了该问题,从而实现了高并发场景下服务器的开发需求。
- hadoop1和hadoop2的区别
引入了yarn进行资源调度。
增加了NameNode的高可用机制
- hdfs原理,以及各个模块的职责?
将文件切块,分别存放在集群中不同的机器中,并且进行备份,保证数据的可靠性。
NameNode:hdfs元数据保存的场所
SecondaryNameNode: NameNode辅助者,帮助NameNode实现日志数据合并。
DataNode:存放数据块。
- 数据倾斜产生的原因,用mapreduce如何处理数据倾斜问题?
数据来源中数据本身不均衡。
解决方案:合理设计partition
- SecondaryNamenode做fsimage和edit日志文件合并有什么意义,为什么要这样做;
SecondaryNameNode并不是NameNode的热备份,而是协助者帮助NameNode进行元数据的合并,从另外的角度来看可以提供一定的备份功能,但并不是热备,这种合并过程可能会造成极端情况下数据丢失!可以从ssn中恢复部分数据,但是无法恢复全部。
NameNode是hdfs存放元数据的场所,工作非常繁忙,如果让NameNode来执行进行日志合并操作,必然会导致NameNode压力增大,另外在合并期间NameNode无法响应外部写需求,造成hdfs可用性下降。
- 简述zookeeper,是干什么用的;
zookeeper是一个开放源码的分布式协调服务,是一种典型的分布式数据一致性解决方案。由雅虎创建,贡献给了apache。
利用zookeeper可以实现数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能。
- 说一下hadoop写文件的流程
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定。
开始以pipeline(管道)的形式将packet写入所 有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。
- 假如在集群运行中将数据块A移动到B,namenode是怎么知道的
在datanode的心跳包的响应中,namenode向datanode发送指令进行操作。
在执行过程中,datanode向namenode进行汇报。
- Yarn在集群中起到什么作用?zookeeper在集群中起到什么作用?
Yarn mapreduce的资源调度框架
Zookeeper 集群协调服务
- Hadoop配置文件
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
- HadoopHa集群中个服务的启动和关闭顺序
启动zookeeper集群
启动journalnode集群
启动namenode
启动datanode
启动zkfc
- HDFS中block块默认保存几份?默认block size多大?
3份 64MB(128MB)
- Namenode中meta数据是存放在NameNode自身,还是DataNoda等其他节点?Data节点自身是否有meta数据存在?
meta数据保存在namenode中,包括文件结构树信息、文件和Block之间关系的信息、Block数量信息、Block和DataNode之间的关系信息。Datanode不存储元数据,但是当集群启动时,datanode需要向namenode汇报当前datanode中保存的块信息,便于namenode构建block和datanode之间的映射关系。
- 下面那个程序同行仓与NameNode在一个节点启动?- C
A: SecondaryNameNode B: DataNode C:TaskTracker D:jobtra
- 在HadoopHA集群中Zookeeper主要作用,以及启动和查看状态的命令?
两个namenode之前的状态监控及ha时的协调。
- Hbase 在进行模型设计时重点在什么地方?一张表中定义多少个column Family最合适?为什么?
- 如何提高Hbase客户端读写性能?请举例说明。
~开启bloomfilter过滤器,开启bloomfilter比没开启要快3、4倍
~在硬件允许的情况下配足够多的内存给它
通过修改hbase-env.sh中的
export HBASE_HEAPSIZE=3000 #这里默认为1000m
~修改java虚拟机属性替换掉默认的垃圾回收器,因为默认的垃圾回收器在多线程环境下会有更多的wait等待
export HBASE_OPTS="-server -XX:NewSize=6m -XX:MaxNewSize=6m -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode"
~增大RPC数量
通过修改hbase-site.xml中的
hbase.regionserver.handler.count属性,可以适当的放大。默认值为10有点小
~做程序开发是注意的地方
需要判断所求的数据行是否存在时,尽量不要用HTable.exists(final byte [] row)
而用HTable.exists(final byte [] row, final byte[]column)等带列族的方法替代。
不要使用HTable.get(final byte [] row, final byte []column) == null来判断所求的数据存在,而是用HTable.exists(final byte [] row, final byte[] column)替代
- 基于hadoopHA集群进行mapreduce开发时,configuration对象的 hbase.zookeeper.quorum 属性值是什么?
Hbase使用的zookeeper地址,客户端可以通过通过该属性找到zookeeper客户端从而获取服务器信息。
- 在hadoop开发过程中使用过这些算法,其应用场景是什么?
- MapReduce程序如何发布?如何MapReduce中涉及到了第三方的jar包,该如何处理?
打成jar包,上传到系统中,通过hadoop jar 命令执行
方式1、将第三方jar包copy至$HADOOP_HOME/lib目录里;
方式2、将第三方jar包和你的MapReduce程序打成一个jar包;
方式3、使用 libjars 这个参数。
- Hadoop中Combiner的作用?
Combiner可以认为是在map阶段运行的一种特殊的reduce,可以在shuffle之前,在map阶段将map输出的数据先进行一次合并,从而减少在网络中的数据传输量。
- Hive的条件判断有几种?
返回类型 |
函数 |
说明 |
T |
if(boolean testCondition, T valueTrue, T valueFalseOrNull) |
判断是否满足条件,如果满足返回一个值,如果不满足则返回另一个值。 |
T |
COALESCE(T v1, T v2, …) |
返回一组数据中,第一个不为NULL的值,如果均为NULL,返回NULL。 |
T |
CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END |
当a=b时,返回c;当a=d时,返回e,否则返回f。 |
T |
CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END |
当值为a时返回b,当值为c时返回d。否则返回e。 |
- Hbase如何存储数据?
hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中
这样做的目的是在查询时可以将工作量分布到多个RegionServer中以提高速度
region由[startkey,endkey)表示
HRegion是hbase分布式存储和负载均衡的最小单元
要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,因为内存空间毕竟是有限的)中存储数据以提高查询性能,对于修改会将数据同步到hdfs中,以持久化数据。
hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位 如果相同再比较第二位。。。)按序存储,所以当以rowkey查询数据时,可以提高速度。
hregion的分裂,当hregion变的很大时会分裂成两个,存放到不同的RegionServer中,防止一个Region过大,导致查询其中数据时速度很慢
HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。
事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family。
每个Strore又由一个memStore和0至多个StoreFile组成
- 简单描述Client上传数据到一提啊hdfs的过程?
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定。
开始以pipeline(管道)的形式将packet写入所 有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。
如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。
- 列举hadoop的三种运行模式并简单介绍?
单机模式:在单机中运行,无法使用hdfs,而是使用本地文件系统进行模拟,通常用来mapreduce的开发测试。
伪分布式:在单机中,启动多个进程来模拟集群工作状态,除了不是真正的集群状态,无法提升处理效率外,使用起来和完全分布式差别不大。可以使用hdfs和mapreduce
完全分布式:在多机种,分布式部署,可以通过集群力量来处理海量数据。真正生产环境下的使用方式。