hadoop - hadoop mapreduce.partition.keypartitioner.options 不工作
问题描述
我只想对 key 的第一个字段与 reducer 相同的数据进行分区。
例如,[ 11 * * * ]
数据。但似乎keypartitioner
不起作用,我真的不知道为什么。
代码 run.sh 在这里--->
#!/usr/bin/sh
hadoop fs -rm -r /training/likang/tmp2
hadoop fs -rm /training/likang/tmp/testfile
hadoop fs -put testfile1 /training/likang/tmp/testfile
hadoop-streaming -D stream.map.output.field.separator="\t" \
-D stream.num.map.output.key.fields=2 \
-D map.output.key.field.separator="\t" \
-D mapreduce.partition.keypartitioner.options=-k1,1 \
-D mapreduce.job.maps=2 \
-D mapreduce.job.reduces=2 \
-D mapred.job.name="lk_filt_rid" \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-input /training/likang/tmp/testfile \
-output /training/likang/tmp2 \
-mapper "cat" -reducer "cat"
hadoop fs -cat /training/likang/tmp2/part-00000
echo "------------------"
hadoop fs -cat /training/likang/tmp2/part-00001
输入文件是 testfile1 --->
11 5 333 111
11 5 777 000
11 3 888 999
11 9 988 888
11 7 234 2342
11 5 4 4
15 9 230 134
12 8 232 834
15 77 220 000
15 33 256 399
11 5 999 888
15 9 222 111
14 88 372 233
15 9 66 77
11 5 821 221
11 0 11 11
15 0 22 22
12 0 33 33
14 0 44 44
结果就在这里,所有[ 11 * * * * ]
数据都没有发送到同一个减速器……有人知道为什么吗?谢谢你。
解决方案
现在我知道了,删除这一行很有用
-D map.output.key.field.separator="\t" \
删除此选项后,结果会是对的,但原因更加混乱。map.output.key.field.separator的默认值看起来只是一个Tab,但是我写到这里之后,就出错了......
推荐阅读
- python - tkinter 中的按钮 - 单击时:显示其背后的内容
- python - 为什么 Python 不从封闭变量范围切换到局部变量范围?
- python - Django 静态文件有时加载,有时不加载
- java - 在Java中排序后保留数组中元素的索引
- ruby-on-rails - Devise & Ruby on Rails:尝试登录时如何解决“已完成 401 未授权”
- php - 管理员限制页面未重定向到管理员登录页面 Laravel 7
- google-cloud-storage - 错误:blob.download_to_filename,返回一个空文件并引发错误
- javascript - . NgFor 仅支持绑定到可迭代对象,例如数组。任何身体帮助将不胜感激
- android - 验证电子邮件和电话号码和姓名
- php - 如何将选定的值从 select 传递到同一视图中的链接?