hue是一个Apache基金会下的一个开源图形化管理工具,使用python语言开发,使用的框架是Django。而sqoop也是Apache的一个开源工具,是使用Java语言开发,主要用于进行hdfs和传统关系型数据库之间的数据传递。这两天在整合这两个工具的时候,遇到了一个问题,特此记录。

Hue版本是3.9.0,Sqoop版本是1.99.6,也就是最新版的Sqoop2。

把Hue和Sqoop安装好后,修改Hue配置文件,hue-3.9.0/desktop/conf/hue.ini

找到Sqoop的配置项:把sqoop的请求路径改成正式的URL。

# Sqoop server URL
server_url=http://ip:12000/sqoop

启动Hue、Sqoop,在Hue的管理页面中,可以新建、修改Sqoop的链接。但是在新建Sqoop的任务却报了错。

查看Sqoop的日志:sqoop-1.99.6-bin-hadoop200/server/logs/catalina.out

发现报了空指针异常:

java.lang.NullPointerException
at org.apache.sqoop.json.util.ConfigInputSerialization.restoreConfig(ConfigInputSerialization.java:160)
at org.apache.sqoop.json.util.ConfigInputSerialization.restoreConfigList(ConfigInputSerialization.java:129)
at org.apache.sqoop.json.JobBean.restoreJob(JobBean.java:179)
at org.apache.sqoop.json.JobBean.restore(JobBean.java:159)
at org.apache.sqoop.handler.JobRequestHandler.createUpdateJob(JobRequestHandler.java:169)
at org.apache.sqoop.handler.JobRequestHandler.handleEvent(JobRequestHandler.java:106)
org.apache.sqoop.server.v1.JobServlet.handlePostRequest(JobServlet.java:91)
at org.apache.sqoop.server.SqoopProtocolServlet.doPost(SqoopProtocolServlet.java:63)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.hadoop.security.authentication.server.Authentication

找来Sqoop的源码,看到:

    for (int i = 0; i < inputs.size(); i++) {
JSONObject input = (JSONObject) inputs.get(i);
MInputType type = MInputType.valueOf((String) input.get(ConfigInputConstants.CONFIG_INPUT_TYPE));
// 省略部分代码
.......
switch (type) {
case STRING: {
// 报错位置
long size = (Long) input.get(ConfigInputConstants.CONFIG_INPUT_SIZE);
mInput = new MStringInput(name, sensitive.booleanValue(), editable, overrides, (short) size);
break;
}
// 省略部分代码
........
}
ConfigInputConstants.CONFIG_INPUT_SIZE 是字符串常量“size”,看这个代码是在获取“size”的值的时候为空,null强转为Long类型的时候报错了。再根据报错信息往前看看JobBean类,这是在加载Hue传递过来的json数据,并设置到JobBean类中,下面是获取“from-config-values”的数据,也就是来源链接的相关信息了。
.......
static final String FROM_CONFIG_VALUES = "from-config-values";
......
private MJob restoreJob(Object obj) {
//省略部分代码
......
JSONArray fromConfigJson = (JSONArray) object.get(FROM_CONFIG_VALUES);
//省略部分代码
......
// 报错点
List<MConfig> fromConfig = restoreConfigList(fromConfigJson); //省略部分代码
......
}

 从上面分析看来,是Hue传递过来的from链接配置项,即“from-config-values”项没有“size”字段或者获取到的数据为空造成这个错误的。

而Sqoop关于这个接口的API:https://sqoop.apache.org/docs/1.99.3/RESTAPI.html#v1-job-post-create-job,给出的json格式是要求有“size”字段的。
//省略部分
......
from-config-values: [
{
id: 2,
inputs: [
{
id: 2,
name: "fromJobConfig.inputDirectory",
value: "hdfs%3A%2F%2Fvbsqoop-1.ent.cloudera.com%3A8020%2Fuser%2Froot%2Fjob1",
type: "STRING",
size: 255,
sensitive: false
}
],
name: "fromJobConfig",
type: "JOB"
}
],
//省略部分
......

 来分析Hue是怎么使用这个接口的:hue-3.9.0/apps/sqoop/src/sqoop/api/job.py

 

@never_cache
def create_job(request):
# 省略部分代码
...... d = json.loads(smart_str(request.POST['job']))
job = client.Job.from_dict(d) try:
c = client.SqoopClient(conf.SERVER_URL.get(), request.user.username, request.LANGUAGE_CODE)
response['job'] = c.create_job(job).to_dict()
except RestException, e:
response.update(handle_rest_exception(e, _('Could not create job.')))
except SqoopException, e:
response['status'] = 100
response['errors'] = e.to_dict()
return JsonResponse(response)

最后看到了Hue对size进行了过滤处理:hue-3.9.0/apps/sqoop/src/sqoop/client/config.py

  def to_dict(self):
d = {
'id': self.id,
'type': self.type,
'name': self.name,
'sensitive': self.sensitive,
}
if self.value:
d['value'] = self.value
if self.size != -1:
d['size'] = self.size
if self.values:
d['values'] = ','.join(self.values)
return d

Hue把size=-1的情况全部设置成空,然后Sqoop获取不到size的值,报了一个NullPointerException。

解决方法:修改config.py的to_dict方法,把size的过滤操作去掉就好了,如下:

  def to_dict(self):
d = {
'id': self.id,
'type': self.type,
'name': self.name,
'sensitive': self.sensitive,
}
if self.value:
d['value'] = self.value
d['size'] = self.size
if self.values:
d['values'] = ','.join(self.values)
return d

如果这里把size设置成一个常量,那么可能会造成一个org.apache.sqoop.server.common.ServerError错误,其实就是Sqoop根据Hue传递过来的参数获取到的来源链接、目的链接

或者是驱动配置跟Sqoop的不一致造成的。

Hue整合Sqoop报空指针异常的解决方法的更多相关文章

  1. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

  2. asp.net MVC webservice 报次错解决方法

    asp.net  MVC  webservice  报次错解决方法: 解决方法: 在 RouteConfig.cs public static void RegisterRoutes(RouteCol ...

  3. 网站eurl.axd报错的解决方法

    网站eurl.axd报错的解决方法 错误发生的原因是当ASP.NET检测到Web站点配置为使用ASP.NET 4.0,本地ASP.NET 4.0 的组件会传递一个不能扩展的 URL到ASP.NET的管 ...

  4. SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法

    使用SpringMVC开发的时候,页面如果有日期格式的数据,后台接受也是java.util.Date,则报告400错误 .下面是解决方案的演示示例: 这个是实体类,里面createDate就是java ...

  5. MySQL中遇到的几种报错及其解决方法

    MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...

  6. vue项目初始化时npm run dev报错webpack-dev-server解决方法

    vue项目初始化时npm run dev报错webpack-dev-server解决方法 原因:这是新版webpack存在的BUG,卸载现有的新版本webpack,装老版本就好webpack-dev- ...

  7. OSS设置CORS规则以后还是报No 'Access-Control-Allow-Origin'解决方法

    OSS设置CORS规则以后还是报No 'Access-Control-Allow-Origin'解决方法 在OSS控制台设置了CORS规则以后,通过JS程序去调用的时候报No 'Access-Cont ...

  8. Vue 项目在其他电脑 npm run dev 运行报错的解决方法

    一个 Vue 项目从一台电脑上传到 github 上之后,再另外一台电脑上 git clone .并使用 npm run dev 或 npm run start 发生以下报错的解决方法.   报错原因 ...

  9. 如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法

    如何自定义JSTL标签 1.创建一个类,从SimpleTagSupport继承 A) 通过继承可以获得当前JSP页面上的对象,如JspContext I) 实际上可以强转为PageContext II ...

随机推荐

  1. chop函数

    chop() 函数从字符串的末端开始删除空白字符或其他预定义字符. chop(string,charlist) 参数 描述 string 必需.规定要转换的字符串. charlist 可选.规定从字符 ...

  2. Linux内核分析——跟踪分析Linux内核的启动过程

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 实验部分 menu程序: cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...

  3. Python 基礎 - bytes數據類型

    三元運算 什麼是三元運算?請看下圖說明 透過上圖說明後,可以得出一個三元運算公式: result = 值1 if 條件 else 值2, 如果鯈件為真: result = 值1 如果鯈件為假: res ...

  4. Opencv创建有滚动条的视频

    #include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "hi ...

  5. 【转载】非线性分析中的ansys跟踪显示

    原文地址:http://muchong.com/html/201209/4936556.html 在ansys output windows 有 force convergenge valu 值 和 ...

  6. [转载]BT656/BT601/BT1120协议

     [转载] BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明   ITU-R BT.601和ITU-RBT.656国际电信联盟(Interna ...

  7. 如何让WordPress支持上传更多文件类型

    如何让WordPress支持上传更多文件类型   可以在functions.php中这样写: 1 2 3 4 5 6 7 8 9 add_filter('upload_mimes', 'wpdit_f ...

  8. Fragment使用findFragmentById返回null

    @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn1: replaceFragment(new Anot ...

  9. windows 下部署kafka 日记 转

    windows 下部署kafka 日记 转一.下载去apache 的官网(http://kafka.apache.org/downloads.html)下载最新的二进制版的压缩包.目前的最新版本是ka ...

  10. js监听rem实现响应式

    原文链接:http://caibaojian.com/web-app-rem.html (function (doc, win) { var docEl = doc.documentElement, ...