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:内核空间占用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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随缘清风殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值