Archive for October, 2013

作者:AngryFox 分类: Uncategorized October 15th, 2013 暂无评论

[go]#列出所有服务器地址,nginx 自动均衡分发请求到各个服务器。
upstream frontends {
ip_hash;
server 192.168.199.1:8088;
server 192.168.199.2:8089;
}
server {
listen 80;
server_name mydomain.com www.mydomain.com;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://frontends;
}

#静态资源交由nginx管理
location /static {
root /var/www/mydomain/web;
expires 1d;
add_header Cache-Control public;
access_log off;
}
}`[/go]

作者:AngryFox 分类: Uncategorized October 15th, 2013 暂无评论

单CPU
2000 1660.05 17662/100000失败数 大量丢包
1000 4745.45
500 5429.92
200 6123.85
100 8209.74
50 8486.13
30 8239.44
25 8559.44
10 7799.68

多CPU:

5000 9245.94
2000 9662.1
1000 9285.14
500 8765.08
234 12319.6
200 12498.7
172 12755.8
100 12496.4
50 10841.4
30 11519.9
25 11218.2
10 11664
结论:单核时,最佳为25线程;多核时最佳200个线程
测试机器:Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
24核,64G内存

package main

import (
    "fmt"
    "log"
    "net/http"
    "runtime"
)

func main() {
    // 限制为1个CPU
    runtime.GOMAXPROCS(1)

    http.HandleFunc("/", func(w http.ResponseWriter, r  *http.Request) {
        fmt.Fprint(w, "Hello, world.")
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}
多核
package main

import (
    "fmt"
    "log"
    "net/http"
    "runtime"
)

func main() {
    // 限制为CPU的数量减一
    runtime.GOMAXPROCS( runtime.NumCPU() - 1 )

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello, world.")
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}
作者:AngryFox 分类: Uncategorized October 15th, 2013 暂无评论

许:“当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中
之前使用defer 关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致
逐层向上执行panic流程,直至所属的goroutine 中所有正在执行的函数被终止。错误信息将被报
告,包括在调用panic()函数时传入的参数,这个过程称为错误处理流程。”
go语言中的defer就像c++中的析构函数,但是go语言中defer的对象是函数(或者对象的方法),defer能保证在函数结束最后执行该方法(函数),但是有例外:如果在定义的方法中defer定义的方法如果在panic后面,defer定义的方法就无法执行到。

panic 是用来表示非常严重的不可恢复的错误的。在Go语言中这是一个内置函数,接收一个interface{}类型的值作为参数。panic 的作用就像我们平常接触的异常。不过Go可没有try…catch,所以,panic一般会导致程序挂掉(除非recover)。所以,Go语言中的异 常,那真的是异常了。你可以试试,调用panic看看,程序立马挂掉,然后Go运行时会打印出调用栈。
但是,关键的一点是,即使函数执行的时候 panic了,函数不往下走了,运行时并不是立刻向上传递panic,而是到defer那,等defer的东西都跑完了,panic再向上传递。所以这时 候 defer 有点类似 try-catch-finally 中的 finally。
panic就是这么简单。抛出个真正意义上的异常。

panic的函数并不会立刻返回,而是先defer,再返回,如果有办法将panic捕获到,并阻止panic传递,就正常处理,如果没有没有捕获,程序直接异常终止(可以注释掉下面程序中的recover试一试)。

Go语言提供了recover内置函数,前面提到,一旦panic,逻辑就会走到defer那,那我们就在defer那等着,调用recover函 数将会捕获到当前的panic(如果有的话),被捕获到的panic就不会向上传递了,于是,世界恢复了和平。你可以干你想干的事情了。

不过要注意的是,recover之后,逻辑并不会恢复到panic那个点去,函数还是会在defer之后返回。

作者:AngryFox 分类: Uncategorized October 13th, 2013 暂无评论

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

Hadoop是一个存储计算框架,主要由两部分组成:
1,存储(Hadoop分布式文件系统-HDFS)
2,计算(MapReduce计算框架)
1,Hadoop分布式文件系统
这是一种文件系统实现,类似于NTFS,ext3,ext4等等,不过它是建立在更高的层次之上的。在HDFS上存储的文件被分成块(每块默认未64M,比一般的文件系统块大小大的多,可调)分布在多台机器上,其中的每块又会有多块的冗余备份(默认为3),以增强文件系统的容错能力。这种存储模式与后面将要说明的MapReduce计算模型相得益彰。HDFS在具体实现中主要有以下几个部分:

一、名称节点(NameNode):它的职责在于存储整个文件系统的元数据,这是个非常重要的角色。元数据在集群启动时会加载到内存中,元数据的改变也会写到磁盘上的一个文件系统映像文件中(同时还会维护一个对元数据的编辑日志)。目前名称节点还是一个单点。因为HDFS存储文件的时候是将文件划分成逻辑上的块来存储的,模个文件对应那些块都存储在名称节点上,所以如果它有损坏整个集群的数据将不可用。当然我们可以采取一些措施来备份名称节点的元数据(文件系统映像文件),比如可以将名称节点目录同时设置到本地目录和一个NFS目录,这样任何元数据的改变将写入到两个位置做冗余备份,向两个目录冗余写的过程是原子的。这样,在使用中的名称节点宕机之后,我们可以使用NFS上的备份文件来恢复文件系统。

二、第二名称节点(SecondaryNameNode):这个角色的作用就是定期通过编辑日志合并命名空间映像,防止编辑日志过大。不过第二名称节点的状态是滞后于主名称节点的,所以如果主名称节点挂掉,也必定会有一些文件损失。

三、数据节点(DataNode):这是HDFS中具体存储数据的地方,一般有多台机器。除了提供存储服务,它们还定时向名称节点发送它们存储的块的列表,所以名称节点没有必要永久保存每个文件的每个块所在的数据节点,这些信息会在系统启动后由数据节点重建。

2,MapReduce计算框架

这是一种分布式计算模型,其核心就是将任务分解成小任务由不同的计算者同时参与计算,并将各个计算者的计算结果合并得出最终的结果。模型本身非常简单,一般只需要实现两个接口即可;问题的关键在于怎样将实际问题转化为MapReduce任务。Hadoop的MapReduce部分主要由以下几部分组成:

一、作业跟踪节点(JobTracker):负责任务的调度(可以设置不同的调度策略)、状态跟踪。它的角色有点类似于HDFS中的名称节点,JobTracker也是一个单点,在未来的版本中可能会有所改进。

二、任务跟踪节点(TaskTracker):负责具体的任务的执行。它通过“心跳”的方式告知JobTracker其状态,并由JobTracker根据其报告的状态为其分配任务,TaskTracker会启动一个新的JVM来运行一个任务,当然JVM实例也可以被重用。

以上就是对于Hadoop最重要的两个部分的简介,Hadoop存在的理由就是它适应于大数据的存储计算。一个Hadoop集群可以看成是一个存储、计算“数据”的“库”。

Hive是一个构建于Hadoop集群之上的“数据仓库”应用

Hive是Facebook开发的构建于Hadoop集群之上的数据仓库应用,它提供了类似于SQL语法的HQL语句作为数据访问接口,这使得普通分析人员的应用Hadoop的学习曲线变缓。

作者:AngryFox 分类: Uncategorized October 12th, 2013 暂无评论

1. std::tr1::unordered_map 与 std::ext/hash_map
任何情况下,如果要在这两个容器之间选择的话,我们毫不犹豫应该选择 unordered_map。因为他的性能在上述4中操作中均优于 hash_map,甚至可以说远远优于 hash_map。

2. std::tr1::unordered_map 与 std::map
map的性能总体来说是最差的。但是,当我们需要一个有序的关联容器的时候,我们必须选择std::map,因为 unordered_map 内部元素不是有序的,这一点从名字都可以看出来。除此之外都应该选择 unordered_map 。

3. 上述测试中,unordered_map 的遍历性能几乎是常数级别的,与常识不太相符,需要再研究研究。

作者:AngryFox 分类: Uncategorized October 9th, 2013 暂无评论

Pig:分析大数据集的一个平台,该平台由一种表达数据分析程序的高级语言和对这些程序进行评估的基础设施一起组成。
Hive:用于Hadoop的一个数据仓库系统,它提供了类似于SQL的查询语言,通过使用该语言,可以方便地进行数据汇总,特定查询以及分析存放在Hadoop兼容文件系统中的大数据。
Hbase:一种分布的、可伸缩的、大数据储存库,支持随机、实时读/写访问。
Sqoop:为高效传输批量数据而设计的一种工具,其用于Apache Hadoop和结构化数据储存库如关系数据库之间的数据传输。
Flume:一种分布式的、可靠的、可用的服务,其用于高效地搜集、汇总、移动大量日志数据。
ZooKeeper:一种集中服务,其用于维护配置信息,命名,提供分布式同步,以及提供分组服务。
RESTful 架构遵从以下几个原则:

请求是客户-服务器 式的,并很自然地使用一种基于拉的交互风格。
请求是无状态的。每个从客户端到服务器端的请求都必须包含理解此请求所需的全部信息,而且不能利用服务器上所存储的上下文。
客户端和服务器都遵从统一的接口。所有的资源都可通过 Web 的普通接口进行访问 —— HTTP 及 HTTP 方法:GET、POST、PUT 和 DELETE。
客户端通过URI与命名的资源进行交互。
将http 状态码作为系统的状态码。

REST架构风格最重要的架构约束有6个:

客户-服务器(Client-Server)
通信只能由客户端单方面发起,表现为请求-响应的形式。
无状态(Stateless)
通信的会话状态(Session State)应该全部由客户端负责维护。
缓存(Cache)
响应内容可以在通信链的某处被缓存,以改善网络效率。
统一接口(Uniform Interface)
通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。
分层系统(Layered System)
通过限制组件的行为(即,每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。
按需代码(Code-On-Demand,可选)
支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。
REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括以下内容:
7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

HTTP头信息(可自定义)

HTTP响应状态代码(可自定义)
一套标准的内容协商机制
一套标准的缓存机制
一套标准的客户端身份认证机制
大多数数据管理系统至少可以分为数据获取(Data Ingestion)、数据存储(Data Storage)和数据分析( Data Analysis)三个模块

Go语言在强类型、动态和并发,避免了过度设计的陷阱
技术知识、领域知识和沟通能力之间的均衡发展
《架构腐化之谜》中,就认为可以通过“将独立的模块放入独立的进程”来解决架构因为代码规模变大而腐化的问题
插件架构(Plugin),以数据库为中心的架构(Database Centric),模型-视图-控制器架构(MVC),面向服务的架构(SOA),三层模型(Three-Tier model),模型驱动架构(MDA)等
哈希表的基本概念:

哈希表通过一个哈希函数对键值(key)进行散列操作,并且最终根据散列结果将键值对(key-value-pair)储存到数组的某个节点(一般通过对数组长度取余实现)。
哈希表的数组长度会根据元素的实际数量动态进行扩容,以保证有足够空间并降低取余后的结果出现重复的可能性。不同的实现,其初始默认长度、扩容条件及扩容算法均可能有所区别。
极端情况下,哈希表将会退化成链表。
优秀的WEB框架-Tornado

1,“怎么解决这个问题?” – 你依然冲在第一线,还不懂管理。
2,“应该让谁去解决这个问题?” – 你是低层管理人员。
3,“怎么避免这个问题以后再次发生?” – 你是高级管理人员。
4,“一定要解决这个问题么?” – 你是Boss。

Membase集群。Membase在百分点推荐引擎中扮演了主存的角色,主要用于支持百分点推荐引擎的计算。目前,百分点推荐引擎包含了大大小小十多个在线和离线计算模块,这些模块计算过程中需要用到很多数据,并产生以及大量的中间结果,包括用户在各个网站的行为历史,资源之间的关系等等。这些数据的特点是不需要Schema,数量多,但绝大多的使用频率很低。之所以选用Membase,主要原因是因为它可以很方便的进行横向扩展以及有丰富的Client API支持。
在线算法包括协同过滤(UserBased/ItemBased CF),基于内容的推荐(Content Based),热扩散(Heat Diffusion),用户行为模式分析(Behavior PatterAnalysis)等等。离线算法包括KNN聚类,基于FP Tree的关联规则挖掘,基于上下文统计的关联规则挖掘,序列模式算法,文档建模算法等等。
坚持模块化,低耦合,消除单点等原则
架构师的智慧
一处一个事实、自动传播、架构也包含构建、最少量机制、构建引擎、O(G)、增长的阶、抵制熵增