一、认证问题二、环境问题三、上一任的代码
一、认证问题集群中使用的是kerberos认证,因为对这个组件不熟,导致前期出各种各样的问题。
调度命令之前都要认证一下,避免不通过授权
kinit -kt keytab 用户名@ODATA.NCMP.UNICOM.LOCAL二、环境问题
因为是给甲方做项目,所以给我们的权限不是特别足
1、不能使用xshell直连,必须在网页上使用接口机访问集群 2、没有hadoop UI的权限,查看文件必须使用命令行 3、没有Yarn UI的权限,想看到程序运行情况和日志只能用命令行 4、DS调度不熟练,主要还是认证的原因,认证通过之后,大部分都不报错误 5、zk服务器地址问题 6、新旧集群的转换,包括一些业务问题 7、hive中的一些常用命令
针对这些问题,提供一些我的解决思路
1、不能直连就是有点麻烦,其他操作都和linux差不多。现在对接口机这个概念还是不太熟悉,能用hadoop命令,也能用hive命令,但是查看组件的相关配置文件,worker之后自己。集群中还部属了多个yarn集群,初期不熟悉的时候,因为不同集群之间的切换碰到了很多问题,以后遇到这种问题,最好跟集群相关负责人确定一下,我们要使用的具体的集群。
2、没有hadoopUI的权限,要想查看hdfs的文件情况,只能通过命令行查看,以下是我常用的几个命令行
查看文件目录
hdfs dfs -ls hdfs://命名空间/路径
查看文件大小(字节)
如果是文件,以字节的方式展示大小
如果是路径是文件夹,则展示文件夹下的所有文件
hdfs dfs -du hdfs://命名空间/路径
查看文件大小(以人性化的方式展现)
hdfs dfs -du hdfs://命名空间/路径
3、没有yanr UI的权限,常用命令
查看此yarn集群上运行的任务
如果你觉得打印的太多,也可以选择过滤 "| grep 关键字"为可选项
yarn application --list | grep 关键字
这是从命令行上扣下来,优化过后的,从左到右分别是
application-id:程序在yarn集群上的唯一id
application-Name:应用程序的名称,启动的程序的时候可以指定
application-Type:应用程序的类型,图示的是flink,程序有的像spark、mr
user:启动这个程序的用户
Queue:yarn可能有多个队列,可以在提交的时候指定队列,注意提交的时候,先要查看你可以使用的队列信息 在下面有
State:程序的状态,running 表示正在跑
Final-State:没有跑完不用管
Progress:程序进度条,像flink这种会占内存的会一直在100%,hive脚本跑100%就是完成了
Tracking-URL:跟踪地址,没有用到,原因是网不通
查看用户可以使用的队列
hadoop queue -showacls | grep SUBMIT
如图你可以使用的队列为 default 和 sy
查看yarn集群上程序运行的日志
c是你要查询的关键字
yarn logs -applicationId 应用ID |grep 关键字
动态观察yarn资源情况
yarn top
查看所有的资源和进程
观察指定队列
yarn top -queues 队列名
可以看到指定队列的资源和进程信息
当然这些命令不是特别全,如果没有你想要的命令,可以尝试
yarn --help 查看帮助
4、DS调度问题
因为同事也是刚接触到DS这个调度工具,在hive脚本调度上遇到了一些问题,他们这个集群上分了很多hive库, 包括ODS一个库,DWD一个库,DIM一个库,那么这就关系到库与库之间的表关联。
select id,name from 库名.表名 join 库名.表名 on 关系
在脚本中可以实现,不过他们之前是直接对接的hive数据源,所以无法完成库之间的关联。
像DS调度中一直出现的问题就是,执行脚本之前都要认证一次。前期认证不通过,虽然能查数据,但是插入的时候就会报错。认证通过之后,之前的问题也都没有了。
还有就是DS中调度脚本要执行变量。
shell脚本编写如下
#!/bin/bash #在脚本当中获取参数 do_date=$1 sql="select * from table where date='$1';" hive -e $sql
5、zk服务器地址问题
他们这个集群中不止一个hive,不是hive库,我们要访问hive使用的hiveserver2的依靠zk搭建的高可用,然后使用beeline -u 指定zk的地址。
指定的zk客户端不一样,导致连接的hive也不一样,所有有一次我连接hive的时候,发现hive的库不一样。
连接之前要跟负责人确定好,到底生产的库是那个。特别离谱的是库不一样,但是库下面的表指定hdfs的位置是一样的,也就是说,两个hive都能操作同一个文件。
6、新旧集群的转换,包括一些业务问题
新旧集群在网络互通的情况下可以使用distcp进行转换,问题是现在他们网络不互通,之前在旧集群上部署的脚本只能手工下载到本地在上传到新的集群中。
历史数据也不要了,维护数据根据脚本要确定要哪些,然后让他们拷贝下来。这个问题的困难点在于梳理业务,整个流程的业务都要梳理一遍,只给了一周的时间
进行迁移,时间太干,来不及梳理多细,只能看着原来的脚本把需要的数据扣下来。
7、hive中的一些常用命令
hive查看只能用命令行去敲,无法使用Datagrip连接,往往要查看一些表信息是比较繁琐的,先找库后找表。建议使用命令行最好要把经常使用的命令保存到一个自己记得住的地方,不用自己在去手敲。
列一下hive中常用的命令
查看表的详细信息
desc formatted 库名.表名; show create table 库名.表名;
几个比较关注的信息
hdfs上的存储路径
numfiles 表的文件数量
totalSize 总大小
表的格式可以从inputformat获取,图示为parquet格式
还能看出表是否采用了压缩
表是否分桶,,-1表示为分桶
修复表的分区
msck repair table 表名 alter table 表名 add partition(dayid=20220325)
查看表中的数据量
explain exetended select count(*) from 库名.表名;
查看表的分区
show partitions 库名.表名
hive 的优化参数 参数除个别以外,基本不用怎么变化
set hive.execution.engine=spark; #设置计算引擎 set mapreduce.job.queuename=hive; #指定队列名称,根据你可用的队列添加 SET hive.auto.convert.join=TRUE; SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions = 1000000; SET hive.exec.max.dynamic.partitions.pernode=100000; SET hive.exec.max.created.files=1000000; set mapred.max.split.size=256000000; set mapred.min.split.size.per.node=100000000; set mapred.min.split.size.per.rack=100000000; set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; set hive.merge.mapfiles = true; set hive.merge.mapredfiles = true; set hive.merge.size.per.task = 256000000; set hive.merge.smallfiles.avgsize=256000000; set hive.exec.reducers.bytes.per.reducer=500000000;三、上一任的代码
这是我来到公司最头痛的一段代码,要注释没注释,本来是由ODS到DWD,他们自己实现了一个flink程序读写,而且不是直接对接hive,而是操作hdfs,flink设置了一个睡眠时间来赞批,然后交给flinkSQL关联维度表,然后拷贝放到hdfs上,这样做的缺陷就是,你的文件相当于使用hdfs put 命令上传到hdfs,但是hive扫描不到,要想hive扫描到,必须进行一次修复,我们选择了用DS每小时调度一次进行修复。



