HUE 4.1 源码解读及修改兼容中国移动苏研BCH1.3.4集群适应BCID认证体系

            由于工作需要,近期快速的对HUE进行了一番改造和处理,由于公司为中国移动提供服务,使用中国移动江苏研究院(简称苏研)的BC-hadoop,导致以前可以用的HUE没法使用。而国人开发的软件,大家都懂的,可用性、可操作性、稳定性都很差。HUE在大数据领域来说,其界面简洁,操作方便快捷,尤其是其集成的beeswax,支持的hive查询工具,非常好用,4.1版本又增加了explan的分析窗口,自动语法填充,等等。好处就不多说了。

    首先声明,本人学习使用python总历程小时数不到100小时,python经验有限,如果后文有什么不妥的地方还请指出,感谢您的指点。

   这次事务比较紧急,因为种种原因,不得已需要快速整合HUE与苏研的BC hadoop进行集成,以满足我们对HDFS文件浏览、hive查询、mysql库查询、job任务查看。我大概用了10工作日的时间,从0开始编译hue,了解hue的框架结构,代码组织,看python的源代码,找到核心位置,来兼容苏研的hadoop产品的BCID认证机制。

   首先说一说HUE工程的结构,如下所示。hue是基于Django 1.6框架的B/S应用,其主工程框架在desktop中,而其中的应用比如beeswax、rdbms、jobbrowser等等应用组件都在apps目录下,工程符合django的大型工程组织架构方案。hue的前端界面使用的是Bootstrap前端框架,结合 Knockout.js 和jQuery 。其工程体系中没有使用Django原生的页面模板机制,而是使用了mako模板体系,以便能够快速实现应用。so,可以看到HUE的一切,都是快、效率、快、更快。之后对其代码框架的探究,更加证明了这一点。

            

    目录: H:\Bigdata材料\hue-master


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2017-12-15     00:29                apps
d-----       2017-12-15     00:29                desktop
d-----       2017-12-15     00:29                dist
d-----       2017-12-15     00:29                docs
d-----       2017-12-15     00:29                ext
d-----       2017-12-15     00:29                maven
d-----       2017-12-15     00:30                tools
------       2017-12-13     23:03             96 .coveragerc
------       2017-12-13     23:03             25 .gitattributes
------       2017-12-13     23:03           1518 .gitignore
------       2017-12-13     23:03             12 data
------       2017-12-13     23:03           9686 Gruntfile.js
------       2017-12-13     23:03          11349 LICENSE.txt
------       2017-12-13     23:03           9489 Makefile
------       2017-12-13     23:03           8505 Makefile.sdk
------       2017-12-13     23:03           3138 Makefile.tarball
------       2017-12-13     23:03           3705 Makefile.vars
------       2017-12-13     23:03           2302 Makefile.vars.priv
------       2017-12-13     23:03            894 NOTICE.txt
------       2017-12-13     23:03           1504 package.json
------       2017-12-13     23:03           3750 README.md
------       2017-12-13     23:03            932 VERSION
------       2017-12-13     23:03           3144 webpack.config.js

知道工程结构之后,本人简单了解了一下Django的开发原理,了解知道urls.py的作用。以多年的开发经验来说,个人认为,此物必然是设计精妙的,为了不破坏hue本身的架构,又适应BCID的认证机制,做如下改造:

1、   首先要适应hive查询,将hive server2的相关信息配置到hue.ini之后,发现报错,说thrift接口连接认证失败。根据异常日志,很快定位到apps/beeswax/src/beeswax/server/hive_server2_lib.py文件就是实现链接的工具类。然后对此类进行研读,最后确定最佳的添加位置是在open_session 方法内,增加BCID key的认证配置。一番修改之后,一测,直接调通。hive顺利整合完毕。但是暴力的将BCID 和BCKEY写在工具类里,是对HUE工程的玷污,也是对创作者的玷污。于是就查看了HUE加载hue.ini形成配置类的方法。python的封装机制还是非常好的很好用。将需要增加认证参数的位置,修改如下 红字部分:

  def open_session(self, user):

    self.user = user

    kwargs = {

        'client_protocol': beeswax_conf.THRIFT_VERSION.get() - 1,

        'username': user.username, # If SASL or LDAP, it gets the username from the authentication mechanism" since

it dependents on it.

        'configuration': {},

    }

    if self.impersonation_enabled:

      kwargs.update({'username': DEFAULT_USER})

      if self.query_server['server_name'] == 'impala': # Only when Impala accepts it

        kwargs['configuration'].update({'impala.doas.user': user.username})

    if self.query_server['server_name'] == 'beeswax': # All the time

      kwargs['configuration'].update({'hive.server2.proxy.user': user.username})

      

      kwargs['configuration'].update({'set:hiveconf:hadoop.security.bdoc.access.id' : beeswax_conf.HIVE_BDOC_BCID.get()})

   kwargs['configuration'].update({'set:hiveconf:hadoop.security.bdoc.access.key':beeswax_conf. HIVE_BDOC_BCKEY.get()})

      kwargs['configuration'].update({'set:hiveconf:mapreduce.job.queuename' : beeswax_conf. HIVE_BDOC_JOB_QUEUENAME.get()})

    if self.query_server['server_name'] == 'sparksql': # All the time

      kwargs['configuration'].update({'hive.server2.proxy.user': user.username})

    if self.query_server['server_name'] == 'impala' and self.query_server['SESSION_TIMEOUT_S'] > 0:

      kwargs['configuration'].update({'idle_session_timeout': str(self.query_server['SESSION_TIMEOUT_S'])})

在apps/beeswax/src/beeswax/conf.py配置文件中增加相关配置项(红字部分)

HIVE_SERVER_PORT = Config(

  key="hive_server_port",

  help=_t("Configure the port the HiveServer2 server runs on."),

  default=10000,

  type=int)

HIVE_BDOC_BCID = Config(

  key='hive_bdoc_bcid',

  help=_t('BDOC hive  BCID'),

  default="")

HIVE_BDOC_BCKEY = Config(

  key='hive_bdoc_bckey',

  help=_t('BDOC hive BCKEY'),

  default="")

HIVE_BDOC_JOB_QUEUENAME = Config(

  key='hive_bdoc_job_queuename',

  help=_t('BDOC hive yarn job queuename'),

  default="")

然后在hue.ini中 hive配置部分增加HIVE_BDOC_BCID,HIVE_BDOC_BCKEY,HIVE_BDOC_JOB_QUEUENAME三个键值和对应的信息,beeswax就

可以顺利的读取到hue.ini的配置信息了。是不是很简单呢?优良的框架设计就是这样为以后的修改带来无限的便利和高效。

ok,hive调试大功告成,由于安全因素,读写的是生产系统数据,因此hue 的hive查询整合BC hadoop的截图不可以放出给大家

欣赏了。

接下来继续,对filebrowse进行整合,由于安全审查要求,整个集群启动了连接认证,连接中必须传入用户名,以及相应的认证参数。首先发现配置文件里这个default_user会用在很多地方,经过考虑,还是填成BCID对应的当前工具客户的多租户用户名。比如hdfs浏览,yarn资源管理的restfull api调用都会传这个参数。所以最好的办法是这个default_user就填成BC hadoop的OP多租户管理器中,给租户分配的用户名。如下图所示:

    

苏研的集群为了安全检查,对http服务加了简单安全验证,就是url参数里必须带user.name=XXXXXX(你那里的认证信息)

所以为了兼容api访问,对这个路径(/app/hue-master/desktop/libs/hadoop/src/hadoop/yarn)下的文件需要修改,找到_get_params方法,在里面增加user.name的设置。为了不破坏hue本身对kb的支持,所以应该增加在doAs那行IF的之前。具体如截图:

/app/hue-master/desktop/libs/hadoop/src/hadoop/yarn

resource_manager_api.py

history_server_api.py

至此hue的hive查询,filebrowse、jobbrowser,就全部兼容完成,可以正常访问苏研的平台。

接下来,我们自己的应用还有mysql配置库,为了方便管理,需要将mysql的查询也集成进入。这个比较简单,按照官方文档或者百度的帖子,直接增加在RDBMS配置单元下,填好mysql的信息即可。但是遇到了问题,进入mysql之后,查询sql语句里有中文就会报错('latin-1' codec can't encode characters in position  ……)。并且查询的数据中如果有中文就会显示为一堆问号的乱码。后者问题,在配置单元的options属性给值 { "init_command":"SET NAMES `utf8`"}中文显示问题即可解决。但是没法解决mysql查询时sql里有中文时报错 'latin-1' codec can't encode characters in position 的问题。

继续追查,发现mysql的连接用的python的MySQLdb库,之后确定问题的关键是在desktop\libs\librdbms\src\librdbms\server\mysql_lib.py 工具类的实现里。找到如下图2个方法的位置,增加红框中的语句。前者问题也即解决。注意mysql库使用的全部是utf-8编码。gbk编码不适用。对于gbk编码的问题,我个人的建议是,这个是中国人搞出来的玩意,在大数据和全球化的时代,说实话格格不入,到处都会遇到问题,如果你看此文是技术主管,那么最好尽早让全系统使用utf-8编码,改的越早痛苦越小,越晚苦逼的问题越多。

至此,hue的快速源码解读和针对本次兼容BC hadoop的目标任务大功告成。对hue的源代码其实读了很多,最终修改的却很少很少。在读hue源码的过程中,依旧还是觉得老外做东西做的认真、精良,有节操,有情怀。hue的框架真心是比较美的,值得花时间去学习。

做完本次修改之后,我已在了解Django的开发、mako模板的书写、Bootstrap框架的使用,hue使用Django,Django是MVC模式的框架,而python的代码依旧是灰常的简洁。这一点在我写爬虫脚本,完成自己的每天的各种论坛签到时就已经发现了~~~python是很不错的。回看我自己的博客,我发现刚工作的第二年,那时候python才刚开始在美国流行的时候,我其实曾经追逐过一段时间,还尝试翻译了几篇它的doc。但是当时工作用java,国内毕竟还是落后很多年,这一晃有10年了,由于各种原因,我正在研究数据分析,使用pandas、numpy、TensorFlow等等,这些都是python的杰作。就凭这些年的直觉而言,python开发人员很快会在国内席卷软件领域,因为它的编码量真是太低了!同样的功能,java往往要写几倍量的代码。另外python非常简洁、易懂、易用,很多非专业的其它行业的人员也能够使用,这才是真正的挑战,跨界程序员,带着满满的行业知识,用python传达给机器,不再有一层公司、合同或者产品经理、开发夹在中间,可想而知,以后的业务类行业类软件,可能会迎来一次颠覆!

写此文,赞叹本人技术依旧宝刀未老,这么多年之后,对陌生技术、语言、工程体系的掌握速度依旧像海绵吸水一样的高速而高效。同时也希望能够警醒正在看此文的开发人员,让自己变得专业,更强,更快,让自己写的程序更智能,更加的具备学习能力,这是技术路线上的生存法宝,准备迎接跨界的洗礼和挑战吧~~~而本人正带着一帮非计算机专业的跨界程序开发人员,席卷未来……


 

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值