能力
所有的事情最终都会落到成事的能力,证明成事能力的途径感觉只有两种途径。
- 领导给一件事就成一件事。
- 在专业领域展示能力,形成自己的影响力。
其实公司不是一个让人积极向上,让人自动进步的地方,否则就不会出现这么多空降,否则就不会出现你解决不了一个项目直接裁掉从外面招人解决。能积极向上的只有自己。
github地址:https://github.com/linkedin/PalDB.git
相关内容可以建项目的readme。
主要分析函数如下:
paldb的数据按key对应的byte数组的长度散列。不同key长度会有不同index file和data file。
此方法是paldb写入数据的主流程。
相关代码和一些注释如下:
1 | public void put(byte[] key, byte[] value) |
此方法为close方法,主要整理了从打卡到目前为止的临时数据。
相关代码和一些注释如下:
1 | public void close() |
此方法为写meta部分的代码,从中可以看到meta部分的结构。
相关代码和一些注释如下:
1 | private void writeMetadata(DataOutputStream dataOutputStream) |
此方法为buildindex,可以看到paldb怎么获取offset,怎么做冲突等。
相关代码和一些注释如下:
1 | private File buildIndex(int keyLength) |
此方法是paldb读取数据的主流程。
相关代码和一些注释如下:
1 | public byte[] get(byte[] key) |
此方法为启用mmap时读取真实value的方法。
相关代码和一些注释如下:
1 | private byte[] getMMapBytes(long offset) |
此方法为没有启用mmap时读取真实value的方法。
相关代码和一些注释如下:
1 | private byte[] getDiskBytes(long offset) |
1 | indexOffset: index部分的偏移量 |
从图中可以知道,paldb的文件主要的分为三个部分,metadata,index和data。
metadata:主要用于描述paldb文件,其中包括了重要成员变量。
index:主要保存了key和对应的offset。在paldb中数据按key长度区分,并提出了一个slot的概念。一个slot包含key和对应的offset(此offset用于在data部分找到真实数据)。slot的长度是固定,所以在index去获取offset时可以,直接使用下标和slotSize的乘积。下标通过对key的hash计算得到,并使用探针的方式去不停尝试获取到正确的下标。相当于在文件中实现了一个hash函数。
data:主要保存了value长度和value具体的值。具体的offset由在index部分获取。在这里的length的字节数是固定的,所以可以拿到offset后就可以解析处value长度和value值。
今天决定抛弃vmare+centos虚拟机的形式安装hadoop&hbase了,开始直接在macbook的os上安装hadoop&hbase。理由:
现在安装的是hbase,提前需要做的就是:
给macbook安装jdk
在Sharing里打开远程登录,使机器能免密执行ssh localhost。
下载zookeeper-3.4.12.tar.gz, hadoop-3.1.1.tar.gz和hbase-2.1.1-bin.tar.gz。
将zoo_sample.cfg拷贝一份为zoo.cfg,就可以通过zkServer.sh的命令来启动。
然后可以通过zkCli.sh来对zk服务进行访问。
##hdfs安装
几个坑:
htrace-core-3.1.0-incubating.jar需要自己下载,并且hadoop中htrace-core4-4.0.1-incubating.jar是不行的。有不兼容的情况。
需要自己在配置文件中注定hbase.master.ipc.address,否则在mac中会报Can’t assign requested address 无法启动rpc,但是没有日志显示这个配置是啥。
##集成验证
在hbase shell中创建一个表,写入一条数据,检索。
这是一本关于银行的书,书名为《银行估值与价值管理 - 存贷款定价,绩效评估与风险管理》,作者为杰恩•德米内。总体上来说,这书比较难读,而且可能由于翻译或门槛太高,阅读起来感觉有些累,但是值得读,因为从中可以感觉到作者在银行的业务和管理方面有很深的造诣。
本书分为如下四个部分。
讲述了最基本的各种利率有关的现值的计算;一些基本的统计学知识;银行的意义及两张表的简化形式。这部分内容比较基础。
介绍了几种估值方式:1. 市值倍数(市盈率,市净率)。2. 未来股利折现法。 3. 未来经济利润折现法。4. 价值驱动因子法。作者提的这个的第四种方法其中很有用。因为第四种可以归结到一些重要数据,我们在估值时可以从几个重要数据去判断。第三种从某种程度上来说也是一个可行的办法,不过得是那种利润增长比较稳健并且管理很稳健的银行。
在价值驱动因子法中,作者做了如下公式:
贷款业务的银行价值 = 清算价值 + 存款特许权价值 + 贷款特许权价值 + 营业费用现值 + 固定资产(不太考虑) + 税收罚金 。
从上述公式中我们可以看到几个非常重要的变量,净利差,营业费用支出比例。
中间业务估值两种方法:1. 现金流方法。 2. 基于资产价值的方法。中间业务比较抽象,不好评价。
作者讲到了怎么在内部去评价员工,这从某种程度上来说也是一种怎么去让一家银行更加稳健运行的方向。
对于外部人士来说,感觉不需要过多的考虑细节,抓住主要矛盾,关注银行的不良贷款率和一些资本充足率等事项就可以了。最后讲了一个资产证券化的主题。
##风险管理
这章是最让我感觉神奇的地方,里面讲到了各种怎么操作风险的手段。
这部分给我的感觉是知道了一些概念,能大概去判断一些事情对银行可能影响。
从这篇文章来看的加粗字体的文字来看,对于一个外部人士看银行,主要有如下几个重要变量。
后续如果有时间,可以讨论一下招商银行等我国优秀重要的银行。
本书从整体上来看是值得阅读的。
读下来主要是包含了几部分:巴菲特对股票和市场的看法,巴菲特对钱和慈善的看法。
##巴菲特对股票和市场的看法
他喜欢的投资标的有这么几个特征:
除了这些,巴菲特对市场情绪十分的了解,例如后视镜的观点,并且能够利用这种情绪。
巴菲特也是比较早的了解到投资的真谛,并且一直恪守着这写原则。
从某种程度上看,巴菲特在保险和会计等领域应该是做到全行业非常靠前的地步。
##巴菲特对钱和慈善的看法
这种事情,总之是他有钱他厉害。
盖茨能和巴菲特这么相投,估计也验证了聪明的人会在一起玩耍,和绝大部分人不在一个层级。
很理性的对待很多事情,很多时候的会很仔细的计算的者成本和收益,然后做比较;自己提出一些想法,还会讲故事来让人明白这件事情,这点和芒格很像。
此书总整体上来说是本值得读的书。
此书分为编程生产,整理工具,自我管理,团队协作,走进公司,留意你的企业和改善七个章节。具体编码部分并不占本书最大篇幅,相反,本书用了很大篇幅写了程序员绝大部分时间不会注意的内容,比如怎么去解决人和人之间的问题,给人的性格分类等绝大部分程序员根本瞧不起的事情。
离开学校四年,确实感觉代码只是我们工作的一小部分内容。我们需要去读很多软件工程,与人交流,其他行业的专业知识。这些才是我们区别单纯编码人员的重点。
以下是一些读此书时书中觉得不错的语句,特此记录一下。
此书也许未来可以再翻看一次。
最近两周跑了四次左右的八公里或十公里,需要记录一下感受。
今天刚阅读完谢丽尔·桑德伯格的《另一种选择》,有几点感想想要分享。
最近整个工作的节奏和完成速度确实让我觉得有点失望,不过整个swift项目和python的难度确实在预料范围之外。应该更努力的解决问题。
给自己一个设想,如果自己未来只有五十年,三十年,十年,五年甚至一年的时间。我们还是如此散漫的挥霍宝贵的周末时光吗?以后一定要尽量让自己不要处于如此散漫的地步。
private void waitAndQueueCurrentPacket()
调用者:
1 | private void flushOrSync(boolean isSync, EnumSet<SyncFlag> syncFlags) |
public class DFSOutputStream extends FSOutputSummer
1 | implements Syncable, CanSetDropBehind { |
1 | class DataStreamer extends Daemon { |
block > packet > chunk(带chunksum)
主要看看writeChunk方法。
其中一个处理时添加chunk到缓存中。一下具体处理为判断是否可以添加入发送给datanode的缓存中。lastQueuedSeqno保存了最后一个需要处理的序号。
/**
1 | private void waitAndQueueCurrentPacket() throws IOException { |
1 | private void queueCurrentPacket() { |
DataStreamer是处理添加入缓存dataQueue的数据。将他们发送然后添加到ackQueue中。
在while中有processDatanodeError的处理。
1 | synchronized (dataQueue) { |
toWaitFor = lastQueuedSeqno;
waitForAckedSeqno(toWaitFor)在flushInternal和flushOrSync会调用。