Hive集群之间迁移的Linux Shell脚本

新旧 Hive 集群之前数据迁移单表脚本

migrate_hive_single_table.sh

bash 复制代码
#!/bin/bash

#配置参数
OLD_NAMENODE="hdfs://<old-namenode>:<old-port>" 
EXPORT_PATH="/tmp/hive-export/dm"
NEW_DB="dm_events"
TABLE_NAME="dm_usereventfinal"
SIZE_THRESHOLD=$((32 * 1024*1024)) # 32MB大小阈值

# 检查命令执行结果的函数
check_command(){
  if [ $? -ne 0 ]; then
    echo "Error: $1 失败,退出脚本。"
    exit 1
  fi
}

# 1.导出旧集群的数据 
echo "正在导出数据..."
hive -e "EXPORT TABLE ${NEW_DB}.${TABLE_NAME} TO '${EXPORT_PATH}';"
check_command "数据导出"

# 2.检查导出文件的大小 
echo "检查文件大小..."
HDFS_SIZE=$(hadoop fs -du -s ${EXPORT_PATH} | awk '{print $1}') 
check_command "获取文件大小"
echo "导出文件大小为:$HDFS_SIZE 字节"

# 3.根据文件大小选择迁移方法
if ["$HDFS_SIZE" -le "$SIZE_THRESHOLD" ]; then
  echo "文件小于 32MB,使用简单复制方法..."
  hadoop fs -cp ${OLD_NAMENODE}${EXPORT_PATH} ${EXPORT_PATH}   
  check_command "简单复制"
else
  echo "文件大于 32MB,使用 DistCp 工具迁移..."
  hadoop distcp -update -skipcrccheck
${OLD_NAMENODE}${EXPORT_PATH} ${EXPORT_PATH}
  check_command "数据迁移"
fi

# 4.在新集群中创建数据库(如果不存在)
echo "正在创建数据库(如果不存在)..."
hive -e "CREATE DATABASE IF NOT EXISTS ${NEW_DB};" 
check_command "创建数据库"

# 5.在新集群中导入数据

echo "正在导入数据到新集群..."
hive -e "IMPORT TABLE ${NEW_DB}.${TABLE_NAME} FROM'${EXPORT_PATH}';"
check_command "数据导入"

echo "数据迁移完成!"

新旧 Hive 集群之前数据迁移所有表、视图、UDF函数的脚本

migrate_hive_all.sh

bash 复制代码
#!/bin/bash

# 配置参数
OLD_NAMENODE="hdfs://<old-namenode>:<old-port>"
EXPORT_BASE_PATH="/tmp/hive-export"
NEW_DB="your_database_name"
SIZE_THRESHOLD=$((32*1024*1024)) # 32MB大小阈值

# 检查命令执行结果的函数
check_command() {
  if [ $? -ne 0 ]; then
    echo "Error: $1 失败,退出脚本。"
    exit 1
  fi
}

# 导出元数据信息
echo "导出表和视图信息..."
hive -e "SHOW TABLES IN ${NEW_DB};" > tables.txt 
hive -e "SHOW VIEWS IN ${NEW_DB};"> views.txt

# 迁移每个表
echo"迁移表数据..."
while read TABLE; do
  EXPORT_PATH="${EXPORT_BASE_PATH}/${TABLE}"

  echo"处理表:$TABLE"
  hive -e "EXPORT TABLE ${NEW_DB}.${TABLE} TO '${EXPORT_PATH}'"   
  check_command "导出数据表"

  echo "检查文件大小..."
  HDFS_SIZE=$(hadoop fs -du -s ${EXPORT_PATH} | awk '{print $1}')
  check_command "获取文件大小"

  if["$HDFS_SIZE" -le "$SIZE_THRESHOLD" ]; then
    echo "文件小于 32MB,使用简单复制方法..."
    hadoop fs -cp ${OLD_NAMENODE}${EXPORT_PATH} ${EXPORT_PATH} 
  else
    echo "文件大于 32MB,使用DistCp工具迁移..."
    hadoop distcp -update -skipcrccheck
${OLD_NAMENODE}${EXPORT_PATH} ${EXPORT_PATH}
  fi
  check_command"数据迁移"

  hive -e "IMPORT TABLE ${NEW_DB}.${TABLE} FROM '${EXPORT_PATH}'"
  check_command "导入数据表"
done < tables.txt

# 重建视图
echo "重建视图..."
while read VIEW; do
  echo"处理视图:$VIEW"
  DEFINITION=$(hive -e "SHOW CREATE TABLE ${NEW_DB}.${VIEW}")  
  check_command "获取视图定义"
  echo "${DEFINITION}" | hive-e
  check_command "重建视图"
done <views.txt

# 迁移 UDF
echo "列出并注册 UDF..."
# 假设您已经收集了所有的UDF及其JAR路径
UDF_LIST=("function_name_1" "function_name_2") 
JAR_PATH_LIST=("/path/to/jar1" "/path/to/jar2")

for i in "${!UDF_LIST[@]}"; do
  FUNCTION="${UDF_LIST[$i]}"
  JAR_PATH="${JAR_PATH_LIST[$i]}"

  echo"注册 UDF: $FUNCTION from $JAR_PATH"

  hive -e "ADD JAR ${JAR_PATH}; CREATE TEMPORARY FUNCTION${FUNCTION} AS'fully.qualified.class.name.of.Function';" 
  check_command "注册UDF ${FUNCTION}" done

echo "所有 Hive 表、视图和 UDF 函数迁移完成!"
相关推荐
大树885 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
大志哥1235 小时前
ES和Logstash日志链路系统上线后遭遇切片爆炸(解决)
大数据·elasticsearch
bush45 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5206 小时前
Linux 11 动态监控指令top
linux
果丁智能6 小时前
物联网智能锁赋能集中式住宿:身份核验与远程权限管控的全链路技术实践
大数据·人工智能·物联网·智能家居
王小王-1237 小时前
基于 Hive 的网易云音乐数据分析及可视化系统
hive·hadoop·数据分析·音乐数据分析·网易云音乐分析·hive音乐分析·hadoop网易云
不会C语言的男孩7 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
ApacheSeaTunnel7 小时前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步
古城小栈7 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix