栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【定时将hbase的索引同步到solr的core,当同步失败时,回滚core】好记性不如烂笔头,我将工作中写的自动化脚本记录在此,供大家参考

【定时将hbase的索引同步到solr的core,当同步失败时,回滚core】好记性不如烂笔头,我将工作中写的自动化脚本记录在此,供大家参考

前言
  此脚本不包含core的创建,创建core请移步他处。
  本贴侧重core快照的创建,快照状态查询,core的删除,从快照恢复core。
  hbase到solr的同步不做为本贴的重点。

同步脚本syn_solr.sh内容:

#!/binbash

#定义core名称list
core_list=("core1-name_shard1_replica1" "core2-name_shard1_replica1")


#定义solr服务地址
solr_point="130.10.7.109:8983"
echo "【`date "+%Y-%m-%d %H:%M:%S"`】syn solr start"


#制作core快照
#
#/solr-backups目录是已经创建的hdfs存储目录
#目录创建命令是:
#   sudo -u hdfs hdfs dfs -mkdir /solr-backups
#   sudo -u hdfs hdfs dfs -chown sorl:solr /solr-backups
#   sudo -u hdfs hdfs dfs -chmod 777 /solr-backups
#

for core_name in "${core_list[@]}"
do
  curl http://${solr_point}/solr/${core_name}/replication?command=backup&repository=hdfs&location=/solr-backups/${core_name} > /dev/null 2>&1
done


#快照制作状态检查
#查询快照状态执行: curl http://${solr_point}/solr/${core_name}/replication?command=details
#每10秒查询一次,快照创建成功就结束查询,最大查询次数30次(我们的数据较大,创建快照
#要一两分钟,请根据你的实际情况修改查询等待时间和次数),如仍未完成就结束整个脚本。

num=0

for core in "${core_list[@]}"
do

  while [ true  ]
  do 
    sleep 10s 
    http_result_xml=$(curl http://${solr_point}/solr/${core}/replication?command=details)
    #echo "${http_result_xml}"
  
    detail_rightString=${http_result_xml#*}
    detail_delStatus=${detail_rightString%%<*}

    echo ${detail_delStatus}
    if [ "success" = "${detail_delStatus}" ]
    then
      echo "【`date "+%Y-%m-%d %H:%M:%S"`】快照 ${core} 制作完成。"
      break
    fi
   
    ((num+=1))
    if [ ${num} -eq 30 ]
      then
      echo "【`date "+%Y-%m-%d %H:%M:%S"`】快照 ${core} 制作失败"
      exit
    fi

  done
done

#删除core索引数据
#
echo "【`date "+%Y-%m-%d %H:%M:%S"`】开始删除cores"
#遍历coren,并删除core的数据
for core_name in "${core_list[@]}"
do
  #当删除请求的协议状态和删除结果状态都为0时,跳出删除循环。最多循环3次。
  num=0
  while [ ${num} -lt 3 ]
  do
    #发送删除请求,并将response赋值给resultString
    resultString=`curl -X post  http://${solr_point}/solr/${core_name}/update?wt=json 
                       -H Content-Type:text/xml --data '*:*'`
    #获取curl命令返回值
    curlStatus=$?
    #echo ${curlStatus}
    #截取response中json字符串的status值
    rightString=${resultString#*"status":}
    delStatus=${rightString%,"QTime":*}
    echo ${delStatus}
    #打印完整response的json
    echo ${resultString}
    if [[ ${curlStatus} == 0 && ${delStatus} == 0 ]]
    then
      echo "【`date "+%Y-%m-%d %H:%M:%S"`】${core_name}删除成功"
      break
    fi
    let num+=1
    
    if [ ${num} -eq 3  ]
    then
      echo "【`date "+%Y-%m-%d %H:%M:%S"`】删除cores失败。"
      exit
    fi

  done
done


#执行同步命令
#将hbase的数据同步到solr的core(hbase的数据每天都增量更新,所以solr的core每天也要更新)
#
indexs=("core1-name" "core2-name")
morphlines_path="/root/hbase-indexer" 
for index in "${indexs[@]}"
do
  echo "【`date "+%Y-%m-%d %H:%M:%S"`】开始同步【${index}】"
  `nohup hadoop --config /etc/hadoop/conf jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.16.1-job.jar 
          --conf /etc/hbase/conf/hbase-site.xml --hbase-indexer-file ${morphlines_path}/hbase-indexer/${index}/conf/morphline-hbase-mapper.xml 
          --morphline-file ${morphlines_path}/morphlines.conf --zk-host master:2181,slave1:2181,slave2:2181/solr 
          --collection ${index} --go-live --reducers 0 > /dev/null 2>&1 &`

done

#如果从hbase同步失败,从solr快照恢复core数据
#
 
num=0

while [ true ]
do
  #每分钟查询一次同步状态,如果同步完成就结束while循环。
  sleep 60s
  syn_result=`yarn application -list -appStates All | grep "HbaseMapReduceIndexerTool/HbaseIndexerMapper" | sort -n -k 1.27r | head -2 | grep SUCCEEDED | wc -l`
  echo "已同步 [${syn_result}]"

  if [ ${syn_result} == 2 ]
  then
    echo "同步成功。"
    break
  fi

  ((num+=1))
  #如果15分钟后仍没有同步成功,就从快照恢复solr的core
  #
  if [ ${num} -eq 15 ]
    then
    echo "同步失败,开始回滚..."

    for i in "${indexs[@]}"
    do
      curl http://${solr_point}/solr/${i}_shard1_replica1/replication?command=restore&location=/solr-backups/${i}_shard1_replica1&repository=hdfs
    done
    echo "回滚结束。"
    break
  fi

done

echo "【`date "+%Y-%m-%d %H:%M:%S"`】syn solr end"

定时任务:
每天8点50开始同步,并在/var/log/syn_solr.log中记录同步日志。

[root@slave2 ~]# crontab -l
50 8 * * * bash /root/syn_solr.sh >> /var/log/syn_solr.log 2>&1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/742610.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号