当前位置:   article > 正文

Hadoop Mapreduce 一些常见问题 (python用户~~)_mapreduce运行没输出

mapreduce运行没输出

1 啥是mapreduce

2 基本用法

3 Hadoop一些常用技巧

3.1 lzo压缩文件作为输入或者输出

处理文件较大时候,我们一般会对文件进行压缩,有时候需要输入或者输出为压缩文件格式。
当输入为lzo格式时候需要加入参数:

-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat
  • 1

注意的是在hadoop中使用lzo的话,偏移位需要加1。

当需要输出一个压缩文件的时候加入参数:

-jobconf mapred.output.compress=true 
-jobconf mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec
  • 1
  • 2

3.2 自定义renduce方向

有时候我们数据量太大,设计一个reduce就会执行很慢很慢(几个小时),但是我们如果改为多个reduce,比如10个,在分数据的时候就会随机分,这样就不能实现全局排序,咋办呢??
如果我们知道数据的一个大致分布,就可以设计一个if else组合去根据数据的值分给reduce模块。

方法:只需要在map输出数据加一列给shuffle就可以,加一个参数选择reduce参考的列:

-jobconf num.key.fields.for.partition=1
  • 1

同时你要选定一下,sort参考的列:

-jobconf stream.num.map.output.key.fields=2 
  • 1

这里还要加一个必备插件:

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
  • 1

3.3 按数字方式排序

默认hadoop是按照字符方式排序
这里我们可以改为数字方式排序

-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D mapred.text.key.comparator.options=-n \
  • 1
  • 2

这里-n代表数字方式排序,从小到大,如果你想从大到小,可以自己写一个做差的方法。

3.4

    -D mapreduce.reduce.shuffle.input.buffer.percent=0.12\
    -D mapreduce.job.reduce.slowstart.completedmaps=0.95\
  • 1
  • 2

4报错

4.1 错误代码1

语法错误,code为1就是语法错误~~自己线下测试下,可能是hadoop上没有你调用的包。

4.2 提示超时

出现以下错误:

Timed out after 600 secs
  • 1

大概意思就是超时了,mapreduce长时间没有输出东西,或者读入下一行信息,可能有以下原因:
1、逻辑错误,出现死循环,导致一直没有输出或者返回~~~
2、mapreduce脚本里有预处理数据,比如需要加载一些文件,加载这些文件时超时了,这个简单,可以通过改变参数mapreduce.task.timeout即可。
注意单位是毫秒(1200000为1200s)

-D mapreduce.task.timeout=1200000\
  • 1

4.3 内存不够

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.
  • 1

内存设置不足,看看是map失败还是red失败,我red设置的是4GB,这样的话改高一点就行了。

4.4 error in shuffle in fetcher#3

Error: org.apache.hadoop.mapreduce.task.reduce.Shuffle$ShuffleError: error in shuffle in fetcher#3
at org.apache.hadoop.mapreduce.task.reduce.Shuffle.run(Shuffle.java:134)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:376)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

几种解决方法:
1、改reduce数量
把reduce设计的大一些…一般就可以了
2、限制shuffle 比例
*-D mapreduce.reduce.shuffle.memory.limit.percent=0.15 *
3、增加combinear
-combiner red_site_doc.py \

4.5 断开的管道

可能内存满了
(https://img-blog.csdnimg.cn/6296f5a6f9cb49f181ba8c7a85811050.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ2xvdWRDdmVy,size_20,color_FFFFFF,t_70,g_se,x_16)

清除一下内存空间把
hadoop fs rmr -rmTrash /user/authrank_offline_z/.Trash/*

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/976669
推荐阅读
相关标签
  

闽ICP备14008679号