基础html
一、 hashmap的初始值大小---16java
二、 ArrayList的初始值大小---10node
三、 hashmap的排序问题程序员
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("d", 2);
map.put("c", 1);
map.put("b", 1);
map.put("a", 3);
List<Map.Entry<String, Integer>> infoIds =
new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
//排序
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
//return (o2.getValue() - o1.getValue());
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
算法
四、 Java异常 多线程sql
java中广义的异常是指Throwable接口,这个接口下有两个实现类:Error和Exception。Error表示严重的错误,一旦产生,则不作处理或者重写代码;若是是Exception,分为检查异常和运行异常。检查异常在出现时必须处理,或者抛出或者捕获;运行异常在出现时能够处理能够不处理。shell
多线程是指一个进程中多个逻辑后者任务的执行,会产生安全问题,为了解决这个问题,能够利用同步代码块或者lock()方法数据库
五、 Java Stringapache
String类是用final修饰的,所以不可被继承,其中重写了equals和hashCode方法,所以调用equals方法时比较的是两个字符串的值;String提供了比较多的构造方法,须要注意不一样的构造方法所产生的对象的个数也不同。用+链接运算拼接字符串的时候,调用的是StringBuilder中的append方法编程
六、 string stringbuffer stringbuilder对比
这三个类都是final修饰的,都不能够被继承。String这个类是线程不安全的,其中的+链接运算用的是StringBuilder中的append方法,每一次的+都会产生一个新的StringBuilder,concat方法是将字符串转化为字符数组以后再进行合并,而后转化为字符串。StringBuilder和StringBuffer中的方法几乎一致,其不一样之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。
七、 string常量池
常量池是在方法区中的,用于存储计算机中的常量
八、 Finally final
finally是异常中用于异常处理捕获后的一些后续操做的关键字,final能够用来修饰类、方法和属性。修饰类这个类不能被继承,修饰方法这个方法不能被重写能够被重载,final不能修饰抽象方法;修饰属性这个属性在被初始化以后就不能在被改变(对于基本类型的数据而言是值不可变,对于引用类型而言是地址不可改变)
九、 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中的方法,程序员能够调用这个方法通知过程进行内存的回收
2三、程序中捕获异常的方法?
try-catch-finally代码块
2四、用最有效的方法算出2乘以8等于几
2<<3
2五、写一个方法,用一个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、重载和重写的主要区别是什么?重载的方法可否根据返回类型进行区别?
重载是发生在了一个类中,只看同名方法中的参数列表是否相同,对修饰符和返回值类型没有限制;重写是放生在了父子类中,函数同名,参数列表一致,权限修饰符要大于等于父类,返回值类型要小于等于父类;重载是编译时多态,重写是运行时多态。
2九、抽象类和接口有什么区别?
抽象类中容许存在实体方法,容许存在静态方法,有构造函数,有变量;接口中没有实体函数,没有静态函数,变量默认是静态常量
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 在分组后进行过滤
三、事务种类
Uncommitted
Read committed
Repeatable read
Serializable
四、大量数据处理方法
整体思路:分而治之 最终汇总
方式一:单机模式下,内存有限,能够将要处理的数据进行分块,依次加载入内存,进行处理,最终进行汇总,灵活利用分桶、分区的思想,对数据进行处理
方式二:利用多机处理,将数据分块后,并行在多台机器中进行处理,最终汇总,即分布式处理。目前有成熟的分布式大数据处理框架,如hadoop、storm、spark等。
5、sql关键字 例如trancate和delete的比较
Delete 删除数据,能够删除表中的部分行,也能够删除正表数据,删除时是真的去移除表中记录,因此删除正表数据时,若是数据量较大,效率会比较低。
Trancate删除数据,只能删除整表数据,原理是直接摧毁表,再从新建立表,效率会很高,可是只能删除整表数据,没法进行部分数据的删除。
6、trancate是啥?
参考题10
7、where和having的区别
Where用来在分组以前过滤,having用来在分组以后过滤。
Where语句中不能出现聚合函数,having能够
八、乐观锁和悲观锁的区别
都是用来解决更新丢失问题的方案。
悲观锁经过在查询阶段加排他锁在在查询阶段就避免了更新丢失的可能
乐观锁经过版本字段进行检测,在修改阶段检查更新丢失,若是发现产生了更新丢失再进行补救。
根据其特色,若是查询多而修改少,则用乐观锁,若是查询少而更新多,则用悲观锁。
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注入
1四、写出学生表的建表语句
Create table student (sid int primary key auto_increment,sname varchar(20),sage int,ssex varchar(1));
1五、查询姓“张”的学生名单
Select * from student where sname like ‘张%’;
1六、查询全部学生的学号、姓名、选课数、总成绩
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;
1七、查询选修“叶萍”老师所授课程的学生中,成绩高的学生姓名及其成绩
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 ;
1八、在数据库中,查看表中重复记录
Select * from tab group by colm having count(colm)>1;
大数据
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)数据密集型并行计算
数据采集 提取清洗 整合汇聚 存储 分析处理 可视化展现
原始数据量一般大而混杂,隐含着大量业务内容,经过分析计算后经过报表形式表现数据背后隐含的数据含义。
网站后台日志
传统数据库历史数据
网站实时数据流
爬虫采集
等等
Shell
Python
。。。。。根据自身状况回答。。。。。
参考文档:使用hive读取hbase数据.mht
简单来讲,将大文件进行切块上传到hdfs集群中进行分布式存储,利用集群的力量提升海量数据处理时的吞吐能力。另外块在保存时会自动进行备份操做,默认3份,从而保证了集群中数据的可靠性。
zookeeper是一个开放源码的分布式协调服务,是一种典型的分布式数据一致性解决方案。由雅虎建立,贡献给了apache。
利用zookeeper能够实现数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能。
具备 顺序一致性 原子性 单一视图 可靠性 实时性的特色
采用选举 投票 过半赞成 的机制保证了分布式数据协调时的数据一致性。
Hadoop分布式数据存储技术。
是mapreduce hbase hive 等技术采用的底层分布式数据存储技术
flume是分布式的,可靠的,用于从不一样的来源有效收集 汇集 和 移动 大量的日志数据用以集中式的数据存储的系统。
能够经过自由配置agent来实现日志的收集汇聚传输存储。能够实现收集日志时多级传输、扇入、扇出等操做,并支持负载均衡失败恢复,实现日志的可靠传输。
扇入,即多个agent向一个agent发送日志,一般用来实现日志信息的汇聚。
删除,即一个agent向多个agent发送日志,能够采用复制或路由方式工做,一般用来实现日志的分发。
create table book (id bigint, name string) partitioned by (category string) row format delimited fields terminated by '\t';
hive中的数据以文件的形式保存在hdfs文件系统中。Hdfs文件中的一行对应hive表中的一行数据,字段间经过指定分隔符进行分隔。
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两个重大特性
HiveQL:这是Hive的数据查询语言,与SQL很是相似。Hive提供了这个数据查询语言与用户的接口,包括一个
shell的接口,能够进行用户的交互,以及网络接口与JDBC接口。
JDBC接口能够用于编程,与传统的数据库编程相似,使得程序能够直接使用Hive功能而无需更改
Driver: 执行的驱动,用以将各个组成部分造成一个有机的执行系统,包括会话的处理,查询获取以及执行驱动
Compiler:Hive须要一个编译器,将HiveQL语言编译成中间表示,包括对于HiveQL语言的分析,执行计划的生成以及优化等工做
Execution Engine:执行引擎,在Driver的驱动下,具体完成执行操做,包括MapReduce执行,或者HDFS操做,或者元数据操做
Metastore:用以存储元数据:存储操做的数据对象的格式信息,在HDFS中的存储位置的信息以及其余的用于数据转换的信息SerDe等
Java的非阻塞式io
Jdk5开始提供。
解决了传统java bio阻塞式工做,服务器没法在高并发场景下实现少许线程处理多客户端请求的问题。
由channel buffer selector组成
Channel称为通道,类比bio中的流,实现数据传输,但不一样的是,为双向传输。
Buffer为缓冲区,channle面向缓冲区进行数据处理
Selector为选择器,多个通道能够注册到一个选择器中,经过少许线程从selector中选择就绪通道进行处理,从而实现少许线程处理多个客户端通道的效果。
hive和hbase的底层都是经过hdfs进行数据存储,经过mapreduce进行数据处理。
但应用场景不一样,hive是基于hadoop的数据仓库工具,经过类sql的方式进行操做,简化了离线数据的处理过程,可是仍然是一种离线数据处理工具。
Hbase则是基于hadoop的非关系型数据库。能够实现毫秒级别的实时查询,是一种在线数据库系统。相对于传统的数据,适合于存储非结构化半结构化的数据,按列存储、经过rowkey来实现查询,能够存储海量数据。
能够描述下zebra/网站流量分析项目的流程。
从物理过程来说:
客户端提交一个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中的表在行的方向上分隔为多个HRegion,分散在不一样的RegionServer中
这样作的目的是在查询时能够将工做量分布到多个RegionServer中以提升速度
region由[startkey,endkey)表示
HRegion是hbase分布式存储和负载均衡的最小单元
要注意HRegion不在hdfs中,而是在RegionServer的内存中,在内存(其实也有数据在本地文件系统中,由于内存空间毕竟是有限的)中存储数据以提升查询性能,对于修改会将数据同步到hdfs中,以持久化数据。
hbase中的数据按照rowkey的字典顺序(字典顺序!!!先比较第一位 若是相同再比较第二位。。。)按序存储,因此当以rowkey查询数据时,能够提升速度。
hregion的分裂,当hregion变的很大时会分裂成两个,存放到不一样的RegionServer中,防止一个Region过大,致使查询其中数据时速度很慢
参考18题
将文件导入hbase主要有三种方式,应对与不一样应用场景:
(1) 使用HBase的API中的Put方法 - 单机效率低,适用于少许数据的场景
(2) 使用bulk load 工具从TSV文件中导入数据 – hbase提供更的工具,效率高,能够处理大文件,但只能处理固定格式的文件。
(3)本身编写mapreduce来进行导入操做 – 灵活,能处理大量的数据及各类格式,可是须要手动编写mr
~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惟一原则
必须在设计上保证其惟一性。
~借助惟一标识字段
若是分页的表有惟一标识的字段,能够经过这个字段来实现分页:
获取第一页数据:
注:同时须要记录这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函数给表加了惟一标识以后,就能够利用第一个方法来进行分页
数据在更新时首先写入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中是以byte[]字节数组的形式存储的,可是建议在系统开发过程当中将其数据类型设置为String类型,保证通用性;若是在开发过程当中将RowKey规定为其余类型,譬如Long型,那么数据的长度将可能受限于编译环境等所规定的数据长度。
a) 将hbase.hregion.max.filesize配置的足够大
b) 在hbase-site.xml配置文件中,添加:
name为hbase.regionserver.region.split.policy
value为org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy
Avro Source
Exec Source
Spooling Directory Source
NetCat Source
Sequence Generator Source
HTTP Source
Custom source
参考zebra的java实现
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,面向通道操做缓冲区,在执行READ WRITE CONNECT ACCEPT 操做时不会产生阻塞。
BIO 传统IO,面向流操做字节/字符。在执行READ WRITE CONNECT ACCEPT操做时会有阻塞。
传统BIO因为执行如上四种操做时,会产生阻塞因此没法实现用少许线程处理多个客户端通道的链接。
NIO利用非阻塞特色,解决了该问题,从而实现了高并发场景下服务器的开发需求。
引入了yarn进行资源调度。
增长了NameNode的高可用机制
将文件切块,分别存放在集群中不一样的机器中,而且进行备份,保证数据的可靠性。
NameNode:hdfs元数据保存的场所
SecondaryNameNode: NameNode辅助者,帮助NameNode实现日志数据合并。
DataNode:存放数据块。
数据来源中数据自己不均衡。
解决方案:合理设计partition
SecondaryNameNode并非NameNode的热备份,而是协助者帮助NameNode进行元数据的合并,从另外的角度来看能够提供必定的备份功能,但并非热备,这种合并过程可能会形成极端状况下数据丢失!能够从ssn中恢复部分数据,可是没法恢复所有。
NameNode是hdfs存放元数据的场所,工做很是繁忙,若是让NameNode来执行进行日志合并操做,必然会致使NameNode压力增大,另外在合并期间NameNode没法响应外部写需求,形成hdfs可用性降低。
zookeeper是一个开放源码的分布式协调服务,是一种典型的分布式数据一致性解决方案。由雅虎建立,贡献给了apache。
利用zookeeper能够实现数据发布订阅、负载均衡、命名服务、分布式协调/通知、集群管理、分布式锁、分布式队列等功能。
使用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设定的数量。
在datanode的心跳包的响应中,namenode向datanode发送指令进行操做。
在执行过程当中,datanode向namenode进行汇报。
Yarn mapreduce的资源调度框架
Zookeeper 集群协调服务
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
启动zookeeper集群
启动journalnode集群
启动namenode
启动datanode
启动zkfc
3份 64MB(128MB)
meta数据保存在namenode中,包括文件结构树信息、文件和Block之间关系的信息、Block数量信息、Block和DataNode之间的关系信息。Datanode不存储元数据,可是当集群启动时,datanode须要向namenode汇报当前datanode中保存的块信息,便于namenode构建block和datanode之间的映射关系。
A: SecondaryNameNode B: DataNode C:TaskTracker D:jobtra
两个namenode以前的状态监控及ha时的协调。
~开启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)替代
Hbase使用的zookeeper地址,客户端能够经过经过该属性找到zookeeper客户端从而获取服务器信息。
打成jar包,上传到系统中,经过hadoop jar 命令执行
方式1、将第三方jar包copy至$HADOOP_HOME/lib目录里;
方式2、将第三方jar包和你的MapReduce程序打成一个jar包;
方式3、使用 libjars 这个参数。
Combiner能够认为是在map阶段运行的一种特殊的reduce,能够在shuffle以前,在map阶段将map输出的数据先进行一次合并,从而减小在网络中的数据传输量。
返回类型 |
函数 |
说明 |
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中的表在行的方向上分隔为多个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组成
使用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设定的数量。
单机模式:在单机中运行,没法使用hdfs,而是使用本地文件系统进行模拟,一般用来mapreduce的开发测试。
伪分布式:在单机中,启动多个进程来模拟集群工做状态,除了不是真正的集群状态,没法提高处理效率外,使用起来和彻底分布式差异不大。可使用hdfs和mapreduce
彻底分布式:在多机种,分布式部署,能够经过集群力量来处理海量数据。真正生产环境下的使用方式。