为什么不用hadoop
我们目前的数据大多是时间序列并且有状态的数据,数据体积也在10个g以上,由于时间序列的关系,必须将某一类的数据按照时间顺序严格的绑定在一个map上。并且我们想我们的消费程序完全不需要改造来支持hadoop的map reduce模式。
要求:
- 消费者对上游无感。
- 支持水平扩展。
- 系统本身耗能(cpu,memory)低。
实现:
- redis用来做任务中心。(rpop弹出任务)
- linux fifo来控制单机最大并发数
- 下游程序以stdin管道的模式注入数据
- 消费者生成的数据落文件,采用ssh远程执行命令加cat的方式进行汇总。
#!/bin/sh
tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm -f $tmp_fifofile
key=$1
thread=$2
for ((i=0;i<$thread;i++));
do
echo >&6
done
while true;do
cmd=$(redis-cli -h xxxxx --raw rpop $key)
if [ -n "$cmd" ];then
read -u6
{
echo $cmd
echo $cmd | sh
echo >&6
} &
else
break
fi
done
wait
exec 6>&-