在archlinux上搭建twitter storm cluster

有关archlinux基本系统安装,请参照archlinux简明安装指南一文,下面以上述为基础讲解如何一步步安装twitter storm cluster.

先列出安装主要步骤

  1. 安装oracle jdk
  2. 安装必须的编译工具gcc, g++, make
  3. 安装python2.7, unzip
  4. 编译安装zeromq
  5. 编译安装jzmq
  6. 下载lein
  7. 下载storm-starter
  8. 下载storm release版本安装zookeeper为了自动运行storm cluster,安装supervisord

安装oracle jdk

在linux平台上标配的java是openjdk,如果要安装oracle的jdk的话,需要从官方下载相应的安装包。使用archlinux幸福的一点就是有yaourt,一切可以变得非常简单,:).

#yaourt -S jdk

注意安装完的java路径,应该是在/opt/java, 这个后面会用到。

修改/etc/profile, 添加环境变量JAVA_HOME,为PATH添加/opt/java/bin

PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/java/bin"
export PATH
export JAVA_HOME="/opt/java"

安装编译工具

在twitter storm中会使用zeromq,因为zeromq是用c&c++编写的,所以需要安装相应的编译工具,不要使用archlinux中的版本,因为目前pacman或aur中的zeromq版本是3.x,而twitter storm中需要的zeromq是2.1.7

#pacman -S gcc g++ libtool pkg-config make autoconf git util-linux

安装python2.7, unzip

#pacman -S python2 unzip 

编译安装zeromq,jzmq

从 http://download.zeromq.org/zeromq-2.1.7.tar.gz下载zeromq 2.1.7

#tar zvxf zeromq-2.1.7.tar.gz
#config
#make
#make install

安装的路径是/usr/local/lib

编译安装jzmq

#git clone https://github.com/nathanmarz/jzmq.git
#cd jzmq
#./autogen.sh
#./configure --with-zeromq=/usr/local
#make 注意,此处可能会出错,解决办法是修改jzmq/src/Makefile.am,将classdist_noinst.stamp修改为classnoinst.stamp
#make install

安装完zeromq和jzmq之后,修改/etc/ld.so.conf,在该文件中添加如下一行

/usr/local/lib

然后运行

#ldconfig 

为了验证libjzmq确实使用的zeromq是自行编译的版本,可使用如下命令进行检测。

#ldd /usr/local/lib/libjzmq.so
linux-gate.so.1 (0xb779e000)
    libzmq.so.1 => /usr/local/lib/libzmq.so.1 (0xb7749000)
    libuuid.so.1 => /usr/lib/libuuid.so.1 (0xb7743000)
    librt.so.1 => /usr/lib/librt.so.1 (0xb773a000)
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0xb771e000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7635000)
    libm.so.6 => /usr/lib/libm.so.6 (0xb75ee000)
    libc.so.6 => /usr/lib/libc.so.6 (0xb743e000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb7422000)
    /usr/lib/ld-linux.so.2 (0xb779f000)

如果libzmq.so.1确实指向/usr/local/lib中的版本,则说明版本使用正确。

安装storm-starter

storm-starter是由storm的作者为了storm的初学者快速上手而创建的一个github项目。

#git clone https://github.com/nathanmarz/storm-starter.git

编译运行, 注意这是运行在local模式而非常cluster模式

#lein deps
#lein compile
#java -cp $(lein classpath) storm.starter.ExclamationTopology

注:

    直接从http://leiningen.org/下载lein script,而非直接使用pacman或yaourt来安装 

#chmod +x ./lein
#cp ./lein /usr/local/bin
#export LEIN_ROOT=1 如果想以root来运行lein,需要设置该变量  

安装zookeeper

#yaourt -S zookeeper

作简单的配置,修改文件/etc/zookeeper/zoo.cfg,使其内容如下所示

#The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/var/lib/zookeeper
# the port at which the clients will connect
clientPort=2181

因为zookeeper只对IPv6地址进行监听,为了强制其只监听IPv4地址,需要修改/opt/zookeeper-3.4.5/bin/zkServer.sh,在start)一节中加入 "-Djava.net.preferIPv4Stack=true", 整体看起来如下所示

case $1 in
start)
    echo  -n "Starting zookeeper ... "
    if [ -f $ZOOPIDFILE ]; then
      if kill -0 `cat $ZOOPIDFILE` > /dev/null 2>&1; then
         echo $command already running as process `cat $ZOOPIDFILE`.
         exit 0
      fi
    fi
    nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
      "-Djava.net.preferIPv4Stack=true" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
    if [ $? -eq 0 ]
    then
      if /bin/echo -n $! > "$ZOOPIDFILE"
      then
        sleep 1
        echo STARTED
      else
        echo FAILED TO WRITE PID
        exit 1
      fi
    else
      echo SERVER DID NOT START
      exit 1
    fi
    ;;  

注意蓝底红字的一行。

启动zookeeper

#/opt/zookeeper-3.4.5/bin/zkServer.sh start 

 下载安装storm

从storm-project.net下载storm-0.8.2,将其解压到/opt目录下

#unzip storm-0.8.2.zip

修改/opt/storm-0.8.2/conf/storm.yaml, 文件内容如下

########### These MUST be filled in for a storm configuration
 storm.zookeeper.servers:
     - "localhost"
#     - "server2"
#
 nimbus.host: "localhost"
#
#
# ##### These may optionally be filled in:
#
## List of custom serializations
# topology.kryo.register:
#     - org.mycompany.MyType
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer
#
## List of custom kryo decorators
# topology.kryo.decorators:
#     - org.mycompany.MyDecorator
#
## Locations of the drpc servers
# drpc.servers:
#     - "server1"
#     - "server2"

## Metrics Consumers
# topology.metrics.consumer.register:
#   - class: "backtype.storm.metrics.LoggingMetricsConsumer"
#     parallelism.hint: 1
#   - class: "org.mycompany.MyMetricsConsumer"
#     parallelism.hint: 1
#     argument:
#       - endpoint: "metrics-collector.mycompany.org"
 java.library.path: "/usr/local/lib:/usr/local/share/java"
 supervisor.slots.ports:
   - 6700
   - 6701

注意:

  yaml要求配置项必须以空格打头

修改storm脚本,将#!/usr/bin/python改为#!/usr/bin/python2, /usr/bin/python是指向python3的所以需要显示将其改为python2

准备运行cluster模式了

#/opt/storm-0.8.2/bin/storm nimbus
#/opt/storm-0.8.2/bin/storm supervisor
#/opt/storm-0.8.2/bin/storm ui

上述每条指令需要单独运行在一个终端,如果ui启动成功,可以使用浏览器来访问localhost:8080查看整个cluster的状况了。

部署Topology到cluster

#./storm jar $HOME/working/storm-starter/target/storm-starter-0.0.1-SNAPSHOT-standalone.jar storm.starter.ExclamationTopology exclamationTopology

一切顺利的话,应该可以看到类似的输出

0    [main] INFO  backtype.storm.StormSubmitter  - Jar not uploaded to master yet. Submitting jar...
91   [main] INFO  backtype.storm.StormSubmitter  - Uploading topology jar /root/working/storm-starter/target/storm-starter-0.0.1-SNAPSHOT-standalone.jar to assigned location: storm-local/nimbus/inbox/stormjar-c73d28f0-68fc-4e6e-98b5-c4d1355aa94f.jar
667  [main] INFO  backtype.storm.StormSubmitter  - Successfully uploaded topology jar to assigned location: storm-local/nimbus/inbox/stormjar-c73d28f0-68fc-4e6e-98b5-c4d1355aa94f.jar
670  [main] INFO  backtype.storm.StormSubmitter  - Submitting topology exclamationTopology in distributed mode with conf {"topology.workers":3,"topology.debug":true}
2449 [main] INFO  backtype.storm.StormSubmitter  - Finished submitting topology: exclamationTopology

自动化运行storm cluster

每次都要手工启动storm cluster并不是一件很令人愉快的事,最好是能自动启动。解决办法总是有的,使用python supervisor即可。

#pacman -S supervisor
#mkdir -p /var/log/storm

修改supervisor配置文件,在文件最后添加如下内容

[program:storm-nimbus]
environment=JAVA_HOME=/opt/java, PATH="/usr/sbin:/usr/bin:/usr/local/bin:/opt/java/bin"
command=/opt/storm-0.8.2/bin/storm nimbus
;;user=storm
autostart=true
autorestart=true
startsecs=10
startretries=999
log_stdout=true
log_stderr=true
logfile=/var/log/storm/nimbus.out
logfile_maxbytes=20MB
logfile_backups=10

[program:storm-supervisor]
environment=JAVA_HOME=/opt/java, PATH="/usr/sbin:/usr/bin:/usr/local/bin:/opt/java/bin"
command=/opt/storm-0.8.2/bin/storm supervisor
;;user=storm
autostart=true
autorestart=true
startsecs=10
startretries=999
log_stdout=true
log_stderr=true
logfile=/var/log/storm/supervisor.out
logfile_maxbytes=20MB
logfile_backups=10

注:

    在上述配置中显示加入了environment一行,主要是为了解决可执行文件搜索路径的问题,否则会报错说无法找到java可执行程序因其不在标准路径/usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin中。

启动supervisord

#systemctl start supervisord

想开机自动运行supervisord的话,执行如下指令

#systemctl enable supervisord

 参考资料

  1. Running a Multi-Node Storm Cluster http://www.michael-noll.com/tutorials/running-multi-node-storm-cluster/
时间: 2024-12-03 21:18:53

在archlinux上搭建twitter storm cluster的相关文章

Kafka实战-Storm Cluster

1.概述 在<Kafka实战-实时日志统计流程>一文中,谈到了Storm的相关问题,在完成实时日志统计时,我们需要用到Storm去消费Kafka Cluster中的数据,所以,这里我单独给大家分享一篇Storm Cluster的搭建部署.以下是今天的分享目录: Storm简述 基础软件 安装部署 效果预览 下面开始今天的内容分享. 2.Storm简述 Twitter将Storm开源了,这是一个分布式的.容错的实时计算系统,已被贡献到Apache基金会,下载地址如下所示: http://stor

Twitter Storm - DRPC

DRPC ,Distributed Remote Procedure Call  RPC本身是个成熟和古老的概念, Storm里面引入DRPC主要是利用storm的实时计算能力来并行化CPU intensive的计算 DRPC, 只是storm应用的一个场景, 并且storm提供相应的编程框架, 以方便程序员 提供DRPC server的实现, 并提供对DRPC场景经行封装的Topology   对于storm, Topology内部其实是没有任何区别的, 主要就是实现和封装Topology和D

twitter storm源码走读(一)

nimbus启动场景分析 本文详细介绍了twitter storm中的nimbus节点的启动场景,分析nimbus是如何一步步实现定义于storm.thrift中的service,以及如何利用curator来和zookeeper server建立通讯. 对于storm client来说,nimbus是storm cluster与外部的唯一接口,是总的接口人,在这个接口上使用thrift定义的各种service.但是nimbus光接单并不干活,具体的脏活累活,这哥们都是分配到各个slots上的,让

如何使用Twitter Storm处理实时的大数据

Hadoop(大数据分析领域无可争辩的王者)专注于批处理.这种模型对许多情形(比如为网页建立索引)已经足够,但 还存在其他一些使用模型,它们需要来自高度动态的来源的实时信息.为了解决这个问题,就得借助 Nathan Marz 推出的 Storm(现在在 Twitter 中称为 BackType).Storm 不处理静态数据,但它处理预计会连续的流数据.考虑到 Twitter 用 户每天生成 1.4 亿条推文 (tweet),那么就很容易看到此技术的巨大用途. 但 Storm 不只是一个传统的大数

CentOS 7上搭建安全、容灾、高可用的etcd集群

本文讲的是CentOS 7上搭建安全.容灾.高可用的etcd集群[编者的话]etcd 是 CoreOS 团队发起的开源项目,基于 Go 语言实现,做为一个分布式键值对存储,通过分布式锁,leader选举和写屏障(write barriers)来实现可靠的分布式协作. 本文目标是部署一个基于TLS(Self-signed certificates)的安全.快速灾难恢复(Disaster Recovery, SNAPSHOT)的高可用(High Availability)的etcd集群. 准备工作

在Docker Swarm上部署Apache Storm:第2部分

[编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 点此查看<在Docker Swarm上部署Apache Storm:第1部分> 创建Swarm集群 如果一切顺利,那么你现在已经有了三台Ubuntu服务器,每个上面都运行了一个Docker守护进程.可以通过私有网络中的zk1.cloud和manager.swarm访问Ubuntu 1,或者

twitter storm源码走读(四)

Trident Topology执行过程分析 TridentTopology是storm提供的高层使用接口,常见的一些SQL中的操作在tridenttopology提供的api中都有类似的影射.关于TridentTopology的使用及运行原理,当前进行详细分析的文章不多. 从TridentTopology到vanilla topology(普通的topology)由三个层次组成: 面向最终用户的概念stream, operation 利用planner将tridenttopology转换成va

twitter storm源码走读(二)

topology提交过程分析 概要 storm cluster可以想像成为一个工厂,nimbus主要负责从外部接收订单和任务分配.除了从外部接单,nimbus还要将这些外部订单转换成为内部工作分配,这个时候nimbus充当了调度室的角色.supervisor作为中层干部,职责就是生产车间的主任,他的日常工作就是时刻等待着调度到给他下达新的工作.作为车间主任,supervisor领到的活是不用自己亲力亲为去作的,他手下有着一班的普通工人.supervisor对这些工人只会喊两句话,开工,收工.注意

树莓派上搭建 Hadoop 集群环境的方法

最近在学习 Hadoop,正好前几天又在玩儿树莓派,查阅了一些文档,感觉在树莓派上搭建 Hadoop 集群是可行的,当然了,别对性能抱太大的希望,主要是感受一下分布式计算的魅力.在这个过程中参考了很多文档,先列在这里,基本上这些文档都非常详细了,大家可以直接参考. How to build 7 node Raspberry Pi Hadoop cluster Hadoop集群安装配置教程 Hadoop2.6.0 Ubuntu/CentOS 实验软硬件清单 以下是我的实验环境所用的硬件和软件版本清