01 引言
博主最近在实际的业务中,使用到了DolphinScheduler(一款大数据调度框架)里面的一个工作流的MapReduce任务节点。
主要做的事情就是,在该节点提交一个mr
作业到华为云MRS大数据平台里面的yarn
,任务节点代码如下:
从代码得知,它是使用CLI
的形式提交作业的,因此需要解决如下几个问题:
q1
:需要有一个hadoop的安装包;q2
: hadoop安装包体积过大,需要裁剪,否则挂载到容器,镜像会很大。q3
: hadoop安装包的依赖库必须是第三方的大数据平台(MRS)提供的;q4
: 访问MRS需要走kerberos认证,需要集成kerberos组件;q5
:集成hadoop安装包到项目。
ok,本文围绕以上几个问题逐个解决。
02 选择合适的hadoop安装包
因为项目需求是使用3.3.1版本的hadoop sdk,因此我去搜了一下仓库:https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.3.1/
发现该sdk体积很大,因此选择了版本2.7.7(体积小了一半):
https://repo.huaweicloud.com/apache/hadoop/common/hadoop-2.7.7/
好了,接下来需要进行裁剪了。
03 裁剪hadoop安装包
安装下载并解压后,可以得知,它的依赖库都在"{解压目录}/share/hadoop/common
"下,根据组件类型,按文件夹分类了不同的jar:
其实除了“common”,其他文件夹都可以删除,为了方便下一步添加MRS平台的依赖库,我把这里的所有文件夹都删除了,只留下common。
这么一来,这个安装包的体积才几M了。
04 hadoop安装包添加依赖库
上一步骤,只留下了common文件夹了,我们需要替换里面的jar,那这些依赖库从哪里来呢?
我们可以看看华为云提供的官方demo:
https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.2
IDEA git clone下来,使用mave导入,然后在菜单栏,展开“External Libraries
”,可以看到自动依赖hadoop相关的jar:
注意了,这里依赖的jar就是hadoop 安装包里面如果使用客户端命令,必须用到的内容,因此我们需要把这里依赖到的所有jar包都从本地的maven仓库copy出来。
最终,我添加了jar包到了刚刚裁剪过的"{解压目录}/share/hadoop/common
"目录下:
验证:
cd ./bin
./hadoop version
可以看到,我们添加了库到hadoop的安装包,现在可以看做是一个hadoop客户端了。
压缩后,它的体积仅有87.8M了,比之前的体积少了近10倍。
05 hadoop安装包集成kerberos组件
现在已经有了hadoop
的客户端了,如果要正常提交mr
作业到MRS
平台,还有两个步骤需要走:
- Step1:修改"
{解压目录}/etc/hadoop
"目录下的几个文件(一般为:core-site.xml
、hdfs-site.xml
、yarn-site.xml
、mapred-site.xml
),通常这几个文件都是大数据平台的相关负责人提供,然后我们直接替换就好了; - Step2:使用
kerberos
的kinit
命令获取身份票据,然后就能正常使用hadoop
的相关命令了。
那么,kerberos相关的安装包在哪里下载呢?我们可以进入我们“要使用hadoop安装包的业务服务”所在的物理机,然后使用命令下载(注意:这里的业务服务是部署到k8s集群里面的,默认已经进入了pod容器):
## Ubuntu/Debian系统:
apt-get install krb5-user krb5-config
## CentOS/RHEL系统
yum install krb5-workstation krb5-libs
## 容器里面的系统是(Alpine Linux v3.11)
apk add krb5
安装成功:
打包这些命令:
## 创建文件夹
mkdir krberos_client
## 复制keberos命令
cp /usr/bin/kinit \
/usr/bin/klist \
/usr/bin/kdestroy \
/usr/bin/kpasswd \
/usr/bin/kadmin \
/usr/bin/kvno \
/usr/bin/ktutil \
krberos_client/
## 打包keberos命令
tar czvf krberos_client.tar.gz krberos_client/
然后导出(本文是从容器里导出“kubectl cp <namespace>/<pod_name>:<container_path> <local_path>
”)
最后,解压这些文件到hadoop安装包的bin目录(没强制要求):
06 集成安装包到项目
经过前面的描述,已经把hadoop
的安装包裁剪了,且集成了kerberos
的组件,此时我们需要把这个安装包一起打包到我们的项目,细节不说了,我直接贴出我的Dockerfile
:
# 使用OpenJDK 8作为构建环境
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 声明JAVA_HOME、HADOOP_HOME等
ENV JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
ENV HADOOP_HOME=/data/hadoop
ENV PATH $JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH
RUN mkdir -p /data/hadoop
COPY hadoop-mrs /data/hadoop
RUN cp /data/hadoop/bin/k* /usr/local/bin/ && \ ## 复制kerberos相关的命令到bin目录,直接就能使用
cp /data/hadoop/etc/hadoop/krb5.conf /etc/ ## 复制krb5.conf到etc目录,keberos命令从这个路径读取kdc、realm等信息
## 其它....
以上有几个细节需要注意:
- 安装包bin目录下的kerberos命令必须复制到
/user/local/bin
目录,这样才可以直接使用kerberos相关的客户端命令; krb5.conf
文件必须放到etc
目录,因为kerberos命令默认就是从该路径的krb5.conf文件读取kdc、realm等信息的;- ENV必须声明JAVA_HOME、HADOOP_HOME、PATH这些信息,这样才能直接使用hadoop命令。
最后,进入容器,看看执行的效果,可以看到命令一切正常:
上述仅仅是验证命令的可行性,如果要真正提交mr作业到mrs,你可能需要这样执行命令:
# 获取用户kerberos 票据
kinit -kt [user.keytab文件路径] [用户principal]
# 查询是否获取成功
klist
# 使用hadoop 命令
hdfs dfs -list
如下(目录可能不同,之前验证通过的,做示例展示):
备注:Hadoop客户端首先会检查
KRB5CCNAME
变量是否存在,并使用该变量指定的路径来读取Kerberos票据,如果该变量不存在,则会使用默认的票据缓存路径来读取票据(即图片klist
命令结果中的/tmp//krb5cc_0
)。
06 文末
附:
- DolphinScheduler:https://dolphinscheduler.apache.org/en-us
- 华为云MRS:https://support.huaweicloud.com/productdesc-mrs/mrs_08_0001.html
- hadoop sdk:https://repo.huaweicloud.com/apache/hadoop/common/
- huaweicloud-mrs-example:https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.2
本文主要就是讲解了hadoop sdk的裁剪、集成kerberos组件等操作,纯属经验之谈,希望能帮助到大家,谢谢大家的阅读,本文完!