批量查询hive数据通过管道方式快速写入到Redis集群,脚本编写

脚本记录如下:

#!/bin/bash
/usr/local/redis/bin/redis-cli -h 172.28.xx.yy -a pwdpwdpwd cluster nodes | grep master
sed -i 's/@/:/g' ./info.txt
sed -i 's/-/:/g' ./info.txt
info=`cat info.txt | awk '{print $2":"$9}' | awk -F ':' '{print $1" "$2" "$4" "$5}'`
array=(${info// / })
len=${#array}
cnt=`expr $len / 4`
echo $cnt
for((i=0;i<$cnt;i++));
 do
  a=`expr $i \* 4`
  b=`expr $a + 1`
  c=`expr $a + 2`
  d=`expr $a + 3`
  ip=${array[$a]}
  port=${array[$b]}
  slot1=${array[$c]}
  slot2=${array[$d]}
  #crc_slot=6174
  crc_slot=`hive -e "select crc16('flag:hot:list');" | grep -v WARN`
  echo $crc_slot
  if ((crc_slot>=$slot1)) && ((crc_slot<=$slot1));
  then
  hive -e "select concat('*3\n','$','3\n','set\n','$',length(key),'\n',key,'\n','$',length(value),'\n',value) from (select concat('flag:hot:list') as key, concat('\"',concat_ws(',', collect_set(prod_id),'\"')) as value from (select * from recomdb.t_tbl_prodhot_score where dayid = '20200528' order by hot_score desc limit 300)t1)t " | grep -v "^WARN" > $slot1"_"$slot2".data"
  unix2dos $slot1"_"$slot2".data"
  cat $slot1"_"$slot2".data" | /usr/local/redis/bin/redis-cli -h $ip -p $port -a pwdpwdpwd --pipe
 fi
 done

注:通过 --pipe 来启动集群模式,会提示 MOVEN ***172.28.**** 错误,通常有两种解决方案。

一:粗暴型。在集群模式下使用 --pipe 时, 如果 key值的redis槽点在此节点上就写入成功,不在此节点就没有写入成功。那么,可以把每个节点都跑一次 --pipe,这样每个节点就会写入自己的数据。

二:细致型。通过key的哈希值区分槽点,通过节点拿到槽点,然后分批数据导入到相应节点。

如上脚本就是使用的是第二种方案。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值