(TopkOnJstorm)第二周工作报告:2014-07-14~2014-07~20

本周的工作分两个部分

一:搭建JStorm环境(三个机器组成的集群)

    由于微软AZure的虚拟机还没有申请下来,我先在实验室的环境下搭建了

    1. 搭建Zookeeper集群

        a) 下载Zookeeper的3.4.5版本,解压至/xxx/xxx/zookeeper-3.4.5

        b) 配置环境变量(在~/.bashrc)

            export ZOOKEEPER_HOME=/xxx/xxx/zookeeper-3.4.5 

            export PATH=$PATH:$HOME/bin:$ZOOKEEPER_HOME/bin

            export CLASSPATH=$CLASSPATH:$ZOOKEEPER_HOME/lib

        c) 配置$ZOOKEEPER_HOME/conf/zoo.cfg,主要有

             dataDir=/home/yangrenkai/data/zookeeper/data

             clientPort=5181

             server.1=blade5:2881:3881 

             server.2=blade7:2881:3881

             server.3=blade8:2881:3881

        d) 在dataDir下建立一个myid文件,内容为1或2或3,根据server.x的x来定。

    2. 安装java1.7和python 2.6,因为JStorm是由大量的java和python编写。

    3. 安装JStorm-0.9.3.1

        a) 下载JStorm-0.9.3.1版本,解压至/xxx/xxx/jstorm-0.9.3.1

        b) 配置环境变量(在~/.bashrc)

            export JSTORM_HOME=/xxx/xxx/jstorm-0.9.3.1

            export PATH=$PATH:$JSTORM_HOME/bin

        c) 配置$JSTORM_HOME/conf/storm.yaml

            storm.zookeeper.servers: 表示zookeeper 的地址

            storm.zookeeper.port: 表示zookeeper的端口

            nimbus.host: 表示nimbus的地址

            storm.zookeeper.root: 表示jstorm在zookeeper中的根目录,当多个JStorm共享一个ZOOKEEPER时,需要设置该选项,默认               即为“/jstorm”

            storm.local.dir: 表示jstorm临时数据存放目录,需要保证jstorm程序对该目录有写权限

            java.library.path: zeromq 和java zeromq library的安装目录,默认"/usr/local/lib:/opt/local/lib:/usr/lib"

            supervisor.slots.ports: 表示supervisor 提供的端口slot列表,注意不要和其他端口发生冲突,默认是68xx,而storm的是67xx

            supervisor.disk.slot: 表示提供数据目录,当一台机器有多块磁盘时,可以提供磁盘读写slot,方便有重IO操作的应用

            topology.enable.classloader: false, 默认关闭classloader,如果应用的jar与jstorm的依赖的jar发生冲突,比如应用使用thrift9,               但jstorm使用thrift7时,就需要打开classloader

            nimbus.groupfile.path: 如果需要做资源隔离,比如数据仓库使用多少资源,技术部使用多少资源,无线部门使用多少资源时,             就需要打开分组功能, 设置一个配置文件的绝对路径,改配置文件如源码中group_file.ini所示

            storm.local.dir: jstorm使用的本地临时目录,如果一台机器同时运行storm和jstorm的话, 则不要共用一个目录,必须将二者分             离开

        d) 在提交topology的节点上输入命令

            #mkdir ~/.jstorm

            #cp -f $JSTORM_HOME/conf/storm.yaml ~/.jstorm

        e) 先启动zk,在启动nimbus和supervisor,而且nimbus和supervisor最好不要在一个节点,我是1个nimbus和2个supervisor,一               个supervisor配置四个port

    4. JStorm需要tomcat来展现UI,所以需要安装tomcat

        a) 下载Tomcat8.0.9,解压至/xxx/xxx/Tomcat-8.0.9

        b) 运行命令:

             cd /xxx/xxx/Tomcat-8.0.9/webapps/

             cp $JSTORM_HOME/jstorm-ui-0.9.3.war ./

             mv ROOT ROOT.old

             ln -s jstorm-ui-0.9.3 ROOT

        c) 启动,/xxx/xxx/Tomcat-8.0.9/bin/startup.sh

二:写完TopK_on_JStorm的第一个版本(项目地址

    1. 建立jstorm-topk工程

    2. 整个项目提供一个简单的topk计算流程,由并发度为1的ScoreProduceSpout提供随机数数据(id,score),并发度为4的ComputeBolt提供topk计算,并发度为1的PrintAndStoreBolt的汇总打印。

    3. 建立TopKServerTopology

        TopologyBuilder builder = new TopologyBuilder();

        builder.setSpout("spout", new ScoreProduceSpout(), 1);

        builder.setBolt("compute", new ComputeBolt(), 4).shuffleGrouping("spout");

        builder.setBolt("print", new PrintAndStoreBolt(), 1).shuffleGrouping(
"compute");

    4. 建立ScoreProduceSpout,继承IRichSpout(细节在下一次周报讲述)

        _collector.emit(new Values(tupleId, id, score), tupleId); 

        其中tupleId是long类型从0递增,id是四位的[0-9a-zA-Z]组成字符,socre是1000000内随机数。而emit方法的tupleId参数代表要和Acker进行通信,达到记录级的不丢失。(Ack机制在其他博文讲述)

    5. 建立ComputeBolt,继承IRichBolt(细节在下一次周报讲述)

        把原数据集分割4份,并行处理,每个task都计算自己流上的topk,即使task宕机或者tuple fail,都重新进行积累计算。在excute()方法实现topK算法,比较复杂,可以看项目地址中的源代码。

        继承IRichBolt,可以自己控制数据是ack还是继续往下一个bolt发送(即由下一个bolt来控制ack)

    6. 建立PrintAndStoreBolt,继承IRichBolt(细节在下一次周报讲述)

        所有的结果在这里汇总,excute()仍然实现和ComputeBolt类似的算法,不同的是数据量较小(由ComputeBolt过滤了)和打印(为以后的持久化/输出)留下接口。

    7. 在JStorm集群上运行,jstorm jar topk.jar com.msopentech.jstorm.topk.topology.TopKServerTopology

        已经可以完成topk的基本需求。

下周计划

    1. 能在微软Azure上搭建集群并运行topk算法(暂时还没有获得账号,正在寻求导师帮助)。

    2. topK的算法可以继续进行提升。

    3. REST API输入的实现。


感谢CSDN开源夏令营和商之狄老师的指导与支持!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。