1 集群分发脚本xsync
#!/bin/bash
#1. 判断传入参数的总个数
if [ $# -lt 1 ]
exit;
fi
#2. 遍历集群所有机器,for循环
for host in hadoop102 hadoop103 hadoop104 #执行第一次host是hadoop102;执行第二次host是hadoop103;执行第三次host是hadoop104
**do**
echo ==================== $host ==================== #展示在哪个机器上操作
#3. 遍历所有目录/文件,挨个发送。 下面是个内循环
for file in $@ #这里是一个内循环。 循环发多个参数、文件
do
#4. 判断文件是否存在 常用判断条件
if [ -e $file ] #取file这个变量的值,存在走then逻辑,不存在走else逻辑
then
#5. 获取父目录。”;”分号说明一行两个命令。从左往右依次执行。从内往外看
pdir=$(cd -P $(**dirname** $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
#7.远程发送
ssh $host "mkdir -p $pdir" #远程登录,进入到$host里面,执行命令。不管有没有这个$pdir这个目录,都创建出来。 -p保证了不会报错
**rsync** -av $pdir/$fname $host:$pdir #假如对方机器没有文件目录,给创造出来再传过去,同时避免对方有文件目录报错的情况。 rsyc这个是底层的核心命令
else
echo $file does not exists! #展示出来,文件不存在
fi
done
**done #这个是最外层的do-done**
pdir=$(cd -P $(dirname $file); pwd)
解释:
cd -P 跳转到、进入到实际物理路径,而非快捷方式路径/软连接。linux命令
; 分号说明一行有两个命令。先指向cd - P,然后在执行pwd,获取当前文件的父路径
保证逻辑的严谨性
假如hadoop102上的/aaa/a.txt 发送给 hadoop103,但是hadoop103压根就没有/aaa目录,给103先创建目录,然后在把文件发过去
@ ( 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
dirname
1)基本语法
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
2)案例实操
获取banzhang.txt文件的路径 – 就是取出父目录。如果是相对路径,展示的就是一个点.
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
basename
1)基本语法
basename [string / pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
2)案例实操
截取该/home/atguigu/banzhang.txt路径的文件名称
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt
banzhang.txt
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt .txt
banzhang
mkdir -p 创建多层目录,要创建的目录即使存在也不会保存
rsync远程同步工具
rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。
rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。
(1)基本语法
rsync -av p d i r / pdir/ pdir/fname u s e r @ h a d o o p user@hadoop user@hadoophost: p d i r / pdir/ pdir/fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
选项参数说明
(2)案例实操
把hadoop102机器上的/opt/software目录同步到hadoop103服务器的/opt/software目录下
[atguigu@hadoop102 opt]$ rsync -av /opt/software/* atguigu@hadoop103:/opt/software
2 jpsall脚本 查看所有进程,并过滤掉jps进程
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104 # for循环
do
echo =============== $host ===============
ssh $host jps $@ | grep -v Jps # 远程登录相应机器,执行jps命令。加上$@是保证,输入jpsall时,后面能够传入参数,不加的话,jpsall后面加上任何参数是无效的。
done
grep 过滤查找及“|”管道符
管道符,“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。类似sql中查询个虚表出来,然后通过where来进行过滤操作。
-v xx 输出除xx之外的所有行
jps 是java自带的查看进程的命令。jps -l 后面跟个参数l,能够查看各个进程的的全称。
3 hadoop机器的群起群停脚本myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ] # -lt 小于(less than)
then
echo "No Args Input..."
exit ;
fi
case $1 in #流程控制,case语句 关键词:确认过眼神,你是对的人 1.case语句为多重匹配语句 2.如果匹配成功,执行相匹配的命令
"start")
echo " =================== 启动 hadoop集群 ==================="
echo " --------------- 启动 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh" #远程登录hadoop102,执行命令,启动hdfs
echo " --------------- 启动 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " --------------- 启动 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;; #两个分号代表命令结束
"stop")
echo " =================== 关闭 hadoop集群 ==================="
echo " --------------- 关闭 historyserver ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " --------------- 关闭 yarn ---------------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " --------------- 关闭 hdfs ---------------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*) #default,不满足以上模式,默认执行*)下面的语句
echo "Input Args Error..."
;;
esac #esac表示case语句结束
4 zk.sh群起脚本
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit
fi
case $1 in # 目前这个脚本后面的第一个参数
"start")
for i in hadoop102 hadoop103 hadoop104
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start" #远程登录,到相应目录下执行命令
done
;;
"stop")
for i in hadoop102 hadoop103 hadoop104
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"
done
;;
"status")
for i in hadoop102 hadoop103 hadoop104
do
echo "===================== $i ======================="
ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"
done
;;
*)
echo "Input Args Error..."
;;
esac
最后我似乎应该把常用的shell语法写出来,以后经常看看
集群启动停止脚本(Hadoop、 Flume、 Kafka、 Zookeeper)
5 kafka.sh 群起脚本
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Input Args Error....."
exit
fi
for i in hadoop102 hadoop103 hadoop104
do
case $1 in
start)
echo "==================START $i KAFKA==================="
ssh $i "/opt/module/kafka_2.11-2.4.1/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.11-2.4.1/config/server.properties" #使用的都是绝对路径,避免错误的发生
;;
stop)
echo "==================STOP $i KAFKA==================="
ssh $i "/opt/module/kafka_2.11-2.4.1/bin/kafka-server-stop.sh stop"
;;
*)
echo "Input Args Error....."
exit
;;
esac
done
不同的代码实现,可以参考下
基本语法
for 变量 in 值1 值2 值3…
do
程序
done
6 Shell 中单引号和双引号区别:
1)在/home/atguigu/bin 创建一个 test.sh 文件
[atguigu@hadoop102 bin]$ vim test.sh
在文件中添加如下内容
#!/bin/bash
do_date=$1
echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date`
2)查看执行结果
[atguigu@hadoop102 bin]$ test.sh 2019-02-10
$do_date
2019-02-10
'2019-02-10'
"$do_date"
2019 年 05 月 02 日 星期四 21:02:08 CST
3) 总结:
(1)单引号不取变量值
(2)**双引号取变量值**
(3)反引号`,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值
7. 数据仓库,用户业务数据采集
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Usage: f2.sh {start|stop}"
exit
fi
case $1 in
start)
echo "==================== START hadoop104 F2 ===================="
ssh hadoop104 "**nohup** /opt/module/flume-1.9.0/bin/flume-ng agent -c /opt/module/flume-1.9.0/conf -f /opt/module/flume-1.9.0/gmalljob/kafka-hdfs.conf -n a1 -Dflume.root.logger=INFO,console >/opt/module/flume-1.9.0/logs/flume.log 2>&1 **&**"
;;
stop)
echo "==================== STOP hadoop104 F2 ===================="
ssh hadoop104 "ps -ef | grep kafka-hdfs.conf | grep -v grep | awk '{print \$2}' | xargs -n1 kill -9"
# ps -ef | awk '/taildir-kafka.conf/ && !/awk/{print $2}' | xargs -n1 kill -9
;;
*)
echo "Usage: f2.sh {start|stop}"
exit
;;
esac
-
nohup 命令 hub打断,nohup不打断程序的执行。关闭shell窗口的时候,不打断之前在这个窗口执行的命令。但是该xhell窗口中依然会阻塞。
-
& 命令加在最后 把程序的执行推到后台,在后台执行。就是能够保证我能够在该窗口下继续执行其他的命令。
-
标准输出,重定向。>/opt/module/flume-1.9.0/logs/flume.log
-
/opt/module/flume-1.9.0/logs/flume.log 2>&1,就是把标准错误信息(2)输出到标准正确输出(1)中。
-
ps -ef ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
ps -ef显示信息说明
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表明进程是CPU密集型运算,执行优先级会降低;数值越小,表明进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完整的终端名称
TIME:CPU时间
CMD:启动进程所用的命令和参数
-
awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
前面是正则匹配规则,后面{}是我要做的事。举例:
awk -F : ‘/^root/{print $1","$7}’ passwd root,/bin/bash 以:为分割符,搜索文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割
-
xargs命令的作用,是将标准输入转为命令行参数。
$ echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。
-n 参数 有时用户会在同一行输入多项 指定每次将多少项,作为命令行参数。
- \是转义字符
#!/bin/bash
if [ $# -lt 1 ]
then
echo "Usage: f1.sh {start|stop}"
exit
fi
case $1 in
start)
for i in hadoop102 hadoop103
do
echo "==================== START $i F1 ===================="
ssh $i "nohup /opt/module/flume-1.9.0/bin/flume-ng agent -c /opt/module/flume-1.9.0/conf -f /opt/module/flume-1.9.0/gmalljob/taildir-kafka.conf -n a1 -Dflume.root.logger=INFO,console >/opt/module/flume-1.9.0/logs/flume.log 2>&1 &"
done
;;
stop)
for i in hadoop102 hadoop103
do
echo "==================== STOP $i F1 ===================="
ssh $i "ps -ef | grep taildir-kafka.conf | grep -v grep | awk '{print \$2}' |xargs -n1 kill -9"
# ps -ef | awk '/taildir-kafka.conf/ && !/awk/{print $2}' |xargs -n1 kill -9
done
;;
*)
echo "Usage: f1.sh {start|stop}"
exit
;;
esac
8. 业务数据导入HDFS mysql - sqoop - hdfs
#! /bin/bash
sqoop=/opt/module/sqoop/bin/sqoop
if [ -n "$2" ] ;then
do_date=$2
else
do_date=`date -d '-1 day' +%F`
fi
import_data(){
$sqoop import \
--connect jdbc:mysql://hadoop102:3306/gmall \
--username root \
--password 123456 \
--target-dir /origin_data/gmall/db/$1/$do_date \
--delete-target-dir \
--query "$2 and \$CONDITIONS" \
--num-mappers 1 \
--fields-terminated-by '\t' \
--compress \
--compression-codec lzop \
--null-string '\\N' \
--null-non-string '\\N'
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /origin_data/gmall/db/$1/$do_date
}
import_order_info(){
import_data order_info "select
id,
final_total_amount,
order_status,
user_id,
out_trade_no,
create_time,
operate_time,
province_id,
benefit_reduce_amount,
original_total_amount,
feight_fee
from order_info
where (date_format(create_time,'%Y-%m-%d')='$do_date'
or date_format(operate_time,'%Y-%m-%d')='$do_date')"
}
import_coupon_use(){
import_data coupon_use "select
id,
coupon_id,
user_id,
order_id,
coupon_status,
get_time,
using_time,
used_time
from coupon_use
where (date_format(get_time,'%Y-%m-%d')='$do_date'
or date_format(using_time,'%Y-%m-%d')='$do_date'
or date_format(used_time,'%Y-%m-%d')='$do_date')"
}
import_order_status_log(){
import_data order_status_log "select
id,
order_id,
order_status,
operate_time
from order_status_log
where date_format(operate_time,'%Y-%m-%d')='$do_date'"
}
import_activity_order(){
import_data activity_order "select
id,
activity_id,
order_id,
create_time
from activity_order
where date_format(create_time,'%Y-%m-%d')='$do_date'"
}
import_user_info(){
import_data "user_info" "select
id,
name,
birthday,
gender,
email,
user_level,
create_time,
operate_time
from user_info
where (DATE_FORMAT(create_time,'%Y-%m-%d')='$do_date'
or DATE_FORMAT(operate_time,'%Y-%m-%d')='$do_date')"
}
import_order_detail(){
import_data order_detail "select
od.id,
order_id,
user_id,
sku_id,
sku_name,
order_price,
sku_num,
od.create_time,
source_type,
source_id
from order_detail od
join order_info oi
on od.order_id=oi.id
where DATE_FORMAT(od.create_time,'%Y-%m-%d')='$do_date'"
}
import_payment_info(){
import_data "payment_info" "select
id,
out_trade_no,
order_id,
user_id,
alipay_trade_no,
total_amount,
subject,
payment_type,
payment_time
from payment_info
where DATE_FORMAT(payment_time,'%Y-%m-%d')='$do_date'"
}
import_comment_info(){
import_data comment_info "select
id,
user_id,
sku_id,
spu_id,
order_id,
appraise,
comment_txt,
create_time
from comment_info
where date_format(create_time,'%Y-%m-%d')='$do_date'"
}
import_order_refund_info(){
import_data order_refund_info "select
id,
user_id,
order_id,
sku_id,
refund_type,
refund_num,
refund_amount,
refund_reason_type,
create_time
from order_refund_info
where date_format(create_time,'%Y-%m-%d')='$do_date'"
}
import_sku_info(){
import_data sku_info "select
id,
spu_id,
price,
sku_name,
sku_desc,
weight,
tm_id,
category3_id,
create_time
from sku_info where 1=1"
}
import_base_category1(){
import_data "base_category1" "select
id,
name
from base_category1 where 1=1"
}
import_base_category2(){
import_data "base_category2" "select
id,
name,
category1_id
from base_category2 where 1=1"
}
import_base_category3(){
import_data "base_category3" "select
id,
name,
category2_id
from base_category3 where 1=1"
}
import_base_province(){
import_data base_province "select
id,
name,
region_id,
area_code,
iso_code
from base_province
where 1=1"
}
import_base_region(){
import_data base_region "select
id,
region_name
from base_region
where 1=1"
}
import_base_trademark(){
import_data base_trademark "select
tm_id,
tm_name
from base_trademark
where 1=1"
}
import_spu_info(){
import_data spu_info "select
id,
spu_name,
category3_id,
tm_id
from spu_info
where 1=1"
}
import_favor_info(){
import_data favor_info "select
id,
user_id,
sku_id,
spu_id,
is_cancel,
create_time,
cancel_time
from favor_info
where 1=1"
}
import_cart_info(){
import_data cart_info "select
id,
user_id,
sku_id,
cart_price,
sku_num,
sku_name,
create_time,
operate_time,
is_ordered,
order_time,
source_type,
source_id
from cart_info
where 1=1"
}
import_coupon_info(){
import_data coupon_info "select
id,
coupon_name,
coupon_type,
condition_amount,
condition_num,
activity_id,
benefit_amount,
benefit_discount,
create_time,
range_type,
spu_id,
tm_id,
category3_id,
limit_num,
operate_time,
expire_time
from coupon_info
where 1=1"
}
import_activity_info(){
import_data activity_info "select
id,
activity_name,
activity_type,
start_time,
end_time,
create_time
from activity_info
where 1=1"
}
import_activity_rule(){
import_data activity_rule "select
id,
activity_id,
condition_amount,
condition_num,
benefit_amount,
benefit_discount,
benefit_level
from activity_rule
where 1=1"
}
import_base_dic(){
import_data base_dic "select
dic_code,
dic_name,
parent_code,
create_time,
operate_time
from base_dic
where 1=1"
}
case $1 in
"order_info")
import_order_info
;;
"base_category1")
import_base_category1
;;
"base_category2")
import_base_category2
;;
"base_category3")
import_base_category3
;;
"order_detail")
import_order_detail
;;
"sku_info")
import_sku_info
;;
"user_info")
import_user_info
;;
"payment_info")
import_payment_info
;;
"base_province")
import_base_province
;;
"base_region")
import_base_region
;;
"base_trademark")
import_base_trademark
;;
"activity_info")
import_activity_info
;;
"activity_order")
import_activity_order
;;
"cart_info")
import_cart_info
;;
"comment_info")
import_comment_info
;;
"coupon_info")
import_coupon_info
;;
"coupon_use")
import_coupon_use
;;
"favor_info")
import_favor_info
;;
"order_refund_info")
import_order_refund_info
;;
"order_status_log")
import_order_status_log
;;
"spu_info")
import_spu_info
;;
"activity_rule")
import_activity_rule
;;
"base_dic")
import_base_dic
;;
"first")
import_base_category1
import_base_category2
import_base_category3
import_order_info
import_order_detail
import_sku_info
import_user_info
import_payment_info
import_base_province
import_base_region
import_base_trademark
import_activity_info
import_activity_order
import_cart_info
import_comment_info
import_coupon_use
import_coupon_info
import_favor_info
import_order_refund_info
import_order_status_log
import_spu_info
import_activity_rule
import_base_dic
;;
"all")
import_base_category1
import_base_category2
import_base_category3
import_order_info
import_order_detail
import_sku_info
import_user_info
import_payment_info
import_base_trademark
import_activity_info
import_activity_order
import_cart_info
import_comment_info
import_coupon_use
import_coupon_info
import_favor_info
import_order_refund_info
import_order_status_log
import_spu_info
import_activity_rule
import_base_dic
;;
esac