由于在galaxy上建hive2hive任务时会自动使用bipreempt帐号创建mtods表,但wormhole在运行hive2hive同步任务时使用sync_shanghai帐号读取北京侧hive表数据,然后写入上海侧mtods表所在hdfs路径,此时会出现写入没有权限的问题。因此需要将目录owner设置为sync_shanghai或将目录的group权限设置为可写。
(最初采用的是第一种方案,在北上集群融合后,超级帐号权限回收,改成了第二种方案)
原理:galaxy执行expect脚本,脚本自动登录161上机器,并发送后台执行auth_table.sh脚本的命令,其中auth_table.sh是161上的一个赋权脚本
注意点:直接在galaxy上发送赋权的命令无法成功,目录权限未被修改成sync_shanghai,原因不明
JSch用exec只能执行系统自带的如pwd等命令,无法执行和环境变量相关的命令,直接执行打印环境变量可以看到其中不包含hadoop等环境因此不可行,用shell方式试了下可以登录,但不知道如何发送执行命令
----------------------------------------
galaxy web上的脚本/tmp/ssh_cmd.exp(正确处理了第一次连接需要yes确认的问题,非第一次也能正确运行)
从/tmp/ssh_cmd.exp迁移到/data/appdatas/ssh_cmd.exp
#!/usr/bin/expect
set host [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set shell [lindex $argv 3]
set table [lindex $argv 4]
set timeout 50
spawn ssh -p 58422 $user@$host
expect {
"*yes/no" {
send "yes\r";
exp_continue
}
"*password:" {
send "$password\r"
}
}
expect "*Last login"
send "echo \$PATH\r"
expect "*hadoop"
send "klist\r"
expect "Ticket*"
send "nohup sh $shell $table >> /tmp/auth_mtods_log.txt \& \r"
expect "*$table"
161上有/auth_table.sh,执行的输出会写入日志:/tmp/auth_mtods_log.txt
sh /data/home/hadoop/getticket.sh
hadoop fs -ls d hdfs://cosmos-hadoop/user/hive/warehouse/bi.db/$@
hadoop fs -chown sync_shanghai hdfs://cosmos-hadoop/user/hive/warehouse/bi.db/$@
hadoop fs -ls -d hdfs://cosmos-hadoop/user/hive/warehouse/bi.db/$@