实战hadoop海量数据处理系列02 番外篇: 在linux上使用hql执行工具 | hive排错记录

本文主要是介绍实战hadoop海量数据处理系列02 番外篇: 在linux上使用hql执行工具 | hive排错记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实战hadoop海量数据处理系列02 番外篇: 在linux上使用hql执行工具 | hive排错记录

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

在阅读本文前,强烈建议阅读原书“实现数据分析工具模块”章节和本人博客系列之实战hadoop海量数据处理系列02: hql执行工具

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

目标

目标确保python封装hql执行工具在Linux上面能够正常运行。

大纲

  • 准备工作
  • python开发遇到的问题
  • map reduce排除故障的思考
  • hql工具在linux运行的情况
  • 其他关于整个项目部署的阶段思考
    读者朋友可以根据自己的需要选择阅读,希望开卷有益。

1 准备工作

环境依赖上, 只需要hive正常安装,并且hive数据仓库有至少一个数据库。所以读者朋友不一定使用我们前面章节的Orders表等。

确定数据库后,就可以将自己需要的相关Hql语句放在工程的Query.xml里面

1.1 相关脚本的跨平台支持

  • 环境相关的变量全部要做跨平台的支持。这里就要更新之前的pro_env.py
windows下面的文件路径和linux下面是不一致的,文件路径中的分割符也是不一致的。
  • 匹配python软件包的搜索策略
windows平台下软件包被eclipse进行托管,不用担心;
但是linux,需要显示的告诉解释器包在哪儿,这里主要的改动就是在查询主函数hql_exe.py
  • python脚本的修改尽量在linux上进行
开发过程中,遇到python脚本格式的问题。
从windows的文本编辑器Notepad++中看,没有任何问题,但是linux上面就是报格式问题。
折腾半小时后,用vi查看对应脚本,果然是windows上面的对齐在linux下没有生效。
一句话,跨平台编写Python脚本,选好编辑器是第一步

2 python脚本排错插曲

在windows上模拟端运行好好的python程序,在Linux命令行下面不一定正常使用。
幸好python调试器很容易上手,调试的命令和gdb没有大的差异,这帮了我很大的忙。
此时懂Python调试将会帮上很大的忙。在这个项目中,我遇到如下问题

  • 2.1 包找不到
这里细节已经说明,就是要把当前工程路径加入Python搜索的路径中,解决方法如下:
sys.path.append(os.path.abspath('../../'))
  • 2.2 xml配置文件找不到
这是一个非常基本的问题,在执行完hive命令后,告知脚本找不到,路径关键词含有hivebin,我在本工程文件夹和hive配置文件夹寻找,都没有找到。差不多一个小时后,发现xml文件路径是代码合成的,问题出在路径拼接环节,原始字符串有问题。根本原因是环境配置的变量没有及时更新。所以细心的准备环境是很有必要的。
  • 2.3 在xml配置文件找不到时,返回乱码的异常提示
简单来说是编码问题,源于初始代码中的异常是中文写的,即使在python2代码显式说明utf8编码,依然无效,。当前这个问题还没有解决,我暂时把异常说明更新为英文,读者朋友有好的建议,可以留言告知。
  • 2.4 没有报错,但是一直没有结果输出
原始代码,使用命令封装函数执行hive执行,封装命令使用了终端静默模式(-S)。为了调试,我打开了静默模式,但是依然没有任何改进

在确认问题不是Python引起后,我把目光转移到map reduce上面

2 map reduce 排错插曲

现象是本工具中执行 select count(*) from users特别的慢,一直没有输出。

2.1尝试直接在hive命令行中执行

问题和python触发执行时一样,排除是python工具问题,在Hive的命令行输出只看到reducer数目的分配,看不到其他下文

更多思考
其实hive在0.13版本后,所有的job日志都放在 /tmp/root/hive.log,关于task运行异常的细节可以在此查看。

2.2 尝试运行hadoop经典列子wordcount

先看下错误现象

ERROR [main]: ql.Driver (SessionState.java:printError(569)) - FAILED: Execut        ion Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exce        ption: java.net.ConnectException Call From sparkproject1/192.168.18.107 to sparkproject1:9000 failed         on connection exception: java.net.ConnectException: Connection refused; For more details see:  http        ://wiki.apache.org/hadoop/ConnectionRefused)

故障现象更近一步,从命令行log中看到driver不断的去连接某服务器,但是没有结果。细心一看,而该服务器对应的ip不是我期望的,问题出现眉目,原来host文件没有随网络环境进行更新。

在更新host文件后,依然没有触发任务,此时报连接resource manager错误,ip是正常的。

我忽然想到yarn服务没有启动。

在重启hadoop和启动yarn服务后,任务得到期望执行。

3 运行情况

[root@sparkproject1 cal]# python exe_hql.linux.py 
success
['17/06/09 09:27:45 WARN conf.HiveConf: DEPRECATED: hive.metastore.ds.retry.* no longer has any effect.  Use hive.hmshandler.retry.* instead', '1\tstr1', '2\tstr2', '3\tstr3', '3\tstr31', '3\tstr33', '4\tstr41', '4\tstr42']

问题的输出很简洁,需要了解详情的读者,请直接取最新的代码。

1分钟运行动态图

4 其他的心得

这里心得不仅仅在本章,也有前章数据库的设计上

4.1 代码异常方面

初期的代码中队所有的异常没有进行分类,导致一出错,不能快速定位

4.2 更新随机生成数据集的方法

随机数其实可以展开为取到随机不重复的值,取到某区间的随机值。
之前生成能实现的方法不是特别适合我们当前的环境,最好随机力度是以天为单位,新版本函数已经得到更新

4.3 存储过程很容易掉进过期的坑

过期的存储往往会打乱开发节凑,不知道有没有好的规避方法

4.4 数据维护方面

每一次删除Orders表,由于存在外键依赖,如果不接触外键检查的选项,系统会提示删除失败。
多trucate表,而不是drop后重建,尽量避免数据损失。

4.5 本地Mysql数据库的远程访问

记得为远程用户提供权限访问。访问。问。

小结

这是一篇记录排除bug的博文,读者可以根据兴趣选择章节查看。谢谢

这篇关于实战hadoop海量数据处理系列02 番外篇: 在linux上使用hql执行工具 | hive排错记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894384

相关文章

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序