»
S
I
D
E
B
A
R
«
Storm配置项详解
一 4th, 2012 by admin

什么是Storm?

Storm是twitter开源的一套实时数据处理框架,基于该框架你可以通过简单的编程来实现对数据流的实时处理变换。

Storm的配置文件一般存放在$STORM_HOME/conf下,通常名为storm.yaml,它符合yaml格式要求。

配置项详解:

以下是从storm的config类中搜集的所有storm支持的配置项(Based storm 0.6.0):

配置项 配置说明
storm.zookeeper.servers ZooKeeper服务器列表
storm.zookeeper.port ZooKeeper连接端口
storm.local.dir storm使用的本地文件系统目录(必须存在并且storm进程可读写)
storm.cluster.mode Storm集群运行模式([distributed|local])
storm.local.mode.zmq Local模式下是否使用ZeroMQ作消息系统,如果设置为false则使用java消息系统。默认为false
storm.zookeeper.root ZooKeeper中Storm的根目录位置
storm.zookeeper.session.timeout 客户端连接ZooKeeper超时时间
storm.id 运行中拓扑的id,由storm name和一个唯一随机数组成。
nimbus.host nimbus服务器地址
nimbus.thrift.port nimbus的thrift监听端口
nimbus.childopts 通过storm-deploy项目部署时指定给nimbus进程的jvm选项
nimbus.task.timeout.secs 心跳超时时间,超时后nimbus会认为task死掉并重分配给另一个地址。
nimbus.monitor.freq.secs nimbus检查心跳和重分配任务的时间间隔.注意如果是机器宕掉nimbus会立即接管并处理。
nimbus.supervisor.timeout.secs supervisor的心跳超时时间,一旦超过nimbus会认为该supervisor已死并停止为它分发新任务.
nimbus.task.launch.secs task启动时的一个特殊超时设置.在启动后第一次心跳前会使用该值来临时替代nimbus.task.timeout.secs.
nimbus.reassign 当发现task失败时nimbus是否重新分配执行。默认为真,不建议修改。
nimbus.file.copy.expiration.secs nimbus判断上传/下载链接的超时时间,当空闲时间超过该设定时nimbus会认为链接死掉并主动断开
ui.port Storm UI的服务端口
drpc.servers DRPC服务器列表,以便DRPCSpout知道和谁通讯
drpc.port Storm DRPC的服务端口
supervisor.slots.ports supervisor上能够运行workers的端口列表.每个worker占用一个端口,且每个端口只运行一个worker.通过这项配置可以调整每台机器上运行的worker数.(调整slot数/每机)
supervisor.childopts 在storm-deploy项目中使用,用来配置supervisor守护进程的jvm选项
supervisor.worker.timeout.secs supervisor中的worker心跳超时时间,一旦超时supervisor会尝试重启worker进程.
supervisor.worker.start.timeout.secs supervisor初始启动时,worker的心跳超时时间,当超过该时间supervisor会尝试重启worker。因为JVM初始启动和配置会带来的额外消耗,从而使得第一次心跳会超过supervisor.worker.timeout.secs的设定
supervisor.enable supervisor是否应当运行分配给他的workers.默认为true,该选项用来进行Storm的单元测试,一般不应修改.
supervisor.heartbeat.frequency.secs supervisor心跳发送频率(多久发送一次)
supervisor.monitor.frequency.secs supervisor检查worker心跳的频率
worker.childopts supervisor启动worker时使用的jvm选项.所有的”%ID%”字串会被替换为对应worker的标识符
worker.heartbeat.frequency.secs worker的心跳发送时间间隔
task.heartbeat.frequency.secs task汇报状态心跳时间间隔
task.refresh.poll.secs task与其他tasks之间链接同步的频率.(如果task被重分配,其他tasks向它发送消息需要刷新连接).一般来讲,重分配发生时其他tasks会理解得到通知。该配置仅仅为了防止未通知的情况。
topology.debug 如果设置成true,Storm将记录发射的每条信息。
topology.optimize master是否在合适时机通过在单个线程内运行多个task以达到优化topologies的目的.
topology.workers 执行该topology集群中应当启动的进程数量.每个进程内部将以线程方式执行一定数目的tasks.topology的组件结合该参数和并行度提示来优化性能
topology.ackers topology中启动的acker任务数.Acker保存由spout发送的tuples的记录,并探测tuple何时被完全处理.当Acker探测到tuple被处理完毕时会向spout发送确认信息.通常应当根据topology的吞吐量来确定acker的数目,但一般不需要太多.当设置为0时,相当于禁用了消息可靠性,storm会在spout发送tuples后立即进行确认.
topology.message.timeout.secs topology中spout发送消息的最大处理超时时间.如果一条消息在该时间窗口内未被成功ack,Storm会告知spout这条消息失败。而部分spout实现了失败消息重播功能。
topology.kryo.register 注册到Kryo(Storm底层的序列化框架)的序列化方案列表.序列化方案可以是一个类名,或者是com.esotericsoftware.kryo.Serializer的实现.
topology.skip.missing.kryo.registrations Storm是否应该跳过它不能识别的kryo序列化方案.如果设置为否task可能会装载失败或者在运行时抛出错误.
topology.max.task.parallelism 在一个topology中能够允许的最大组件并行度.该项配置主要用在本地模式中测试线程数限制.
topology.max.spout.pending 一个spout task中处于pending状态的最大的tuples数量.该配置应用于单个task,而不是整个spouts或topology.
topology.state.synchronization.timeout.secs 组件同步状态源的最大超时时间(保留选项,暂未使用)
topology.stats.sample.rate 用来产生task统计信息的tuples抽样百分比
topology.fall.back.on.java.serialization topology中是否使用java的序列化方案
zmq.threads 每个worker进程内zeromq通讯用到的线程数
zmq.linger.millis 当连接关闭时,链接尝试重新发送消息到目标主机的持续时长.这是一个不常用的高级选项,基本上可以忽略.
java.library.path JVM启动(如Nimbus,Supervisor和workers)时的java.library.path设置.该选项告诉JVM在哪些路径下定位本地库.

如有不当之处,欢迎指出。

Ubuntu下使用ZTE ac2736无线上网
十一 7th, 2010 by admin

因为工作需要公司配了一款ZTE ac2736的无线上网卡,这样即使有事外出也可以及时处理问题,了解最新进展了。Window下的使用是相当的简单,ubuntu下还是需要稍作设置,这里就简单介绍一下ubuntu下的设置方式。

首先说明一下环境,Ubuntu 10.04,所有已装软件已升级到最新版本(请先安装usb-modeswitch和usb-modeswitch-data)。

步骤1:插上ZTE ac2736后使用lsusb命令查看状态

正常的话结果中应该有如下信息:

Bus 006 Device 007: ID 19d2:fff1 ONDA Communication S.p.A

其中0×19d2是vendor的代号,0xfff1是product的代号。

此外,此时/dev下应该也出现了ttyUSB[0-4]5个设备标示。

步骤2:设置连接拨号方式

查看右上角的NetworkManager,在移动宽带下会出现一个名为China telecom conn 1的连接项,这时候直接连接是不行的,需要先右键点击NetworkManager,点选编辑连接,找到移动宽带->China telecom conn 1,选择编辑->移动宽带选项卡,可以看到编号中已经是#777,用户名和密码填入card后保存。

如果未出现China telecom conn 1的选项,可以重新插拔ac2736,或者编辑NetworkManager,手动添加一个移动宽带的连接项,第一步设备选择ZTE Incorporated ZTE CMDA Tech,第二步选择China,第三步提供商选China Telecom,应用后可以看到弹出的页面中编号为#777,同样将用户名和密码设置为card保存后即可,其他选项用默认的即可。

步骤3:连接网络

选择NetworkManager中的China telecom conn 1,稍等片刻就可以看到连接成功的提示了,此时ifconfig查看网络连接可发现:

ppp0      Link encap:点对点协议

inet 地址:114.81.187.173  点对点:115.168.41.208  掩码:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1448  跃点数:1

接收数据包:7752 错误:0 丢弃:0 过载:0 帧数:0

发送数据包:7589 错误:0 丢弃:0 过载:0 载波:0

碰撞:0 发送队列长度:3

接收字节:7017443 (7.0 MB)  发送字节:904706 (904.7 KB)


ppp0      Link encap:点对点协议
inet 地址:114.81.187.173  点对点:115.168.41.208  掩码:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1448  跃点数:1
接收数据包:7752 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:7589 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:3
接收字节:7017443 (7.0 MB)  发送字节:904706 (904.7 KB)

实际测速大概在60~70KB/s,当然各地的网络情况可能各异。OK,现在可以惬意畅游网络了~~~

如何获取hive建表语句
十 9th, 2010 by admin

在使用hive进行开发时,我们往往需要获得一个已存在hive表的建表语句(DDL),然而hive本身并没有提供这样一个工具。

要想还原建表DDL就必须从元数据入手,我们知道,hive的元数据并不存放在hdfs上,而是存放在传统的RDBMS中,典型的如mysql,derby等,这里我们以mysql为例,hive版本0.4.2为例进行研究。

连接上mysql后可以看到hive元数据对应的表约有20个,其中和表结构信息有关的有9张,其余的10多张或为空,或只有简单的几条记录,以下是这些表的简要说明。

表名

说明

关联键

TBLS 所有hive表的基本信息 TBL_ID,SD_ID
TABLE_PARAM 表级属性,如是否外部表,表注释等 TBL_ID
COLUMNS Hive表字段信息(字段注释,字段名,字段类型,字段序号) SD_ID
SDS 所有hive表、表分区所对应的hdfs数据目录和数据格式 SD_ID,SERDE_ID
SERDE_PARAM 序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等 SERDE_ID
PARTITIONS Hive表分区信息 PART_ID,SD_ID,TBL_ID
PARTITION_KEYS Hive分区表分区键 TBL_ID
PARTITION_KEY_VALS Hive表分区名(键值) PART_ID

除了上面几张表外,还有两张表非常有趣:NUCLEUS_TABLES和SEQUENCE_TABLE

  • NUCLEUS_TABLES表中保存了元数据表和hive中class类的对应关系,如’org.apache.hadoop.hive.metastore.model.MTable’, ‘`TBLS`’,说明MTable类对应了元数据的TBLS表,不难想象当我们创建一张表时,hive一定会通过MTable的DAO模式向TBLS插入一条数据用来描述刚刚创建的hive表。NUCLEUS_TABLES表内现在共有17条这样的记录。
  • SEQUENCE_TABLE表保存了hive对象的下一个可用ID,如’org.apache.hadoop.hive.metastore.model.MTable’, 271786,则下一个新创建的hive表其TBL_ID就是271786,同时SEQUENCE_TABLE表中271786被更新为271791(这里每次都是+5而不是预料中的+1,有些奇怪)。同样,COLUMN,PARTITION等都有相应的记录。

从上面两张表的内容来看,hive表创建表的过程已经比较清楚了

  1. 解析用户提交hive语句,对其进行解析,分解为表、字段、分区等hive对象
  2. 根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新ID,与构建对象信息(名称,类型等)一同通过DAO方法写入到元数据表中去,成功后将SEQUENCE_TABLE中对应的最新ID+5。

实际上我们常见的RDBMS都是通过这种方法进行组织的,典型的如postgresql,其系统表中和hive元数据一样裸露了这些id信息(oid,cid等),而Oracle等商业化的系统则隐藏了这些具体的ID。

有了上面的信息,再想获得hive的建表语句已经是易如反掌了,这里提供一个已经开发好的脚本,使用shell开发,大家可以自由修改。注意:其中mysql连接信息请根据实际环境进行配置。

点击下载

使用方法如下:

  • hivesql sql
    — 获取指定hive表或指定文件中所有hive表的DDL,如果有按天的分区则默认执行最近7天的分区DDL。同时,table支持符合sql语法的正则表达式,如果有多个表匹配,则提示用户选择(使用file则自动关闭该交互功能)。
  • hivesql synctab
    — 基本同上,但是会将得到的DDL提交到当前的hive环境,可用来在不同的hive环境中复制表结构。

如果需要多天分区DDL还可以这样用(前提是分区中含有日期信息,如pt=20100720):

  • hivesql sql s_table 20100702 — 除建表语句外,获得自20100702以来的分区DDL
  • hivesql sql s_table 20100702 20100725 — ………………………..自20100702-20100725的分区DDL
  • hivesql sql s_table 20100702 10 — ………………………..自20100702起10天的分区DDL

hivesql synctab和hivesql sql一样支持上述日期限定功能。

此外,还提供了两个附加的功能(也很有用呃)

  • hivesql loc — 根据关键字查找能够匹配到的hive表或对应的数据路径
  • hivesql hdfswc — 获取指定数据目录下所有数据的总行数,支持普通文本,TextFile和SequenceFile的压缩格式,类似于linux下的wc -l
使用iptables进行端口重定向/转发
八 7th, 2010 by admin

iptables是一款非常优秀的防火墙工具,主要用于linux和unix下,其主页是 http://www.netfilter.org/

除了防火墙本身应有的功能之外,其还提供了非常强大的代理功能(譬如window下著名的CCProxy),深入研究后相信你可以随心所欲的构建出自己所需要的网络环境。

强大而灵活的工具总是伴随着复杂组合的选项,因此每每使用到该功能时都要花些时间重新熟悉,所以这里给出一些典型网络环境下iptables的配置方法,作为备忘,如果能够顺便帮到一两位同学,那也是好事一桩:)

注意:对于需要进行ip转发的场景,一定记得要先打开内核的ip转发功能。方法是:echo 1 > /proc/sys/net/ipv4/ip_forward (实时生效)

  • 单机端口重定向(端口映射或伪装)

场景: 如oralce服务一般监听在1521端口,但是SA只开放了服务器的8080端口,为了对外保持统一,我们可以把1521端口的访问请求重定向到8080端口上来。

在目标机上执行

命令:iptables -t nat -A PREROUTING -p tcp -m tcp –dport 1521 -j REDIRECT –to-ports 8080

  • 单ip代理机(需要开启ip转发功能)

场景:需要访问运行在10.1.1.4的50000端口上的应用,但是直连是不通的,本地可以连接172.1.1.2的8080端口,且172.1.1.2可以访问10.1.1.4的50000端口,则可以通过172.1.1.2提供服务代理。

在172.1.1.2上执行

命令:iptables -A PREROUTING -p tcp -m tcp –dport 8080 -j DNAT –to-destination 10.1.1.4:50000

iptables -A POSTROUTING -d 10.1.1.4 -p tcp -m tcp –dport 50000 -j SNAT –to-source 172.1.1.2

客户端应用连接172.1.1.2:8080时实际上访问的是10.1.1.4:50000上的服务。

  • 仅允许指定客户端访问服务器的特定端口

场景:希望开放172.1.1.2上8000端口的应用给指定客户端172.2.2.2使用,且不允许其访问其他端口。

在172.1.1.2上执行

命令: iptables -A OUTPUT -d 172.2.2.2 -p tcp -m tcp ! –sport 8000 -j REJECT –reject-with icmp-port-unreachable

则172.2.2.2仅能访问172.1.1.2的8000端口。

-A POSTROUTING -d 10.249.61.101 -p tcp -m tcp –dport 80 -j SNAT –to-source 172.23.113.21
COMMIT
为GreenPlum添加Contrib模块
八 6th, 2010 by admin

postgresql里面contrib提供了不少有用的工具,包括移植工具、分析工具和部分插件。而GreenPlum基于postgresql数据库,可以十分方便的使用这些工具,下面提供GreenPlum下安装contrib模块的方法。

这里有关于contrib各模块详细的说明:

http://www.postgresql.org/docs/8.3/static/contrib.html

个人觉得比较常用的有以下几个模块:

dblink: 类似与oracle中的dblink,但是功能要弱上一些,并且只能连接Postgresql或基于postgresql的数据库

oid2name: 获取数据库对象的oid或者根据oid得到数据库对象信息,是一个独立的可执行命令

pg_buffercache: 实时查询shared_buffer的缓存信息

pg_freespacemap: 显示FSM内容

pgrowlocks: 显示行锁信息

pgstattuple: 统计指定表中的”死行”和空闲空间

spi: 提供了几个使用 SPI 的可运转的例子和触发器,用好spi接口可以方便的对数据库功能进行扩展。

Read the rest of this entry »

GreenPlum DBA常用SQL
八 6th, 2010 by admin
  • 查看对象大小(表、索引、数据库等)

select pg_size_pretty(pg_relation_size(’$schema.$table’));

  • 查看用户(非系统)表和索引

select * from pg_stat_user_tables;

seect * from pg_stat_user_indexes;

  • 查看表分区

select b.nspname||’.'||a.relname as tablename, d.parname as partname
from pg_class a, pg_namespace b, pg_partition c, pg_partition_rule d
where a.relnamespace = b.oid
and b.nspname = ‘$schema’
and a.relname = ‘$table’
and a.oid = c.parrelid
and c.oid = d.paroid
order by parname;

  • 查看Distributed key

select  b.attname
from pg_class a, pg_attribute b, pg_type c, gp_distribution_policy  d, pg_namespace e
where d.localoid = a.oid
and a.relnamespace = e.oid
and e.nspname = ‘$schema’
and a.relname=’$table’
and a.oid = b.attrelid
and b.atttypid = c.oid
and b.attnum > 0
and b.attnum = any(d.attrnums)
order by attnum;

  • 查看当前存活的查询

select procpid as pid, sess_id as session, usename as user, current_query as query, waiting,
date_trunc(’second’, query_start) as start_time, client_addr as useraddr
from pg_stat_activity
where datname =’$PGDATABASE’
and current_query not like ‘%from pg_stat_activity%where datname =%’
order by start_time;

  • 表上被用作外键的字段名

select f.conname, pg_get_constraintdef(f.oid), t2.relname
from pg_class t, pg_class t2, pg_constraint f
where f.confrelid = t.oid
and f.conrelid = t2.oid
and f.contype = ‘f’
and t.relname = ‘$table’;

GreenPlum资源汇总
八 6th, 2010 by admin

GreenPlum是在Postgresql数据库基础上引入了MPP(massively parallel processing)架构的新型数据仓库专用数据库,在大数据量处理上比传统数据库有诸多优势,由于其在国内刚刚起步,因此资源和文档都比较缺乏。

这里罗列一些常用的学习资料和资源,方便大家学习

  • 文档:

GreenPlum官方站点:

http://www.greenplum.com

其中的白皮书是对GreenPlum概貌的了解,而管理手册则是每个管理员必读的”圣经”

GreenPlum实战系列:

http://rdc.taobao.com/blog/dw/archives/category/greenplum

Postgresql文档:

http://www.postgresql.org/docs/

e文吃力的同学可以看这里:

http://docs.unixmap.net/app/postgresql/

阎华的PostgreSQL文档:

http://docs.unixmap.net/database/db_html_doc/

PGCon:PostgreSQL Conference 有很多实战及理论知识

http://www.pgcon.org/2009/

  • 资源:

客户端工具:

pgadmin III:

http://www.pgadmin.org/download/

Tora:

http://torasql.com/

xfs安装文件(redhat as5.4版本以前默认不带xfs文件系统支持,可以使用对应centos版本的文件进行安装):

http://mirror.centos.org/centos/5/centosplus/x86_64/RPMS/

需要安装的文件有kernel-module-xfs, kmod-xfs, xfsdump, xfsprogs

»  Substance: WordPress   »  Style: Ahren Ahimsa