ruby - hadoop流,如何设置分区?

标签 ruby hadoop hadoop-streaming hadoop-partitioning

我是 hadoop 流的新手,在分区方面遇到了一些困难。

根据在一行中找到的内容,我的映射器函数要么返回

key1, 0, somegeneralvalues # some kind of "header" line where linetype = 0

key1, 1, value1, value2, othervalues... # "data" line, different values, linetype =1

为了正确减少,我需要将具有相同 key1 的所有行分组,并按值 1、值 2 和线型(0 或 1)对它们进行排序,例如:

1 0 foo bar...  # header first
1 1 888 999.... # data line, with lower value1
1 1 999 111.... # a few datalines may follow. Sort by value1,value2 should be performed
------------    #possible partition here, and only here in this example
2 0 baz foobar....   
2 1 123 888... 
2 1 123 999...
2 1 456 111...  

有没有办法确保这样的分区?到目前为止,我已经尝试使用诸如

-partitioner,'org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner'
-D stream.num.map.output.key.fields=4 # please use 4 fields to sort data
-D mapred.text.key.partitioner.options=-k1,1 # please make partitions based on first key

或者替代地

-D num.key.fields.for.partition=1 # Seriously, please group by key1 !

这只会带来愤怒和绝望。

如果值得一提的话,如果我使用 cat 数据 | 我的脚本可以正常工作 |映射器 |排序 |减少 我正在使用 amazon elastic map reduce ruby​​ 客户端,所以我用

传递选项
--arg '-D','options' for the ruby script.

任何帮助将不胜感激!提前致谢

最佳答案

感谢 ryanbwork 我已经能够解决这个问题。耶!

正确的想法确实是创建一个由值串联组成的键。更进一步,还可以创建一个看起来像这样的 key

<'1.0.foo.bar', {'0','foo','bar'}>
<'1.1.888.999', {'1','888','999'}>

然后可以将选项传递给 hadoop,以便它可以按键的第一“部分”进行分区。如果我没有误解的话,它看起来像

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartioner
-D stream.map.output.field.separator=. # I added some "." in the key
-D stream.num.map.output.key.fields=4  # 4 "sub-fields" are used to sort
-D num.key.fields.for.partition=1      # only one field is used to partition

这个解决方案,基于 ryanbwork 所说的,允许创建更多的 reducer,同时确保数据被正确分割和排序。

关于ruby - hadoop流,如何设置分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572200/

相关文章:

ios - Formotion 推广 RubyMotion

hadoop - 为什么 Mapper 接口(interface)在新 API 中改为 Class?

python - 使用 yarn 比较器在 MapReduce Python 中进行字数统计排序

java - Hadoop Map任务/Map对象

ruby-on-rails - 在 Ruby 中从 AWS S3 中仅检索文件名

ruby-on-rails - Rails ActionView::Template::Error 未定义方法 `count' 解析器

windows - 抛出异常:System.Core.dll中的 'System.InvalidOperationException'

apache-spark - 如何避免 Lambda 架构中的代码冗余?

Hadoop MapReduce 作业输入文件 ClassNotFound

Ruby 字符串拆分为多个字符