shell编程之大数据面试题
1、linux常用高级命令1.1、top--实时查看内存1)第一行23:07:25 : 当前系统时间;user : 用户个数;load average : 三个数分别表示1分钟,五分钟,15分钟的负载状况***高于5表明系统在超负荷运转2)第二行task:任务(进程)–系统共有250个进程,1个在运行,249在休眠,0个stop,0个僵尸状态3)CPU状态us:用户空间占用CPU的百分比sy:内核
1、linux常用高级命令
1.1、top
--实时查看内存
1)第一行
23:07:25 : 当前系统时间;
user : 用户个数;
load average : 三个数分别表示1分钟,五分钟,15分钟的负载状况
***高于5表明系统在超负荷运转
2)第二行
task:任务(进程)
–系统共有250个进程,1个在运行,249在休眠,0个stop,0个僵尸状态
3)CPU状态
us:用户空间占用CPU的百分比
sy:内核空间占用CPU的百分比
ni:改变过优先级的进程占用CPU的百分比
id:空闲CPU百分比
wa:IO等待占用CPU的百分比
hi:硬中断占用CPU的百分比
si:软中断占用CPU的百分比
4)内存状态
total:物理内存总量
free:空闲交换区总量
used:使用的交换区总量
cached:缓冲的交换区总量
①u键切换用户
--输入用户,切换用户
②k键删除进程
--输入PID,删除进程
③q键退出top
1.2、iotop
--监视磁盘IO读写,查看每个进程使用磁盘I/O的情况
--必须以root用户运行
1.3、iotop -o
--显示正在使用的进程或线程
1.4、df -h
--查看linux服务器的文件系统磁盘空间占用情况
①文件系统
②容量
③已用
④可用
⑤已用占比
⑥挂载点
1.5、uptime
--查看报告系统运行时长及平均载荷
①系统时间;
②运行时长;
③一分钟,五分钟,十五分钟的负载情况。
1.6、ps -aux
--查看进程
2、shell常用工具和脚本
2.1、shell常用工具
1)awk
2)sed
--文本处理,用于字符替换、格式化;
--只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出,不会写回原文件,除非用shell的输出重定向来保存结果。
#按行显示
sed -n '2,3p' /文件
#按查找显示
sed -n '/chazhao/p' /文件
#字符替换
sed 's/pattern/替换文本/g' inputFileName > outputFileName
#删除空行
sed '/^$/d' inputFileName
3)cut
--对文件每一行进行裁剪
4)sort
--对文本中的行进行排序
sort -t ':' -k3,3 -n
# -k3,3 指仅从第三个区间排序
# -k3,4 指从第三个到第四个区间的内容进行排序
# -k3则代表从第三个区间到结尾的内容
2.2、shell脚本
1)集群启动脚本
--shell脚本启动和关闭大数据集群
#!/bin/bash
echo "*********正在开始集群服务********"
echo "******正在开启namenode节点******"
#Zookeeper服务
for host in hadoop01 hadoop02 hadoop03
do
ssh $host "source /etc/profilr;/opt/model/zookeeper-3.6.0/bin/zkserver.sh start"
done
#启动hdfs集群 namenode和datanode
start-fds.sh
#启动yarn资源管理集群 resourcemanager和nodemanager
start-yarn.sh
#启动job历史记录服务
mr-jobhistory-daemon.sh start historyserver
#启动hbase集群
start-hbase.sh
--关闭集群
#!/bin/bash
#关闭hbase
stop-hbase.sh
#关闭jobhistory
mr-jobhistory-daemon.sh stop historyserver
#关闭yarn服务
stop-yarn.sh
#关闭dfs
stop-dfs.sh
#zookeeper服务
for host in hadoop01 hadoop02 hadoop03
do
sh $host "source /etc/profile;/opt/model/zookper-3.6.0/bin/zkserver.sh stop"
done
--关闭节点是整体意义上的倒序,不是细节上的倒序,hdfs和yarn在关闭的时候需要先关闭namenode和resourcemanager。
2)集群分发脚本
--scp(secure cope)安全拷贝可以实现服务器和服务器之间的数据拷贝。
--rsync远程同步工具:用于镜像和备份。
--rsync和scp区别:用rsync做文件的复制要比scp的速度快,
rsync只对差异文件做更新,-a归档拷贝
scp是把所有文件都复制过去
#scp基础语法
scp -r $dir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
#eg:将Hadoop1上的opt/module目录下的软件拷贝到hadoop102上
scp -r /opt/module root@hadoop102:opt/module
#rsync基础语法
rsync -av pdir/fname user@hadoophost:pdir/fname
#eg:将hadoop1上的opt/module目录县的数据复制到hadoop下
rsync -av /opt/software root@hadoop102:/opt/module
***rsync集体群分脚本
①需求
循环复制文件到所有节点的相同目录下
②需求分析
脚本内容是什么,脚本名称是什么,脚本放在哪个路径地下
#1、rsync命令原始拷贝
rsync -av /opt/module root@hadoop103:/opt/
#2、脚本名称
jiqunfenfa.sh
#3、脚本存放位置
/home/lizhi/bin #lizhi用户可以在系统任何地方直接执行
③脚本实现
1、创建脚本
cd /home/lizhi
mkdir bin
touch jiqunfenfa
vim jiqunfenfa
2、编写脚本
#!/bin/bash
#1.判断参数个数
if [ $# -lt 1]
then
echo not enough arguement!
exit;
fi
#2.遍历集群所有机器
for host in hadoop1 hadoop2 hadoop3
do
echo ======$host======
#3.遍历所有目录,挨个发送
for file in $@
do
#4、判断文件是否存在
if [ -e $file ]
then
#5.获取父目录
pdir=$(cd -P $(dirname $file);pwd)
#6.获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
3)数仓和mysql的导入和导出
①通过数据工具sqoop进行hive和mysql的全量导入导出
mysql数据导入hive
sqoop import JDBC/用户名/密码/表名 map并行数目 hive-import 表分隔符/表名
sqoop import \
--connect jdbc:mysql://master1.hadoop:3306/test \ --mysql连接信息(JDBC)
--username root \ --mysql用户名
--password 123456 \ --mysql密码
--query 'select * from people_access_log where \$CONDITIONS and url = "https://www.baidu.com"' \
--后接查询语句,条件查询需要\$CONDITIONS and连接查询条件,这里的\$表示转义,必须有.
--table people_access_log \ --mysql表名
--m 1 \ --并行导入启用的map任务数量
--hive-import \
--create-hive-table \ --插入数据到hive中,使用默认的hive分隔符
--fields-terminated-by '\t' \ --hive分隔符号
--hive-table web.people_access_log --hive表名
Hive数据导入到Mysql
sqoop export mysql JDBC/用户名/密码/表名 input 分隔符/表名 map数目
sqoop export \
--connect jdbc:mysql://master1.hadoop:3306/test \
--username root \
--password 123456 \
--table people_access_log_out \
--input-fields-terminated-by '\t' \
--export-dir /user/hive/warehouse/web.db/people_access_log \
--num-mappers 1
②通过数据工具sqoop进行hive和mysql的增量导入导出
基于递增列Append导入、
append适合业务系统库,一般业务系统表会通过自增ID作为主键标识唯一性
Ⅰ、创建job
创建计划任务,然后定时执行
sqoop job --create mysql2hive_job -- import \ --创建了一个mysql2hive_job
--connect jdbc:mysql://master1.hadoop:3306/test \
--username root \
--password 123456 \
--table people_access_log \
--target-dir /user/hive/warehouse/web.db/people_access_log \ --目标表路径
--check-column id \ --递增列名
--incremental append \ --插入方式
--fields-terminated-by '\t' \
--last-value 6 \
-m 1
Ⅱ、执行job
sqoop job -exec mysql2hive_job
可用shell脚本定时执行
Lastmodified 导入实战
Lastmodified适合ETL的数据根据时间戳字段导入,表示只导入比这个时间戳大,即比这个时间晚的数据。
Ⅰ、创建Job
sqoop job --create mysql2hive_job - import \
--connect jdbc:mysql://master1.hadoop:3306/test \
--username root \
--password 123456 \
--table people_access_log2 \
--hive-import \
--hive-table web.people_access_log2 \
--check-column access_time \
--incremental lastmodified \
--last-value "2019-12-28 16:23:56" \
--fields-terminated-by ',' \
--merge-key id
这种基于时间导入模式,需要指定--merge-key或者--append参数,表示根据时间戳导入,数据是直接在末尾追加(append)还是合并(merge),这里使用merge方式,根据id合并:
Ⅱ、执行job
sqoop job -exec mysql2hive_job
4)数仓内部的导入
--简单shell脚本执行hive
Ⅰ、hive -e命令
运行引号内sql查询语句
#!/bin/bash
#1、定义HIVE_HOME
HIVE_HOME=/opt/software/hive
echo "启动hive ``````"
echo "创建临时表emg_tmpcxb"
#2、hive -e进行数据加载
$HIVE_HOME/bin/hive -e "
drop table if exists emg.emg_tmpcxb;
create table if not exists emg.emg_tmpcxb(utc string)row format delimited fields
terminated by '\t';
"
echo "建表成功 开始导入数据"
$HIVE_HOME/bin/hive -e "
insert overwrite table emg.emg_tmpcxb select utc from emg.d181119 limit 5;
"
echo "数据导入成功"
Ⅱ、hive -f命令
把需要执行的hql单独保存成文件,然后通过linux的命令行执行
①生成text.sql文件
use database;
drop table cl_a;
--create table cl_a(a string);
②命令执行
hive -f test.sql
Ⅲ、hive -hivevar命令
Shell调用Hive传参、回传并处理海量数据分区
①、编写hql脚本
insert overwrite
table dw.tw_order_custom_portrait_d
partition(statis_year='${hivevar:iv_year}', statis_month='${hivevar:iv_mon}',
statis_date = '${hivevar:iv_date}')
select tod.product_type, tod.package_level
from ods.to_order_custom_portrait_d tod where tod.statis_date = ${hivevar:iv_date};
②、编写shell脚本
#!/usr/bin/bash
HIVE_HOME=/opt/software/hive
#项目是离线数据处理,今天拿到的是隔天的数据,先把时间变量设置好,亦HQL的入参
iv_date="`date -d "1 days ago" +%Y%m%d`"
iv_mon=${iv_date:0:6}
#echo $iv_mon;
iv_year=${iv_date:0:4}
#echo $iv_year;
#设置hive变量,处理hql
cd $HIVE_HOME
bin/hive -e "select count(1) from ods.to_order_custom_portrait_d tod where tod.statis_date = ${hivevar:iv_date};"
#处理返回参数
rtstatus=$?
echo $rtstatus
if [ $rtstatus -lt 1 ]; then
echo "to_order_custom_portrait_d表数据不存在!"
exit $rtstatus
fi
#处理多个入参,到hql脚本,并执行hql脚本
bin/hive -hivevar iv_date=$iv_date -hivevar iv_mon=$iv_mon -hivevar iv_year=$iv_year
-f 'tw_order_custom_portrait_d.hql'
#处理返回参数
exitCode=$?
if [ $exitCode -ne 0 ];then
echo "[ERROR] hive execute failed!"
exit $exitCode
fi
③调用shell脚本
sh test.sh
Ⅳ、shell外部入参
$# 获取参数的个数
$* 获取全部参数
$@ 获取全部参数
更多推荐
所有评论(0)