hbase | 青训营笔记

94 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的的第6天

hbase

hbase依赖hdfs同时依赖zk 启动hdfs和zk后,hb需要启动进程hm和hregionserver 写的流程中,我们会将数据写到memestore中并进行排序
等待memestore刷写时机,会将其中的数据刷到storefile中, storefile随着增多还会出发compact合并操作, store进一步增大没回出发split,分裂region。 wal机制:write ahead log更新数据之前先更新日志,用处是:写操作是随机io比较耗费性能,如果把每一次的更新操作先写入log中,就变为了顺序写,实际更新是后台线程根据log异步写入

juc

cas:compare and set循环时间长,开销大。只能保证一个共享变量的原子操作。 aba问题:多线程并发时,简单说,线程1读数据值A,1挂起,线程2将A先改为B后改为A;线程1恢复后,通过CAS比较,最终结果没有变化
绝对线程安全比较少,CopyOnWriteArrayList、CopyOnWriteArraySet
相对安全,是我们通常说的线程安全,比如vector和remove都是原子操作不会被打断,但涉及到fail-fast机制:多个线程对同一个集合的内容进行操作时,会产生fail-fast时间,抛出ConcurrentModificationException异常。 通过在线程之间共享对象实现共享数据,sleep和wait不同点在于sleep不会放弃这个对象的监视器,wait会放弃这个对象的监视器.
threadlocal是一种时间换空间的做法,每个thread里面维护了以开放地址法(kv哈希表,不过是通过数组空位解决的碰撞冲突)。线程池的作用是完成线程对象的重用,避免频繁的创建和销毁。synchronized是关键字;reentrantlock是类,底层调用的是unsafe的park

jvm

类加载:构造该类实例、使用该类的静态属性和静态方法、使用子类。 双亲委派模型本质就是类加载过程中通过类名查找到类的.class文件的查找过程,类加载时,从appclassloader开始,但它会想交给自己的父类,extclassloader也会交给自己的父类,然后bootstrapclassloader拿到类名后在rt.jar中开始查找,找到就返回,否则在extclassloader中的ext目录中找找,没找到再去AppClassLoader中的CLASS——PATH环境变量中、-cp指定目录中、当前目录中三个地方去查找,如果找到就加载,没有找到就抛出一个ClassNotFoundException异常。

1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行

2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达项层的启动类加载器;

3)如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。