我必须对我的输入数据进行某些操作,并使用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条记录。
我使用默认的记录读取器,因此它一次读取每行
现在我的问题是我怎么知道map函数已经被调用了n次?我有办法知道吗?这样我就可以使用计数器将header附加到字符串
if (counter % 50 ==0 )
*some code*
或者静态变量是唯一的方法?
您可以使用member variables
来保持计数,到目前为止已经处理了多少。成员变量是instance variables
,不会在每次map函数被调用时被重置。您可以在mapper setup
方法中实例化它们。
显然,可以使用静态变量来保存计数器。
HDFS中的数据是以块的形式存储的,当数据被分成两个块时,你将如何处理
要处理两个块之间的数据分割,可能需要Reducers
。reducer的属性是,与特定键相关的所有数据(值)总是发送到相同的(单个)reducer。减速机的输入是key
和list of values
,在您的情况下是list of data
。因此,您可以很容易地根据您的需要存储它们。
优化:您可以使用与Combiner
相同的Reducer
代码来优化数据传输。
Idea: Mapper
将发出key
和value
。现在,当Reducer
接收到Key, List<value>
的数据时,所有的值已经由MapReduce framework
组合。你只需要再次释放它们。