两年了,我感到自己离开最想象力丰富,最充满热情的年龄太遥远了。这些日子,一直在思考自己如何变成一个越发平庸的人。
甚至找不到给自己的标签。
在这个地方,还可以写点文字,找找自己真正想要的是什么。
今天收到别人请求内推的邮件,没有附上简历。第一次没有生气。忽然想起当初自己找工作时候莽莽撞撞,无所适从的样子,想起那些睡不着的夜晚,不停哭不停哭的时刻,想起无法面对自己的失败,却充满韧性的我。至少那个时候,充满希望,机智善良。
不知道工作改变了我什么,变成一个刻薄或者并不耐心的人,或者变成毫无生趣的人。终究是中了这个社会的圈套。
我思来想去,我擅长的可能不够好,但对于写字,记录,和思考,我终究还是喜爱的。我到达不了哪里,也没有什么小目标,可能这辈子也不会出一本书。但我要好好写下去,让自己更努力一点。
这几年,好像之前太努力了,工作以后总想着如何享受生活。可我大概不是享受的命,我还是很怀念奋斗时不记得自己是谁的感觉,怀念充满了观念的我。
不知道创业公司是不是更适合我,如果能解决生计,温饱,我为什么要为了那些所谓的优越而选择平庸呢。
我甚至不知道下一篇什么时候会写。我不知道明天我会不会努力。
但我记录在这里,至少在这一刻,我还想过自己是不是可以不平凡。
]]>更新中...
分为request line, header line, message body
GET,POST,PUT,DELETE。 URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源。
用于信息获取,而且应该是安全的 和 幂等的。
所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
幂等的意味着对同一URL的多个请求应该返回同样的结果。
GET请求报文示例:
报文示例:
HTTP 协议中规定 POST 提交的数据必须在 body 部分中,但是协议中没有规定数据使用哪种编码方式或者数据格式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
HTTP 响应与 HTTP 请求相似,HTTP响应也由3个部分构成,分别是:
状态行 响应头(Response Header) 响应正文
在 HTTP 1.1 版本中,默认情况下所有连接都被保持,如果加入 "Connection: close" 才关闭。目前大部分浏览器都使用 HTTP 1.1 协议,也就是说默认都会发起 Keep-Alive 的连接请求了,所以是否能完成一个完整的 Keep-Alive 连接就看服务器设置情况。
使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1. 判断传输数据是否达到了Content-Length 指示的大小;2. 动态生成的文件没有 Content-Length ,它是分块传输(chunked),这时候就要根据 chunked 编码来判断,chunked 编码的数据在最后有一个空 chunked 块,表明本次传输数据结束。
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内,这样就实现了对客户的跟踪。
Cookie是可以被禁止的。
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。
在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
Session的实现依赖于Cookie,如果Cookie被禁用,那么session也将失效。
目前主流的做法是使用 Token 抵御 CSRF 攻击。
Token 使用原则
注意:过滤用户输入的内容不能阻挡 csrf,我们需要做的是过滤请求的来源
是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。 三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据.
Socket 是对 TCP/IP 协议族的一种封装,是应用层与TCP/IP协议族通信的中间软件抽象层。从设计模式的角度看来,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 Socket 还可以认为是一种网络间不同计算机上的进程通信的一种方法,利用三元组(ip地址,协议,端口)就可以唯一标识网络中的进程,网络中的进程通信可以利用这个标志与其它进程进行交互。
References: https://hit-alibaba.github.io/interview/basic/network/HTTP.html
]]>四点要素:
二分法关键
https://www.lintcode.com/en/problem/classical-binary-search/
Find any position of a target number in a sorted array. Return -1 if target does not exist.
Given [1, 2, 2, 4, 5, 5].
For target = 2, return 1 or 2.
For target = 5, return 4 or 5.
For target = 6, return -1.
基本的二分查找。
For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n) time complexity.
If the target number does not exist in the array, return -1.
If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.
给一个升序数组,找到target最后一次出现的位置,如果没出现过返回-1
Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You may assume NO duplicates in the array.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0
Given a big sorted array with positive integers sorted by ascending order. The array is so big so that you can not get the length of the whole array directly, and you can only access the kth number by ArrayReader.get(k) (or ArrayReader->get(k) for C++). Find the first index of a target number. Your algorithm should be in O(log k), where k is the first index of the target number. Return -1, if the number doesn't exist in the array.
本题和上面考察如何在一个array中找到一个数不同的是,这个array会非常大。所以要考虑的是如何“倍增”的问题。增到大于target就可以了,接下来找到最初出现的问题。
Debian系统里默认是没有sudo的,安装操作如下。
Step 1: 用root的身份进入
Step 2: 安装sudo
Step 3: 把你的用户名加入sudoer列表中
编辑此文件,加入这样一句:
Step 4: 退出root,测试sudo
Done!
]]>本文是《Stronger consistency and semantics for low-latency geo-replicated storage》的阅读笔记。
(未完成更新...)
如今大型的网络服务常常需要大规模数据存储,需要支持上百万的并行用户对数据进行操作。在这些系统中,数据中心往往会对数据进行完全备份,也就是在每一个数据中心中都存储全部的数据。比如Facebook会把所有用户信息存在每个数据中心中。像这样讲数据备份在不同地理位置的方式称为:地理复制(Geo-replication)。
地理复制有两个好处:容错和低延迟。一个地理位置的数据库挂掉了,其他的可以继续提供服务。用户可以选择离自己最近的那个服务。
在大规模数据库中,每一个数据中心的数据会非常大,常常需要分布在上万的机器中,常用的一个技术叫做分区(sharding),就是把不同部分的数据房子啊不同的服务器中。当有新的机器增加时,就需要重新进行分区。所以总而言之,在不同地理区域的数据是重复的,每个地区的数据则是分区存放的。
为了达到更少的round trop time也就是RTT,也就会从用户发出请求到返回的网络延迟,最重要的就是要减少到达数据存储之间延迟。一种方式就是尽量从本地获取。如图所示:
从最近的地方读写是最快的。读从最近的数据中心读取,就不会去远程获取。写的是后也是在这个数据中心中更新,在更新远程数据中心之前就返回结果。这种设计称为“local-replica-only”数据库设计,就是为了减少远程获取,来得到数据中心之间RTT最短时间。然而这种“Local-replica-only”的设计往往会达不到强一致性。
Linearizability是一种强一致性模型。也就是说如果写完之后,在另一个数据中心读取时,就需要有刚刚写的更新。所以理论上来说,低延迟和强一致性往往是trade-off的关系。
通过CAP理论,我们已经知道,一个系统无法同时达到Consistency,Availability和Partition-tolerance。因此,现代的网络服务通常牺牲了强一致性来满足可用性和分区容忍性。这类系统可以命名为“ALPS系统”,满足可用性,低延迟,分区容忍和高可拓。
鉴于ALPS系统必须牺牲强一致性,我们就来探索一下在ALSP束缚下最强的一致性可以达到什么程度。这里,我们提出casual consistency with convergent conflict handling,也就是casual+一致性。
]]>本文是论文《Overview of Facebook Scalable Architecture》的阅读笔记,作者Hugo Barrigas, Daniel Barrigas, Melyssa Barata, Pedro Furtado, Jorge Bernardina。技术细节很少,只是一个粗略的大框架。其实根本也没有讲什么细节,所以以后有更多补充再往里写。感觉最大的亮点就是MySQL+Memcached。
这篇文章主要是介绍Facebook的网站架构,讲述在扩展方面遇到的困难和解决的方式,从而更好了解Facebook是如何运行的。
对于大型分布式系统来说,可拓展性是网络、系统和进程中非常重要的指标。它标志着是否有成长的能力,是否能处理增长的工作量。
规模只是拓展需要考虑的一个方面。可拓展性包含如下几个方面:
a. 是否能轻松增加存储能力
b. 能处理多少增加的traffic
c. 能多运行多少事务
随着用户增加,Facebook做了一些改动,但依旧使用LAMP(Linux-Apache-Memcached-PHP)模式: a. 依旧使用PHP,但写了一个将PHP转成C++的编译器来提高服务器的性能。 b. 依旧使用Linux但进行了一些优化。 c. 最具有争议的事情是使用MySQL,它依旧是最主要的数据库。 另外Facebook还有两个自己系统:
前端是把LAMP服务器运行在Memcache上。
Facebook使用Linux和Apache HTTP Server
BigPipe是Facebook开发的动态网页系统。主要就是把各个部分通过不同的步骤在浏览器和服务器中完成。 比如:

将PHP编译成C++的编译器。一些关键点:
Facebook在MySQL的使用上运用了sharding和caching的技术。 为了让MySQL可拓展,主要的解决方案就是sharding。也就是数据库被分为几个部分,而且90%的query都存在缓存里,并不需要去数据库里取。Facebook非常依赖Memcached,并且值得一提的是Facebook在多个数据中心中有好几千个MySQL的服务器。另外,Facebook一些复杂的Join操作都是在服务器层面跑的,而不是直接在表上跑。(怎么做到的...不清楚技术细节)
Scribe是Facebook的登录系统。Scribe主要做的就是从多个服务器端读取整合数据,然后把信息传送给Hadoop:
Thrift协议提供不同语言之间的序列化,从而使Facebook支持不同语言共同开发应用。
Memcache是键值对内存存储缓存系统。
Haystack是在主内存中加入了可拓展的缓存:
REFERENCES:
[1] Building Scalable Web Architecture and Distributed Systems http://www.drdobbs.com/web-development/building-scalable-web-architecture-and-d/240142422, (Accessed 26 January , 2014)
[2] How Does Facebook Work? The Nuts and Bolts [Technology Explained] http://www.makeuseof.com/tag/facebook-work-nuts-bolts-technology-explained/ (Accessed 25 February 2014)
[3] Lloys G. W. Lloyd and Connie U. S. 2008. Scalable Query Result Caching for Web Applications. PVLDB vol. 1 no. 1 pp. 550-561, 2008
[4] Parris I., Abdesslem F. B., and Henderson T. 2012. Facebook or Fakebook? The effect of simulation on location privacy user studies. Ad Hoc Networks vol. 12 pp. 35-49
[5] Performance and scalability techniques 101 http://www.webforefront.com/performance/scaling101.html , (Accessed 30 January 2014)
[6] Scaling the Messages Application Back End https://www.facebook.com/note.php?note_id=10150148835363920 (Accessed 25 February 2014)
[7] The effects of teacher self-disclosure via Facebook on teacher credibility http://www.gtaan.gatech.edu/meetings/handouts/MazerFacebook.pdf (Accessed 25 February 2014)

]]>本文梳理分布式系统中的常见概念:二阶段提交协议和三阶段提交协议。
TPC是基于分布式系统架构下所有节点进行事务提交时保持一致性而设计的一种算法。在分布式系统中,每个节点虽然可以知晓自己操作的成功或失败,但无法知道其他节点的情况。需要一个协调者来组织所有节点的操作结果并最终指示他们是否进行真正的提交。
1)协调者给参与者发送信息,询问是否vote,等待响应。
2)参与者节点执行事务操作,写本地的redo和undo日志,但不提交。
3)参与者回复协调者,如果实务操作执行成功,返回“同意”。否则,返回“中止”。
a.如果第一阶段所有参与者提交都为“同意”:
1)协调者给参与者发送“是否正式提交”的询问。
2)参与者正式完成操作,释放资源。
3)参与者返回“完成”信息。
4)协调者收到所有“完成”信息,完成事务。
b.如果第一阶段有参与者提交“中止”:
1)协调者向所有参与者节点发出“回滚”的请求。
2)参与者利用undo信息执行回滚,释放在整个事务占用的资源。
3)参与者返回“回滚完成”信息。
4)协调者收到所有参与者的“回滚完成”后,取消事务。
整个过程如图所示:
因此,后来产生了三阶段提交协议。
非阻塞协议。
两方面的改动:
References:
本文是关于Stream Processing with Kafka and Samza的介绍以及总结反思。
如今实时数据处理的需求越来越高,实时数据的来源包括传感器数据(比如物联网设备),社交网络交互,实时商业数据等。这些情况下需要极其的延迟率。比如LinkedIn就需要用实时的广告点击数据来不断扩充广告架构。类似Hadoop和Spark这种数据获取和数据处理分离的方式无法达到低延迟的实时处理需求。所以在这里就介绍一写管理和处理大量实时数据的流处理框架。
Kafka是分布式发布-订阅消息系统。由linkedin开发,后来成为Apache项目的一部分。发布者把消息放在不同的classes里,并不知道订阅者会如何使用这些数据。而订阅者可以订阅特定的消息并且只能收到相应的消息。Kafka使用commit log来保持数据,commit log是按顺序的,不可修改的,只能添加的数据结构。Kafka最大的优势是它提供完整的数据结构,所有的组织里的系统能够独立和可靠地获取数据。可以认为Kafka是流数据源。以下为一些主要Kafka术语:
Topic: 表示一个用户定义的类型,消息会在这个类别下发布。主要用partitioned log来维护。
Producers: 用来向Kafka集群中发布一个或多个topic信息的进程。
Consumers: 用来向Kafka集群中读取消息的进程。
Partitions: topics被分为多个partitions。一个partition代表一个并行单位。总的来说,partition越多,吞吐量越多。每个partition中的每个信息都有特定的偏移量,这样数据消费者能借此定位。简单来说,我们认为Kafka会根据key来给数据排序并提供,类似于MapReduce中的Map和Shuffle的阶段。
Brokers: Brokers用来负责数据持久化和复制。brokers会和producers交流来发布信息给Kafka集群,和consumers交谈来获取信息。
值得注意的是,kafka不会运行处理数据,只是一种存储和分类流数据的一种方式。在这个Project里,你需要用Samza来处理Kafka提供的数据流。
可以看下这个视频(通常搞不懂一个概念的时候我都是查youtube_(:зゝ∠)_ )Understanding Kafka with Legos
Samza是由Linkedin开发的分布式流处理框架,以下为三层流处理框架中的关键组件:
Samza相关的术语包括:
Samza结构:
Samza API简单抽象,以一个ExampleCode为例,看Twitter类似的实时信息如何展示:
所有的Samza Jobs都要完成 StreamTask接口,有的时候还需要完成InitableTask和WindowableTask接口。
]]>本文主要是总结一些云计算的应用实例,是否要用云计算这个问题是个很复杂的问题,大多数时候需要根据需求和预算才能得到确切的答案,云计算是趋势,但如何利用是个值得仔细考虑的问题。
Obama For America(OFA)是云计算一个经典实例,云计算被运用在筹集竞选资金、分析竞争对手、有效使用竞选资金等都为奥巴马的连任成功提供了极大的保障。
OFA利用数据集成和预测分析使奥巴马赢得了选举,主要通过数据挖掘来确定及影响摇摆州的投票目标。OFA的数据来源包含:人口数据,投票历史数据,筹款数据,志愿者数据,社交网络数据以及投票数据,得到相关数据后,通过上门拜访,打电话,邮件,信件,网络广告,社交媒体,付费电视和网站等方式来影响投票人的决定。
根据DevOps的负责人透露,OFA的一些关键数据包括:
Obama For America团队一共构建了200个应用,包括:
Narwhal是一个python写的REST API,可调用存放的所有数据。在OFA中,大多数数据存放在MySQL为主的关系型数据库中,但也使用了PostgresDB, MS SQL Server, MongoDB, Vertica, LevelDB, S3, DynamoDB, SimpleDB数据库。除数据存储之外,主要应用了AWS EMR(Elastic MapReduce service)和Vertica来处理大量的数据建模和分析的工作。
CallTool可以用来让志愿者给投票人打电话。在选举的最后四天里,这个工具被1000多个志愿者给超过百万的投票人打了电话。工具可以将志愿者和投票人进行配对。团队在其中应用了AWS的auto-scalling功能在需求高峰能够快速增加云资源。
一个用来登记志愿者信息,并允许志愿者查看相应进度和收集到的信息的Rails线上应用工具。
Dreamcatcher可以通过处理社交网络上的政治舆情,精确确定目标投票人,并赢得投票人。
GOTV即Get out the vote,这个应用用来动员支持者将支持转化为投票。
OFA所有的应用几乎都部署在AWS云端,他们应用了分布消息队列,NoSQL和SQL数据库,虚拟私有云服务,负载均衡,内容传输网络等服务。 除了能够应对大规模数据处理需求之外,还能够在需求高峰通过自动增加云计算资源保证响应速度。另外,团队在数据备份上也充分利用了云计算的优势。
Reference:
- How Obama’s tech team helped deliver the 2012 election
- Wikipedia:Organizing for America
- CMU 15719 slides
- 6 Ways Amazon Cloud Helped Obama Win
对于Start-up来说,计算要求往往各种各样,需求量不大,变化却很快。在有限的预算下,还存在着硬件采购周期长,部署周期长,负担不起系统管理,数据中心能量供应,利用率低,灾难响应速度低等问题。
所以,云计算成为了Start-up的一种选择。举个栗子:
GoSquared是一家提供线上实时数据网站分析的企业,被TechCrunch报道后,使用量忽然增加,没有足够的资源应对增长,最终把网站搬到了AWS上,可以迅速得到更多资源,快速拓展。
Reference
如今企业决策都讲究数据驱动,层出不穷的多媒体数据往往有不同的数据来源,从text到图片到音频和视频。数据处理还分为批处理和流处理。如今,传统的数据处理流程也慢慢转向了云端。
Lambda架构定义了一套明确的架构原则,同时利用批处理和流处理对大规模的数据进行处理。此框架的提出主要是为了解决这样的一个问题:如何实时地在任意大数据集上进行查询?
Lambda架构包含三层layer:
所以,整个流程为,当数据进来时,会并行地进入到批处理层与加速层,当两者查询都完成在服务层整合好后,才算完成一次完整的查询。
但是这样令人激动的模型,还存在着一些争议,比如
关于Lambda框架的具体细节可参考这本书:《Big data: Principles and best practices of scalable realtime data systems》 其中除了介绍Lambda框架外,还重点放在了一些重要的地方:
这张图很好诠释了Lambda是如何处理query的:
随着发展,后来,Spark被认为是Lambda框架的合理实现。所以在这一部分,感觉写Lambda框架有点过时呢,但老师提到了就再理解一下。时代发展就是这样的,Lambda框架这种临时解决方案,会被更完美的方案取代。不过,不管怎样,人类的进步是令人欣喜的。关于Spark有空可以再写一篇具体一点的,amazing。
References:
对研究室来说,是应该使用预置的硬件,还是迁移到云端? 回答当然是,“It depends.”。
比如需求是这样:
如果我们选择预置的机器,按照五年来算:
有以下两种云计算的方案: 方案1: 方案2:
所以我们可以针对不同的需求、不同的云计算选择、不同的费用模型、不同的权限要求等来选择是否迁移到云端。
另外,在对比时,我们还需要考虑:
本文是总结Tree这种结构的常用知识点,暂时总结Binary Tree。
因为树结合了其他数据结构的优势:
平衡树: 左右子树及其的高度相差<=1,并且左右子树也是平衡树。
Find:
Insert
Delete
找到下一个节点
Traverse Binary Tree:
Reference: @Terry Lee
]]>本文是Twitter Analytics on the Cloud项目的介绍及分析总结。小组作业当时做的匆忙,现在再思考下可以优化的地方很多。感谢队友@shuangshuang 和 @烟酱。
目标:

Twitter数据集,大于1T,JSON格式存储。
在搭建前端之前,需要慎重选择框架。对比主流web框架,参考Techempower,我们最终选择用vertx和undertow进行开发。 具体可以参考一些比较好的配置指南:
Vertx:
vertx Document My first Vert.x 3 Application
根据request设计好数据库的schema以后,要好好设计ETL。因为我们这里用EMR把twitter数据集载入到数据仓库中,每次需要10-20个小时,而EMR特别贵,所以最好不要重复劳动。最初,用小数据及来测试。
这一阶段我们要处理两类请求,从存储系统中获取数据,搭建好的web service 需要能够连接到两个不同的后端存储系统(MySQL 和 HBase),前端需要通过端口 80 接收 HTTP GET 请求。
这里主要要写一个Map和一个Reduce文件来处理数据。原始数据的格式是JSON,我们需要处理成需要的数据格式:
请求格式
userid+hashtag
GET /q2?userid=uid&hashtag=hashtag
响应格式 (如果Tweet存在)
TEAMID,TEAM_AWS_ACCOUNT_ID\n Sentiment_density1:Tweet_time1:Tweet_id1:Cencored_text1\n Sentiment_density2:Tweet_time2:Tweet_id2:Cencored_text2\n Sentiment_density3:Tweet_time3:Tweet_id3:Cencored_text3\n
响应格式 (如果Tweet不存在)
TEAMID,TEAM_AWS_ACCOUNT_ID\n \n
map和reduce程序写完后,到EMR上面跑,要注意:
目标吞吐量: 10000 rps 不允许用现用的缓存设备,可以自己写缓存。 会查询某个用户用指定的 hashtag 发的 tweet,主要考察如何设计一个高效的后端来处理大量的请求。
ETL结束以后,我们需要导入数据库。在这个过程中,我们纠结于replication和sharding的选择。 Replication是指将完整的数据库存在每一台机器上,而Sharding是指分成几个部分分别存在每一台机器上。最终,选择了Sharding模式。
按照我们刚刚说过的请求格式和响应格式,我们对MySQL和HBase进行设计:
(这里参照了Yuki组的赢家设计模式,非常简单粗暴) 原来的schema是每一列都很清晰,但是这样row相比后面的设计模式多了很多,导致数据库的读取速度慢了很多。 所以新的schema就选择只存取id,读取所有的tweets以后,让前端进行相应的解析。
鉴于HBase是key-value存储模式,我们在这里只要考虑key里怎么放,剩下的数据全都放到column family里面就可以了。 我们采用tweet_id + user_id + hashtag作为rowkey。
1.分配合适的内存给 RegionServer 服务: 例如在 HBase 的 conf 目录下的 hbase-env.sh 的最后添加 export HBASE_REGIONSERVER_OPTS=”-Xmx16000m $HBASE_REGIONSERVER_OPTS” 其中 16000m 为分配给 RegionServer 的内存大小。
2.RegionServer 的请求处理 IO 线程数: 较少的 IO 线程适用于处理单次请求内存消耗较高的 Big Put 场景 (大容量单次 Put 或设置了较大 cache 的 Scan,均属于 Big Put) 或 ReigonServer 的内存比较紧张的场景。 较多的 IO 线程,适用于单次请求内存消耗低,TPS 要求 (每秒事务处理量 (TransactionPerSecond)) 非常高的场景。设置该值的时候,以监控内存为主要参考。 在 hbase-site.xml 配置文件中配置项为 hbase.regionserver.handler.count 200
3.调整 Block Cache: hfile.block.cache.size:RS的block cache的内存大小限制,默认值0.25,在偏向读的业务中,可以适当调大该值,具体配置时需试hbase集群服务的业务特征,结合memstore的内存占比进行综合考虑。
Team Project过去挺久了,很多细节记不得了,清洗数据的部分有很多细节需要注意,并不像这里写的一两句话就讲清楚了。还有数据库优化是一条不归路,盲目优化会导致反向优化,其实根据后来赢家的报告来看,优化并起不到多少作用,好的schema设计才是提高performance的最根本。 云计算这门课的精华,都在这个Project,覆盖了大部分这门课的所实验的知识。从load balance到sharding和replication,再到SQL和NoSQL数据库,再到EMR的应用,就差并行并发那部分的内容了。 学习是不难的,有指导来做project也不难,真正到了实际应用中,没有人知道正确答案,靠的都是思考和经验了。
References:
本文是关于CMU15619Cloud Computing项目:Social Networking Timeline with Heterogeneous Backends
的介绍以及总结反思。
项目主要目标:
在AWS中,我们可以用其中的RDS的MySQL服务。
MongoDB是NoSQL数据库的典型,基于文档存储(Document-oriented),不支持事务和表连接,所以查询的编写、理解和优化比较容易。之后会写一篇关于NoSQL的总结(一个坑)。 和HBase的key-value存储模式不同,MongoDB基于文档存储模式的优势在于可以支持复杂的数据类型,并且也支持Index。 MongoDB使用BSON类型存储数据,据说就是把文本直接转成二进制表示,BSON用于以下三种目的:
比如这个:
如今像Facebook, Twitter和Instagram都需要复杂和涉及良好的后端来处理多种类型的用户数据,提供持续的高性能低延迟的服务。同时还要通过实时数据分析为公司和广告商提供有价值的信息。
社交网络中的数据通常包括以下三种:
社交网络的前端已经做好,我们需要把四中不同的数据集存入三种数据库(MySQL, HBase, MongoDB),你完成的后端要能同时响应四中不同的request。
在AWS RDS中配置MySQL并导入users.csv, userinfo.csv数据集。
连接AWS RDS中MySQL时注意:
远程登录需要导入数据时要加入 --local-infile得到授权。
mysql -u username -p password -h hostname --port=portname --local-infile database
数据集格式:
导入MySQL语句:
LOAD DATA LOCAL INFILE 'filename' INTO TABLE tablename CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
请求格式:
GET /task1?id=[UserID]&pwd=[Password]
响应格式:
returnRes({"name":"my_name", "profile":"profile_image_url"})
所以,之后在Java文件中连接数据库,再创建JSON相应的代码即可。 测试:
http://<your_front_end_dns>:3000
用HBase来保存用户间的follow关系,可以选择用之前在图中介绍的邻接矩阵和邻接表中选择一种,来保存数据。
原始数据格式:
<followee, follower>
请求格式:
GET /task2?id=[UserID]
响应格式:
{"followers":[{"name":"follower_name_1", "profile":"profile_image_url_1"}, {"name":"follower_name_2", "profile":"profile_image_url_2"}, ...]}
如之前介绍的那样,对于各种形式的帖子,用MongoDB存储会是一个很好的选择。这里会查询一些特定的field,所以可以建立索引来加速查询。
帖子数据的形式:
关于MongoDB建立索引,可以参考这里
请求格式:
GET /task3?id=[UserID]
响应格式:
{"posts":[{post1_json}, {post2_json}, ...]}
测试方法:
之前三个部分分别实现了三个数据库的存储,现在我们希望实现输入一个userid就可以返回用户信息(MySQL),用户粉丝列表(HBase)以及用户关注的人最新三十条帖子(MongoDB)。
排序规则:
请求格式:
GET /task4?id=[UserID]
响应格式:
{"name":"my_name", "profile":"my_profile_image_url", "followers":[{"name":"follower_name_1", "profile":"profile_image_url_1"}, {"name":"follower_name_2", "profile":"profile_image_url_2"}, ...], "posts":[{post1_json, post2_json, ...}]}
推荐系统的内容太多了,可以看看shaung的博客(一个广告) 这次我们用协同过滤算法实现一个简单的推荐系统,利用“朋友的朋友”来推荐好友。
比如:
我们可以得到与A的距离关系为:
{A:1, C:1, E:1, F:1, G:2, H:1}
其中去掉A本身,去掉A已经关注的C,剩下的就是
{G: 2, E: 1, F: 1, H: 1}
请求格式:
http://backend-public-dns:8080/MiniSite/task5?id=<user_id>
响应格式:
returnRes({"recommendation":[{name:<name1>, profile:<profile1>},{name:<name2>, profile:<profile2>},...,{name:<name10>, profile:<profile10>]})
Done!
Reference:
CMU15619课件:Social Networking Timeline with Heterogeneous Backends
小土刀博客:http://wdxtub.com/vault/cc-17.html
Always update...
Is the JVM (Java Virtual Machine) platform dependent or platform independent? What is the advantage of using the JVM, and having Java be a translated language?
JVM translates bytecode into machine language Every Java program is first compiled into an intermediate language called Java bytecode. The JVM is used primarily for 2 things: the first is to translate the bytecode into the machine language for a particular computer, and the second thing is to actually execute the corresponding machine-language instructions as well. The JVM and bytecode combined give Java its status as a "portable" language – this is because Java bytecode can be transferred from one machine to another.
Machine language is OS dependent Since the JVM must translate the bytecode into machine language, and since the machine language depends on the operating system being used, it is clear that the JVM is platform (operating system) dependent – in other words, the JVM is not platform independent.
The JVM is not platform independent The key here is that the JVM depends on the operating system – so if you are running Mac OS X you will have a different JVM than if you are running Windows or some other operating system.
In Java, what’s the difference between method overloading and method overriding?
Overloading:
Method overloading in Java occurs when two or more methods in the same class have the exact same name but different parameters (remember that method parameters accept values passed into the method). However, method overloading is a compile-time phenomenon.
Can be
overloading:
Not overloading
Overriding: [根本也记不住,其实我的方法是小朋友骑在爸爸肩膀上,他们主体是一样的,不会变的,即方法参数返回值不变,但内容变了。(:зゝ∠)] Overriding means that a method inherited from a parent class will be changed. But, when overriding a method everything remains exactly the same except the method definition – basically what the method does is changed slightly to fit in with the needs of the child class. But, the method name, the number and types of parameters, and the return type will all remain the same. Method overriding is a run-time phenomenon that is the driving force behind polymorphism.
What’s the point of having a private constructor?
Defining a constructor with the private modifier says that only the native class (as in the class in which the private constructor is defined) is allowed to create an instance of the class, and no other caller is permitted to do so.
There are two possible reasons why one would want to use a private constructor – the first is that you don’t want any objects of your class to be created at all, and the second is that you only want objects to be created internally – as in only created in your class.
A singleton is a design pattern that allows only one instance of your class to be created, and this can be accomplished by using a private constructor.
In Java, what’s the difference between an object and a class?
Shortly: An object is an instance of a class. Objects have a lifespan but classes do not.
What is the main difference between Java platform and other platforms?
The Java platform differs from most other platforms in the sense that it's a software-based platform that runs on top of other hardware-based platforms.It has two components:
What gives Java its 'write once and run anywhere' nature?
The bytecode. Java is compiled to be a byte code which is the intermediate language between source code and machine code. This byte code is not platform specific and hence can be fed to any platform.
Yes, save your java file by .java only, compile it by javac .java and run by java yourclassname Let's take a simple example:
compile it by javac .java
run it by java A
It is empty. But not null.
Program compiles and runs properly.
The local variables are not initialized to any default value, neither primitives nor object references.
Object based programming languages follow all the features of OOPs except Inheritance. Examples of object based programming languages are JavaScript, VBScript etc.
The object references are all initialized to null in Java.
Constructor in java is a special type of method that is used to initialize the object.
Java constructor is invoked at the time of object creation. It constructs the values i.e. provides data for the object that is why it is known as constructor.
Rules for creating java constructor
There are basically two rules defined for the constructor.
Constructor name must be same as its class name Constructor must have no explicit return type
Types of java constructors
There are two types of constructors:
Default constructor (no-arg constructor) Parameterized constructor
References: http://www.programmerinterview.com/ https://www.javatpoint.com/constructor
]]>Design an algorithm to encode a list of strings to a string. The encoded string is then sent over the network and is decoded back to the original list of strings.
Machine 1 (sender) has the function:
Machine 2 (receiver) has the function:
So Machine 1 does:
and Machine 2 does:
strs2 in Machine 2 should be the same as strs in Machine 1.
Implement the encode and decode methods.
Note:
乍一看,也不知道说的是什么。其实题意是给一个list的字符串,先要拼成一整个字符串,是encode。然后把这整个字符拆回一个list的字符。
所以考点是如何合理地分隔,然后还能识别出来。
这哪儿是算法,其实考的是Serilization这个计算机系统中的基本概念。
Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.
For example,
非常简单的题目,可以用queue或者arraylist或者array保存next的值。用一个sum存着总和,每次都计算一下平均值。
CMU-95702分布式系统 第6、9章总结笔记
Indirect Messaging: Indirect communication is defined as communication between entities in a distributed system through an intermediary with no direct coupling between the sender and the receiver(s).
Two messaging modes:
some example scenarios:
indirect messaging protocols:
Java's JMS API:
JMS Queues and topics
JMS message types:
Message driven beans: components that are executedasynchronously by messages coming available in a Queue or Topic.
Line Question on class:
CMU-95702分布式系统 第19章总结笔记
How a new device become part of the local network?
Sensing and Context Awareness:
Location Sensing:
Adaptation:
Device awareness / browser detection: Reply differently depending on what device makes request. 3 HTTP headers provide clues of what the device is:
User-Agent • Identifies the mobile browser and almost always the device manufacturer and model. • BlackBerry8330/4.3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/105 • Collection of mobile agent strings: – http://www.zytrax.com/tech/web/mobile_ids.html
X-Wap-Profile • Link to an XML profile of the phone’s capabilities •E.g.http://www.blackberry.net/go/mobile/profiles/uaprof/8310/4.2.2.rdf
Accept • Supported MIME(多用途的网际邮件扩充协议)types • E.g. text/html, application/xhtml+xml, etc.
These 3 headers can provide enough info , but: - header can be missing - have inaccurate values - have invalid urls
Mobile first:
A philosophy of web design
Design for mobile first, and desktop second
Counter to what has been done historically, of mobile 2nd
Benefits of Mobile First: - Focus on the platform on which you will reach the most users - Forces designers to focus on the most important content and functionality - Allows for using technologies on mobile: * touch events * geolocation 地理定位 * accelerometer 加速计
Mobile deployment strategies:
CMU-95702分布式系统 ACID概念总结
今天上Advanced Cloud Computing,三个教授就一个问题争论起来。
那真的是很触动我的一刻,加起来都快150岁的三个顶尖学术大牛,在投影仪前面,对待知识还是和孩子一样专注和热情,可爱极了。
忽然想到,Greg的主页上写着,“我才不是个不度假的教授,我2012年去冲浪了呢!”。
其实,每次选课都很头疼,时间太少,想学的课太多,只恨自己不能多读几年。我也知道上学期很不开心的时候,发过誓这学期不要选很难的课了。可是我的研究生只有一次,在CMU念书的机会也只有一次(当然我不介意以后再来哈哈哈),无法不说服自己再争取一下。
只是,最近有一个问题在渐渐放大。
我到底要去哪里。
其实,很多人也不知道到底要去哪里。但其实每个人,都能看到那么一些些微弱的光,好像是那个地方。只是有些人会选择努力跑着去,有些人怀疑自己是否真的看见了光,有些人,装作看不见。
之前和萱哥聊天,萱哥倒是很爽快,说不管去哪儿不想呆北京吸霾了,除非这次考上了北影。两年了啊,北影的梦还在。
你看你看,坚定的人都很坦然。
就像机器学习拿了满分的Mengyao,总和我说毕业找不到工作,打算去星巴克门口蹲着摆个碗。
所以有的时候,不知道自己要去哪儿其实也不可怕。
毕竟未来未知不可怕,已知才最可怕。
我算是想明白了,关于人生,我一直思考得太累了。这明明是一道无解题,就算我在某个时刻心满意足想明白了,也一定是幻觉。
没有答案的。所以不要思考了。
还不如痛痛快快活一次就好。
]]>总结几种排序方法。 冒泡排序,选择排序,插入排序,Quick Sort,Merge Sort(continue..)...
Simple sorting
慢,但是简单。 Time complexity: O(N^2)
步骤:
举例:
Code:
int[ ] data = {4, 7, 2, 5, 3}
Swap Method
Bubble Sort:
比冒泡排序快但是依旧不够快。 Time complexity: O(N^2) 比冒泡排序少了很多swap的过程,所以稍微快一些。
步骤:
举例:
Code:
最直观的排序法。 Time complexity: O(N^2)
步骤:
举例:
Code:
##Quick Sort## Time complexity: O(NlogN)
步骤: 是一种对冒泡排序的一种改进。通过一趟把数据分成独立的两部分,其中所有的数据都比另一份数据小。然后再继续排序。递归直到整个数据变成更有序序列。
举例
代码
##Merge Sort## Time complexity: O(NlogN)
Code