為什么不用hadoop
我們目前的數(shù)據(jù)大多是時(shí)間序列并且有狀態(tài)的數(shù)據(jù),數(shù)據(jù)體積也在10個(gè)g以上芦昔,由于時(shí)間序列的關(guān)系栽惶,必須將某一類的數(shù)據(jù)按照時(shí)間順序嚴(yán)格的綁定在一個(gè)map上。并且我們想我們的消費(fèi)程序完全不需要改造來支持hadoop的map reduce模式芍殖。
要求:
- 消費(fèi)者對(duì)上游無感豪嗽。
- 支持水平擴(kuò)展。
- 系統(tǒng)本身耗能(cpu,memory)低龟梦。
實(shí)現(xiàn):
redis用來做任務(wù)中心隐锭。(rpop彈出任務(wù))
linux fifo來控制單機(jī)最大并發(fā)數(shù)
下游程序以stdin管道的模式注入數(shù)據(jù)
消費(fèi)者生成的數(shù)據(jù)落文件,采用ssh遠(yuǎn)程執(zhí)行命令加cat的方式進(jìn)行匯總计贰。
#!/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>&-