本文csdn博客地址

常用组件/服务安装

背景: 不同语言组件开发需求,需要经常快速切换开发环境,或者在新机器安装开发环境。于是将常用开发语言的安装 固化成脚本,方便后续使用

项目: shell-tools

举例: 安装 trino 较高版本,需要 jdk17,通过这个项目 直接执行 make java-new 即可

安装完成后,环境变量中自动就配置了 jdk17

1
2
# java
export JAVA_HOME=/usr/java/jdk-17.0.6+10 # java

hive 表迁移

参考-hive数据迁移

背景: 需要跨集群迁移 hive 表结构,涉及两步: 迁移表数据 和 迁移表结构

表数据迁移

如果两个集群环境相通,可直接迁移 hdfs 数据

1
su ods -c "hadoop distcp hdfs://source_cluster/apps/hive/warehouse/db_name.db hdfs://target_cluster/apps/hive/warehouse/db_name/db"

如果网络不互通,需要先把数据下载下来,再手动传到目标集群。如果数据量不大还是可行的
su hdfs -c “hdfs dfs -get hdfs://cluster_name/apps/hive/warehouse/db_name.db/table_name”

for current_table in ${table_arr[@]}
do
su hdfs -c “hdfs dfs -get hdfs://cluster_name/apps/hive/warehouse/db_name.db/${current_table}”
done

表结构迁移

1
2
3
4
5
6
7
8
table_arr=(需要导出的表列表)

echo "" >> /tmp/ddl.sql
for current_table in ${table_arr[@]}
do
beeline -u jdbc:hive2://hive_server_host:10000/dw -n hive -e "show create table ${current_table}" 2>/dev/null | sed 's/.*createtab_stmt.*//g' | sed 's/.*--.*//g' | sed 's/| //g' | sed -E 's/ +\|//g' >> /tmp/ddl.sql
echo ";" >> /tmp/ddl.sql
done

然后在目标环境 执行导出的 ddl.sql

1
beeline -n user -u jdbc:hive2://hive_server_host:10000/db_name -f /tmp/ddl.txt

批量添加 ssh key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ip_list=(需要添加的机器列表)
ssh_port=22

ssh_public_key_arr=("ssh-rsa ...")

IFS=""
for current_ip in ${ip_list[@]}
do
ssh -p${ssh_port} ${current_ip} "echo '' | sudo tee -a /root/.ssh/authorized_keys"
for current_ssh_key in ${ssh_public_key_arr[@]}
do
ssh -p${ssh_port} ${current_ip} "echo '${current_ssh_key}' | sudo tee -a /root/.ssh/authorized_keys"
done
done

frp 反向代理批量安装

公司内网禁用了 服务部署环境 ssh 端口和本地开发环境的连接,登录机器需要通过 jumpserver 非常不方便

参考 frp 项目,写了一个批量在多节点安装 frpc 的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# frps 安装
echo "sshd:127.0.0.1" >> /etc/hosts.allow

mkdir -p /opt/modules/frps
pushd /opt/modules/frps
curl -LO https://github.com/fatedier/frp/releases/download/v0.40.0/frp_0.40.0_linux_amd64.tar.gz
tar -xzvf frp_0.40.0_linux_amd64.tar.gz
cd frp_0.40.0_linux_amd64
echo """
[common]
bind_port = 7001
authenticate_new_work_conns = true
authenticate_heartbeats = true
authentication_method = token
token = frp认证token
""" > frps.ini
nohup ./frps -c ./frps.ini > /dev/null 2>&1 &
popd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# frpc 批量安装

ip_list=(需要安装的节点列表)
remote_port=6001
ssh_port=22

for current_ip in ${ip_list[@]}
do

ssh -p${ssh_port} ${current_ip} "mkdir -p /opt/modules/frpc && cd /opt/modules/frpc && curl -LO https://github.com/fatedier/frp/releases/download/v0.40.0/frp_0.40.0_linux_amd64.tar.gz && tar -xzvf frp_0.40.0_linux_amd64.tar.gz && cd frp_0.40.0_linux_amd64 && hostname=`hostname | sed 's/\..*//g'` && echo -e "\n[common]\nserver_addr = router1\nserver_port = 7001\nauthenticate_new_work_conns = true\nauthenticate_heartbeats = true\nauthentication_method = token\ntoken = frp认证token\n[ssh_${remote_port}]\ntype = tcp\nlocal_port = ${ssh_port}\nremote_port = ${remote_port}" | tee frpc.ini"

ssh -p${ssh_port} ${current_ip} "ps -ef | grep 'frpc' | grep -v grep | awk '{print \$2}' | xargs --no-run-if-empty kill -9"
ssh -p${ssh_port} ${current_ip} "nohup /opt/modules/frpc/frp_0.40.0_linux_amd64/frpc -c /opt/modules/frpc/frp_0.40.0_linux_amd64/frpc.ini > /dev/null 2>&1 &"

ssh -p$ ${current_ip} 'echo "sshd:127.0.0." | tee -a /etc/hosts.allow'

remote_port=$((remote_port+1))
done

快速访问指定容器名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# /usr/bin/goto

#!/bin/bash
# set -euxo pipefail

echo "hello go!"

if [ $# -lt 2 ]; then
echo "Invalid input!"
exit
fi

node_name=$1
env_name=$2

# goto container dev_zsh
if [ "$node_name" == "container" ]; then
container_name=$env_name
container_count=`docker ps -a --filter name=^$container_name\$ | grep -v "CREATED" | wc -l | sed 's/\t//g' | sed 's/ //g'`
if [ "1" == "$container_count" ]; then
container_id=`docker ps -a --filter name=^$container_name\$ | grep -v "CREATED" | sed 's/ .*//g'`
docker exec -it $container_id /bin/zsh
if [ 0 -ne $? ]; then
docker exec -it $container_id /bin/bash
fi
else
echo "container: $env_name, get count $container_count, will not enter"
fi
exit
else
echo "command not valid"
fi

# goto container dev: bash into container name "dev"