在Kerberos环境使用Hue通过Oozie执行Sqoop作业报错异常分析

时间:2022-05-06
本文章向大家介绍在Kerberos环境使用Hue通过Oozie执行Sqoop作业报错异常分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.问题描述


关于Sqoop抽取Hive Parquet表数据到MySQL可以参考Fayson前面的文章《Sqoop抽取Hive Parquet表数据到MySQL异常分析》。

在命令行执行Sqoop抽取Hive Parquet表数据到MySQL正常运行,但在Hue中通过Oozie执行Sqoop抽数失败。

Sqoop抽数脚本:

sqoop export 
--connect jdbc:mysql://ip-172-31-22-86.ap-southeast-1.compute.internal:3306/test_db 
--username testuser 
--password password 
--table mytest_parquet 
--hcatalog-database default 
--hcatalog-table mytest_parquet --num-mappers 1

异常信息如下,提示:代码块部分可以左右滑动查看噢

2017-12-28 11:17:40,871 [main] WARN  org.apache.hadoop.security.UserGroupInformation  - PriviledgedActionException as:fayson (auth:SIMPLE) cause:org.apache.hadoop.ipc.RemoteException(java.io.IOException): Delegation Token can be issued only with kerberos or web authentication
   at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getDelegationToken(FSNamesystem.java:7498)
   at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getDelegationToken(NameNodeRpcServer.java:548)
   at org.apache.hadoop.hdfs.server.namenode.AuthorizationProviderProxyClientProtocol.getDelegationToken(AuthorizationProviderProxyClientProtocol.java:663)
   at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getDelegationToken(ClientNamenodeProtocolServerSideTranslatorPB.java:981)
   at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
   at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
   at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
   at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2220)
   at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2216)
   at java.security.AccessController.doPrivileged(Native Method)
   at javax.security.auth.Subject.doAs(Subject.java:422)
   at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
   at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2214)
<<< Invocation of Sqoop command completed <<<

2.解决方法


在Kerberos环境下使用Oozie创建Sqoop抽取Hive表数据到MySQL的Action时出现“Delegation Token”异常,是一个已知的Bug,目前还没有修改,具体描述https://issues.apache.org/jira/browse/SQOOP-3177,可以使用如下替代方案实现:

1.如果使用的Hive中的parquet文件复制生成一份txt文件,使用如下命令进行Sqoop抽数

sqoop export 
  --connect jdbc:mysql://ip-172-31-22-86.ap-southeast-1.compute.internal:3306/test_db 
  --username testuser 
  --password password 
  --table mytest_parquet 
  --export-dir /data/mytest 
  --num-mappers 1  
  --input-fields-terminated-by @

2.编写Shell脚本,通过创建Ssh Action的Oozie工作流实现

[fayson@ip-172-31-22-86 ~]$ vim ssh-action.sh 
#!/bin/bash
kinit -kt fayson.keytab fayson

sqoop export 
   --connect jdbc:mysql://ip-172-31-22-86.ap-southeast-1.compute.internal:3306/test_db 
   --username testuser 
   --password password 
   --table mytest_parquet 
   --hcatalog-database default 
   --hcatalog-table mytest_parquet 
   --num-mappers 1

创建Ssh Action的Oozie工作流

提交Oozie工作流运行

查看MySQL中数据

3.总结


  • 在Kerberos环境下使用Oozie创建Sqoop抽取Hive表数据或抽数到Hive表会出现“delegation tokens”异常,目前是一个已知的Bug,具体参考:https://issues.apache.org/jira/browse/SQOOP-3177
  • 可以将Hive中的parquet文件复制生成一份txt文件,抽数时指定export-dir和input-fields-terminated-by参数,注意Sqoop目前不支持多分隔符。
  • 推荐将Sqoop抽数脚本封装在Shell脚本中,通过Hue创建Ssh Action的Oozie工作流来执行Sqoop作业。

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操