通过脚本中启动presto的方式备份hive表

本文介绍如何使用shell脚本通过Presto进行表备份,包括创建备份表、检查数据条数对比,以及后续的删除操作。脚本实现了根据配置文件批量备份,并将关键信息记录在日志中便于查看和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

presto备份表第一次做的时候需要手工执行多次

create table if not exists origin_tableName_bak as
select * 
from origin_tableName;

后来就想着能不能使用shell脚本的方式只要传入需要备份的表就可以自动备份,并打印我们关注的信息:
备份是否成功以及备份前后的数据条数

for par in $@;do
 echo "正在备份原表 :${par}  ..." | tee -a 日志文件路径
#./presto.jar --server szzb-bg-prd-etl-13:9000 --catalog hive --schema default --user admin -f /home/admin/zhangminghu/backup_table.sql ${par}
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${par}_bak as select * from ${par}"
echo "-------------------------备份表${par} 创建成功------------------"  | tee -a 日志文件路径
echo "源表${par}数据总条数:" | tee -a 日志文件路径
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${par} "
echo "备份表'${par}_bak'数据总条数: "   | tee -a 日志文件路径
./presto.jar --server hostName或ip:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${par}_bak"  | tee -a 日志文件路径
done

后来我又想如果备份多个表,我想看这个备份的信息,如果表太多打印的日志太多,看不过来,于是想着把执行过程的日志在打印在控制台的同时写入log日志文件中

#日志打印的同时以追加的方式写入文件中
echo "this is a test" | tee -a 文件路径

改完之后,脚本是如下的样子

for par in $@;do
 echo "正在备份原表 : ${par} ..." | tee -a /backup_table_info.log
./presto.jar --server host或ip:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${par}_bak as select * from ${par}" | tee -a /backup_table_info.log
echo "-------------------------备份表${par} 创建成功------------------" | tee -a /home/admin/zhangminghu/backup_table_info.log
echo "源表${par}数据总条数:"  | tee -a /backup_table_info.log
./presto.jar --server  host或ip:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${par} " | tee -a /backup_table_info.log
echo "备份表'${par}_bak'数据总条数: "  | tee -a /backup_table_info.log
./presto.jar --server  host或ip:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${par}_bak" | tee -a /backup_table_info.log
done

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

进一步优化:我想将备份的原表的名字写在一个文件中,执行脚本的时候读取具有这个配置信息的文本,然后将数据存入一个数组中,然后传到执行脚本中批量备份,这样就不用手动传值了,下面是代码

#这个文件配置需要备份的表的库名.表名
====>need_backup_table_name.txt
ods.xxx1  ods.xxx2
ods.xxx3
ods.xxx4

====>backup_table.sh
#!/bin/bash
num=0
for line in  $(</home/admin/xxx/need_backup_table_name.txt);do
  arr[num]=${line}
  echo "当前数组存储的表名为: ${arr[${num}]}"
  num=${num}+1
done

for origin_table_name in ${arr[*]};do
 echo "正在备份原表 : ${origin_table_name} ..." | tee -a /home/admin/xxx/backup_table_info.log
 #echo "正在备份表 : ${origin_table_name}_bak ..."
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute "create table if not exists ${origin_table_name}_bak as select * from ${origin_table_name}" | tee -a /home/admin/xxx/backup_table_info.log
echo "-------------------------备份表${origin_table_name} 创建成功------------------" | tee -a /home/admin/xxx/backup_table_info.log
echo "源表${origin_table_name}数据总条数:"  | tee -a /home/admin/xxx/backup_table_info.log
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute " select count(1)  from ${origin_table_name} " | tee -a /home/admin/xxx/backup_table_info.log
echo "备份表'${origin_table_name}_bak'数据总条数: "  | tee -a /home/admin/xxx/backup_table_info.log
./presto.jar --server ip或主机名:9000 --catalog hive --schema default --user admin --execute "select count(1) from ${origin_table_name}_bak" | tee -a /home/admin/xxx/backup_table_info.log
done

写到这里,因为表备份完之后,如果确认跑数覆盖之后的表和原来备份的表数据量没有太大差异,就视为没有问题,需要把原来备份的表删除,所以我又写了一个批量删除备份表的脚本

#!/bin/bash
num=0
for line in  $(</home/admin/xxx/need_backup_table_name.txt);do
  arr[num]=${line}
  echo "当前数组存储的表名为: ${arr[${num}]}"
  num=${num}+1
done

for origin_table_name in ${arr[*]};do
 echo "正在删除的表 : ${origin_table_name}_bak ..." 
./presto.jar --server ip或主机名你:9000 --catalog hive --schema default --user admin --execute "drop table if exists  ${origin_table_name}_bak"
done
echo "备份的表删除完毕 !"
版本:presto-server-0.214.tar软件版本 presto-cli-0.214-executableCentOS71、presto的起因 hadoop ---hdfs----MR(java)-----hivehive底层原理用MR,速度比较慢,公司hadoop集群主要集中于晚上到凌晨,平日工作时间负载不是很高。但在工作时间内,公司业务人员有实时查询的需求,现在主要借助于hive提供业务人员的查询。hive是基于MR类的SQL查询工具,他会输入的查询SQL解析为MapReduce,能极大的降低使用大数据门槛,让一般的业务人员可以直接准对大数据进行查询,但是有一个利弊,它的查询基于MR,会让人等待比较着急,等待的时间可能是几个小时或者一天。 spark基于内存提高改良的hive,sql,现在factbook在hive上面开发一套利器,准对hive可以通过sql语句快速查询,presto。2、Facebook为何开发Presto  Facebook的2011的数据仓库存储在少量大型hadoopfs集群,Hive是FaceBook在几年前专门为Hadoop打造的一款数据仓库工具,在以前,facebook的科学家和分析师一直靠hive进行数据分析.但hive使用MR作为底层计算框架,是专为批处理设计的,但是随着数据的不断增多,使用hive进行一个简单的数据查询可能要花费分钟或者几个小时,显然不能满足查询需求,FaceBooke也调研了其他比hive更快的工具,但是他们需要在功能有限的条件下做简单操作,以至于无法操作Facebook庞大的数据要求。2012年开始研究自己的框架--presto,每日可以超过1pb查询,而且速度比较快,faceBook声称Presto的性能比hive要好上10倍或者100倍,prestohive都是facebook开发的 Presto是一个开源的分布式SQL查询引擎,适用于交互式查询,数据量支持GB到PB字节。Presto的设计和编写完全是为了解决Facebook这样规模的商业数据仓库交互式分析和处理速度的问题Presto可以做什么 Presto支持在线数据查询,包括Hive kafka Cassandra关系数据库以及专门数据存储,一条Presto查询可以将多个数据源进行合并,可以跨越整个组织进行分析。Presto以分析师的需求作为目标,他们期望相应速度小于1秒到几分钟,Presto要么在使用速度的快的昂贵的商业方案,提高内存,要么是消耗大量的硬件进行快速查询。(128G 64G)本套课程教给如何在企业环境中使用Presto技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值