【问题标题】:Hadoop read 2 files at once(one header file and one data file)Hadoop一次读取2个文件(一个头文件和一个数据文件)
【发布时间】:2012-12-18 22:19:38
【问题描述】:

我有这些文件的集合-

objectA-record-data.log 文件 - 包含多行带有时间戳的数据。

objectA-record-metadata.log 文件 - 仅包含一行。将其视为 objectA 的所有记录的元数据。

它们将共同形成一个记录以供处理。

我已经能够处理数据文件了。映射器将 objectA 设置为数据文件中所有行的键,reducer 处理并打印文本文件。现在我想将元数据也添加到这些记录中。有什么想法我该怎么做?

【问题讨论】:

    标签: java hadoop mapreduce cloudera


    【解决方案1】:

    使用分布式缓存:

    在驱动程序/配置类中:

    DistributedCache.addCacheFile(new URI("/user/chris/theMetaDataFile.txt"), conf);
    

    在映射器中:

    public void setup(Context context) {
        Configuration conf = context.getConfiguration();
        Path[] cachedFiles = DistributedCache.getLocalCacheFiles(conf);
        File metadataFile = new File(chachedFiles[0].toString());
    
        // metadataFile can now be read and the results stored locally for use in the map method
    }
    

    【讨论】:

    • 其实元数据文件有很多,每个对象一个。如果我加载太多缓存文件,它会占用系统吗?或者我可能需要阅读更多关于分布式缓存如何工作的信息。
    • 它们都在同一个目录中吗?你怎么知道哪个文件和哪个记录?
    • 它们都在同一个目录下。文件名有助于决定记录。文件名类似于 objectA-yyyy-mm-dd。所以每个对象每天都有一个文件。该文件包含一天中每个小时的信息,需要与标题一起处理。
    【解决方案2】:

    我猜你的数据文件和元文件之间一定有一些映射 您可以在 Mapper 的设置方法中获取元文件,如下所示

    protected void setup(
            org.apache.hadoop.mapreduce.Mapper<Long, Text, Text, Text>.Context context)
            throws java.io.IOException, InterruptedException {
        FileSplit split=(FileSplit)context.getInputSplit();
        Path path=split.getPath();
        Path metaFile=getMetaFile(path);
    };
    

    【讨论】:

    • 每个对象都有一个文件,所以代码应该放在map()而不是setup()。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2021-11-19
    • 2021-01-23
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多