Hive环境搭建与入门

一、概述
hive是一个基于hadoop的数据仓库基础设施, 提供数据的提取转换加载和查询, 不适于少数据量(比如几亿)的数据查询, 也不适于实时或者在线数据的查询, 是一个非实时的, 离线的数据查询工具. hive没有自己的文件格式, 只需要普通的文件格式或者用户自定义的格式就可以了.

二、环境搭建

hive不需要神马集群配置, 只是需要编译一个环境就好了, 编译的过程, 国人表示很蛋疼, 因为他的ant脚本中, 使用的镜像居然是facebook的, 翻墙了都没用表示很纠结. 所以需要把facebook的镜像改为可用的(最好是国内的, 诸如 人人网, 北京交通大学等等镜像), 镜像的选择可以根据个人喜好和地理位置自由选取, 当然是不能被GFW墙了的.(参考http://www.apache.org/dyn/closer.cgi/hadoop/core/)
1. 下载源代码: svn co http://svn.apache.org/repos/asf/hive/trunk hive

基于zookeeper实现的分布式锁

A distributed lock base on zookeeper.

zookeeper是hadoop下面的一个子项目, 用来协调跟hadoop相关的一些分布式的框架, 如hadoop, hive, pig等, 其实他们都是动物, 所以叫zookeeper(本人歪歪).

zookeeper其实是集群中每个节点都维护着一棵相同的树, 树的结构跟linux的目录结构的概念差不多, 以/为跟节点, 下边可以扩展任意的节点和叶子节点, 每个节点都可以写入数据. 基于zookeeper的分布式锁的实现, 其实是得益于zookeeper同步文件的强大性, 我们相信每时每刻我们访问zookeeper的树时, 相同节点返回的数据都是一致的. 这要靠zookeeper内部的一些算法来实现. 特别是leader的选举算法, 这里就不说了, 感兴趣的话可以去搜索一下看看.

我们知道了zookeeper集群的每个节点的数据都是一致的, 那么我们可以通过这些节点来作为锁的标志.

首先给锁设置一下API, 至少要包含, lock(锁住), unlock(解锁), isLocked(是否锁住)三个方法

洗牌算法的实现

所谓洗牌, 就是把牌搀和整理,以便继续玩, 要的就是把原来的牌的顺序打乱, 以便游戏的公平公正性.

传统的洗牌算法是将牌一次性洗好, 然后把洗好的牌按顺序取, 这也跟现实中的洗牌比较像.

而本人实现的一个洗牌算法, 是不打乱原来的牌的顺序的, 只是在取牌的时候, 是无序(随机)的, 这也得到的牌也是乱序的, 也能得到洗牌的效果.

例如下图所示:

淘宝客API研究

1.每个推广API都可以绑定用户的登陆帐户, 这个帐户可以是alimama的, 也可以是淘宝的, 这样用户在登陆到网址之后, 搜索的结果就可以是用户自己的推广链接了. 这个是完全可以实现的, 但是目前很多回扣网址是先把回扣给自己, 自己取其中一部分, 再给用户回扣的.

2.API自带了排序功能. 这一按价格, 佣金比率, 信用,  销量等进行排序, 这样可以呈现给用户更好的体验. 要得到某个关键词的最高佣金, 其实是很简单的, 按照佣金降序排序一下就可以了.

模拟comet的实现

本文没有使用任何comet服务器, 只是利用tomcat模拟实现了一下comet, 不是真正的comet哦,因为不会有这样的应用场景, 只是模拟实现, 仅供参考.

一. 需求.

实现将服务端的时间推送到客户端, 客户端在得到服务端相应后将时间显示在页面上.

二.实现.

1开发框架: 用jsp+servlet的方法, 用了一个webframework框架, 自己写的, 类似于struts2, 可以的话就把它当作struts2来看吧.

2. jsp代码如下

php的if语句

为了搞个404页面, 自己编辑sidebar.php, 由于sidebar.php展示的东西太多了, 我想要在404的时候不显示太多的东西, 只要一404图片和一个微博秀就行了,所以在sidebar加if语句就可以了, 呀的, 没想到一直语法错误, 看到有一个if语句是加了个冒号的, 有点疑惑, 搜索了一下, 才知道 if后面加个冒号可以跟endif;配合, 相当于{}, 所以一下子就解决了.


<?php if(condition){

//do something

}

?>

或者


<?php if(condition): ?>

do what you like

<html>tag supported

<?php endif; ?>

对comet的一些思考

哎, 天朝这么大, 对comet的研究的文章却少之又少. 所以目前我除了知道一些可以实现comet的框架之外, 不知道他们是如何实现的, 可以不可以在现有的app 服务器上做一些框架就可以实现, 而不需要实现什么协议.
comet是基于ajax之上的, 或者说基于httpxmlrequest之上的, 实现原理如下:
客户端:发送XHR请求, 一有数据返回就进行处理并继续发起下一个XHR请求, 如此反复.
服务器端:接到来自客户端的请求后, 不是马上返回数据, 而是阻塞着, 等到有需要返回数据的时候(如数据的更新)才返回给客户端.
客户端的技术很容易做到的, 就一个递归的调用, 但服务器端如何做到等到数据的更新, 我想这里其实可以引入事件模型, 就是服务器端注册一系列的事件, 使用线程侦听事件, 当事件触发的时候设置返回值, 并促发服务器返回数据.
目前在我脑钟有点想法, 画了个草图, 准备找一天把他实现一下, 也不知道这种想法是不是正确的. google comet信息会比较多, 可惜英文比较难读懂呐.汗.

加油!

struts2的action的执行过程解析

阅读了struts2的部分源码, 才知道, 原来struts2是不用servlet的, 只用了filter就可以实现所有的功能, 包括action和interceptor.

首先, 一个请求过来, filter会拦截到, 通过解析请求URL, 得到请求的target(哪个类的哪个方法), 放在actionMapping里边, 这个通过actionMapping可以得到要执行的类的方法, 然后作为对象放到DefaultActionInvocation这个类中, 这个类是实现了ActionInvocation的类, 没错, 就是在struts2的拦截器方法intercept(ActionInvocation invocation)的参数类型.把代码罗列出来比较容易看.

先看看FilterDispatcher这个filter的doFilter方法

 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        ServletContext servletContext = getServletContext();

        String timerKey = "FilterDispatcher_doFilter: ";
        try {

            // FIXME: this should be refactored better to not duplicate work with the action invocation
            ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
           //这里就是为什么我们可以在action中直接使用ActionContext.getContext().getRequest()
           //来得到当前的request等对象了. 用的是ThreadLocal的存储.
            ActionContext ctx = new ActionContext(stack.getContext());
            ActionContext.setContext(ctx);

            UtilTimerStack.push(timerKey);
            request = prepareDispatcherAndWrapRequest(request, response);
            ActionMapping mapping;
            try {
                mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());
            } catch (Exception ex) {
                log.error("error getting ActionMapping", ex);
                dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
                return;
            }

            if (mapping == null) {
                // there is no action in this request, should we look for a static resource?
                String resourcePath = RequestUtils.getServletPath(request);

                if ("".equals(resourcePath) && null != request.getPathInfo()) {
                    resourcePath = request.getPathInfo();
                }

                if (staticResourceLoader.canHandle(resourcePath)) {
                    staticResourceLoader.findStaticResource(resourcePath, request, response);
                } else {
                    // this is a normal request, let it pass through
                    chain.doFilter(request, response);
                }
                // The framework did its job here
                return;
            }

            dispatcher.serviceAction(request, response, servletContext, mapping);

        } finally {
            try {
                ActionContextCleanUp.cleanUp(req);
            } finally {
                UtilTimerStack.pop(timerKey);
            }
        }
    }