我必须处理非常大的文本文件(例如 5 TB 大小)中的数据。处理逻辑使用 supercsv 来解析数据并对其进行一些检查。显然,由于规模相当大,我们计划使用hadoop来利用并行计算的优势。我在我的机器上安装了 hadoop,然后开始编写映射器和 reducer 类,但我陷入了困境。因为 map 需要键值对,所以要读取这个文本文件,我不确定在这个特定场景中的键和值应该是什么。有人可以帮我解决这个问题吗?
我的思考过程是这样的(请告诉我我是否正确) 1)使用superCSV读取文件,hadoop为hdfs中的每个文件 block 生成supercsv bean。(我假设hadoop负责分割文件) 2)对于每个 supercsvbean 运行我的检查逻辑。
最佳答案
数据是否以换行符分隔?即,如果您只是在每个换行符上拆分数据,那么每个 block 是否始终是一个完整的记录?这取决于 superCSV 对文本进行编码的方式,以及您的实际数据是否包含换行符。
如果是:
只需使用 TextInputFormat。它为您提供(我认为)字节偏移量作为映射键,以及整行作为值。您可以忽略该键,并使用 superCSV 解析该行。
如果没有:
您必须编写自己的自定义输入格式 - 这是一个很好的教程:http://developer.yahoo.com/hadoop/tutorial/module5.html#fileformat 。键和值的具体细节对于映射器输入来说并不重要;只需确保两者之一包含您想要的实际数据。您甚至可以使用 NullWritable 作为其中之一的类型。
关于Hadoop 与 supercsv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13075343/