hive自定义mapred脚本运行机制分析

本文详细介绍了Hive中自定义MapReduce脚本的使用方法及其运行机制,并通过具体案例展示了如何正确配置Hive查询以实现特定的数据处理需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     1.  hive自定义mapred脚本运行机制

        1.1)HQL中使用自定义mapred脚本的语法格式及案例

语法格式:

FROM (
    FROM src
    MAP expression (',' expression)*
    (inRowFormat)?
    USING 'my_map_script'
    ( AS colName (',' colName)* )?
    (outRowFormat)? (outRecordReader)?
    ( clusterBy? | distributeBy? sortBy? ) src_alias
  )
  REDUCE expression (',' expression)*
    (inRowFormat)?
    USING 'my_reduce_script'
    ( AS colName (',' colName)* )?
    (outRowFormat)? (outRecordReader)?
 
  FROM (
    FROM src
    SELECT TRANSFORM '(' expression (',' expression)* ')'
    (inRowFormat)?
    USING 'my_map_script'
    ( AS colName (',' colName)* )?
    (outRowFormat)? (outRecordReader)?
    ( clusterBy? | distributeBy? sortBy? ) src_alias
  )
  SELECT TRANSFORM '(' expression (',' expression)* ')'
    (inRowFormat)? 
    USING 'my_reduce_script'
    ( AS colName (',' colName)* )?
    (outRowFormat)? (outRecordReader)?
HQL使用案例:

FROM (
  FROM pv_users
  MAP pv_users.userid, pv_users.date
  USING 'map_script'
  AS dt, uid
  CLUSTER BY dt) map_output
INSERT OVERWRITE TABLE pv_users_reduced
  REDUCE map_output.dt, map_output.uid
  USING 'reduce_script'
  AS date, count;
FROM (
  FROM pv_users
  SELECT TRANSFORM(pv_users.userid, pv_users.date)
  USING 'map_script'
  AS dt, uid
  CLUSTER BY dt) map_output
INSERT OVERWRITE TABLE pv_users_reduced
  SELECT TRANSFORM(map_output.dt, map_output.uid)
  USING 'reduce_script'
  AS date, count;
1.2)HIVE运行自定义mapred脚本的机制

MAP和REDUCE关键字都是SELECT TRANSFORM关键字的语法转换,也就是说:在使用MAP关键字时,自定义脚本不一定是在map阶段运行,使用REDUCE关键字时自定义脚本不一定是在red阶段运行;

可以参考如下案例:

#red.py 代码
#!/usr/bin/python
# coding=utf-8

import sys
import time
import traceback

sys.stderr.write("we are running at " + time.strftime("%Y-%m-%d %H:%M:%S") + "\n")

num = 10
i = 0

try:
    for l in sys.stdin:
        if i < num:
            print l[:-1]
            i += 1
except:
    traceback.print_exc(file=sys.stderr)

案例1:该HQL语句生成一个mapred Job,该Job只执行了map阶段,red数量为零;

FROM (
  FROM testhive
  MAP testhive.channel, testhive.pv
  USING '/bin/cat'
  AS dt, uid) map_output
REDUCE map_output.dt, map_output.uid
  USING '/bin/cat'
  AS date, count;
案例2:该HQL语句生成一个mapred Job,该Job只执行了map阶段,red数量为零;

FROM testhive
MAP testhive.channel, testhive.pv
USING 'red.py'
AS c, p;

FROM testhive
REDUCE testhive.channel, testhive.pv
USING 'red.py'
AS c, p;
案例3:该HQL语句生成一个mapred Job,该Job执行了map red阶段

FROM (
  FROM testhive
  MAP testhive.channel, testhive.pv
  USING 'red.py'
  AS dt, uid
  cluster By dt) map_output
REDUCE map_output.dt, map_output.uid
  USING 'red.py'
  AS date, count;

总结:HQL中嵌入自定义脚本时,自定义脚本的运行阶段取决于自定义脚本在HQL语句中的语法位置。也就是说,hive 在将hql语句翻译成mapred任务时,如果hql中存在group by、cluster by、sort by等需要reduce阶段的命令时,且MAP、REDUCE命令在上述命令之后,则自定义脚本运行在red端。

注意事项:如果是在windows上开发的mapred脚本,在提交到linux后最好先执行一下 dos2unix 命令,否则可能会出现错误:

hadoop mapred框架错误: 
java.io.IOException: Cannot run program "/data9/mapred/local/taskTracker/zhaoxiuxiang/jobcache/job_201311120949_47441/attempt_201311120949_47441_m_000003_2/work/././map.py": error=2, No such file or directory
本地错误:
-bash: ./map.py: /usr/bin/python^M: bad interpreter: No such file or directory


注意事项:使用下面的参数打开report和调试信息输出

stream.stderr.reporter.enabled=true
stream.stderr.reporter.prefix=reporter:











### Hive运行一段时间后崩溃的原因分析 Hive运行过程中可能出现崩溃的情况,通常由以下几个原因引起: #### 1. 笛卡尔积引发的数据膨胀 当执行 `JOIN` 操作时未提供有效的 `ON` 条件,或者条件无效,则可能导致笛卡尔积的发生。这种情况下,Hive可能仅使用单个 reducer 处理整个计算过程[^1]。对于大规模数据集而言,这会导致中间结果急剧增长,从而消耗大量内存资源并最终导致作业失败。 #### 2. 资源不足或配置不当 即使没有明显的逻辑错误,在某些场景下仍然可能发生OOM(Out Of Memory),这是因为分配给YARN容器的内存不足以支持当前查询所需的实际需求。此外,默认参数设置也可能不适合特定的工作负载特性;例如,如果启用了严格模式却忘记调整相应选项(像LIMIT子句),同样会引起性能瓶颈甚至程序终止[^2]. #### 3. Metastore数据库连接池问题 使用Oracle作为外部元存储服务端点之一时,若采用BONECP类型的连接管理器偶尔会出现诸如"No such lock..."之类的异常提示信息。这些问题通常是暂时性的网络延迟或者是事务超时所造成的。因此官方文档建议切换至另一种更为稳定的实现方式即DBCP来规避此类风险[^3]. ### 解决方案概述 针对以上提到的各种潜在隐患可以采取如下措施加以预防和缓解: - **优化SQL语句结构**: 确保所有的关联操作都有清晰明确的关系表达式定义, 避免不必要的全表扫描以及跨分区读取. - **合理规划资源配置**: 根据实际业务情况动态调节MapReduce任务的各项指标数值比如map/reduce数目、输入分片大小等等; 同样也要关注客户端提交脚本里关于堆栈空间限制方面的设定. - **启用适当的安全机制**: 如果确实有必要开启强制校验功能的话记得同步修改配套环境变量值(set hive.mapred.mode=strict), 并且遵循最佳实践指南补充必要的辅助指令如TOP N过滤等. - **更换合适的持久化框架组件**: 对于依赖关系型数据库保存元信息的应用来说考虑替换掉容易出现问题的那个版本号较低或是已知存在缺陷的产品组合形式. ```sql -- 示例:加入有效 ON 条件防止笛卡尔积 SELECT * FROM tableA a JOIN tableB b ON a.id = b.foreign_id; ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值