我必须对输入数据执行某些操作,并使用mapreduce程序将其写入hdfs。我的输入数据看起来
abc
some data
some data
some data
def
other data
other data
other data
并以同样的方式继续,其中abc
、def
是标头,some data
是带制表符空间的记录。
我的任务是消除标题并将其附加到下面的记录中,如
some data abc
some data abc
some data abc
other data def
other data def
other data def
每个标头将有50个记录。
我使用的是默认的记录读取器,所以它一次读取每一行。
现在,我的问题是,我如何知道映射函数已经被调用了第九次?我有什么柜台可以知道吗?这样,我就可以使用该计数器将标题追加到字符串中,如
if (counter % 50 ==0 )
*some code*
否则,静态变量是唯一的出路?
发布于 2015-09-24 10:03:54
您可以使用member variables
来保持计数,到目前为止已经处理了多少。成员变量是instance variables
,不会在每次调用映射函数时重置。可以在mapper setup
方法中实例化它们。
显然,您可以使用静态变量来保存计数器。
HDFS中的数据存储在块中,当数据被分割成两个块时,您将如何处理。
要处理两个块之间的数据分割,您可能需要Reducers
。减速器的属性是,所有与特定键相关的数据(值)总是发送给同一(单个)减速器。还原器的输入是key
和list of values
,在您的例子中是list of data
。因此,您可以很容易地存储根据您的要求。
优化:您可以使用与Combiner
相同的Reducer
代码来优化数据传输。
Idea : Mapper
将按原样发出key
和value
。现在,当Reducer
接收到数据(即Key, List<value>
)时,您的所有值都已经由MapReduce framework
组合了。你只需要再发射一次。这是您正在寻找的输出。
https://stackoverflow.com/questions/32758322
复制相似问题