实战hadoop海量数据处理系列02: hql执行工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/titer1/article/details/72897514

实战hadoop海量数据处理系列02: hql执行工具

本文假设读者已经按照范老师的书搭建好了eclipse环境,并且已经导入myBi文件夹下面的子工程。

在阅读本文前,强烈建议阅读原书“实现数据分析工具模块”章节。

本文的代码同步于https://github.com/titer1/Play_HadoopFelix

ps:由于图床网络问题,本文的图显示不正常,所以请看不到图的小伙伴稍安勿躁,我会后续跟进处理,想了解原图的,可以在本文下面留言。

1 原理图


对比数据导入章节的结构图,你会发现本章原理类似,先解析xml,然后触发命令。

2 核心代码

首先理解xml文件,然后看相关的解析程序及hql执行逻辑。
这里仅列出作者详细注释的hql_exe.hql, 有兴趣的读者可以阅读加深并理解。

from com.cal.Basic import BasicCalculate
from com.util.pro_env import *
from xml.etree import ElementTree as ET
from com.util.hive import HiveUtils



#question1 parameter
#question2 xml not found ,hivejob.xml ?
#quesiton3  BasicCalculate from  com.cal.Basic 

#class CalQuery(BasicCalculate):   
class CalQuery():   
    def __init__(self):
        '''
        Constructor
        ''' 
    def resolveTheConf(self):
        #获得配置文件名
        #66: create xml as format
        confFile = PROJECT_CONF_DIR + "Query.xml"


        #解析配置文件
        xmlTree = ET.parse(confFile)
        #获得pras元素
        eles = xmlTree.findall('./pras')

        pras = eles[0]

        #遍历pras的子元素,获得所需参数
        for pra in pras.getchildren():
            #获得hql标签的值
            if pra.tag == 'hql':
                self.hql = pra.text.strip()
            #获得output标签的值     
            if pra.tag == 'output':
                self.output = pra.text.strip()
            #获得filepath标签的值
            if pra.tag == 'filepath':
                self.filepath = pra.text.strip()

        #检查参数有效性,无效则抛出异常       
        if len(self.hql) == 0 or self.hql == "" or self.hql == None:
            raise Exception('参数有误,终止运行')

        #检查参数有效性,无效则抛出异常 
        if len(self.output) == 0 or self.output == "" or self.output == None:
            raise Exception(' 参数有误,终止运行')

        #检查参数有效性,无效则抛出异常 
        if self.output == 'true' and (len(self.filepath) == 0 or self.filepath == "" or self.filepath == None):
            raise Exception('参数有误,终止运行')

    def executeQueryTask(self):

        #debug hql by debugger
        print self.hql

        #如果需要输出
        if(self.output == 'true'):
            HiveUtils.execute_shell(self.hql, True, self.filepath)
        #如果不需要输出
        else :
            HiveUtils.execute_shell(self.hql)

    def calculate(self):

        try:
            #解析配置文件,获取运行参数
            self.resolveTheConf()
        except Exception:
            print "运行参数有误,中断执行"
            return

        #执行查询任务
        self.executeQueryTask();



if __name__ == '__main__':

    aa = CalQuery()  #direct run will trigger error here
    #aa.resolveTheConf()
    aa.calculate()

    #done ,配置好了 Query.xml就可以运行,期中输出路径必须设置

    pass

3 运行结果:windows模拟端

有图有真相,环境配置和运行细节见图,图时间长度不到1分钟

4 运行结果:centos

工具已经移动到linux, 非常方便,有兴趣的朋友可以在以下链接详细了解

番外篇: 在linux上使用hql执行工具

5 小节

时间很快,就到了本系列的第二篇文章,从另外一个角度理解数据仓库工具的xml解析和查询命令的触发过程。

6 后记

至此,程序都可以在windows模拟端和linux真机上进行,如果有了数据库和hive,理解将会更加贴切,下面一节将会详细展开。

展开阅读全文

没有更多推荐了,返回首页