将目录的Map输出合并到一个文件中

时间:2016-06-07 12:10:13

标签: hadoop mapreduce

我有一个要求,我必须将目录的映射器输出合并到一个文件中。假设我有一个包含3个文件的目录A.

../ A /的1.txt ../A/2.txt ../ A / 3.txt

我需要运行一个mapper来处理这些shud生成一个输出文件的文件。 我知道减速器会这样做,但我不想使用减速器逻辑

#include <iostream>
#include <memory>

template<typename ArrayType>
void deleter(ArrayType* array) noexcept
{
    if (array)
    {
        delete[] array;
        array = nullptr;
        std::cout << "Freed array." << std::endl;
    }
}
template<typename ArrayType>
std::unique_ptr<ArrayType[], decltype(&deleter<ArrayType>)> makeArray(const std::size_t size)
{
    return std::unique_ptr<ArrayType[], decltype(&deleter<ArrayType>)>{
        new ArrayType[size],
        deleter<ArrayType>
    };
}

std::unique_ptr<int[], decltype(&deleter<int>)> createInt(int s)
{
    if (s == 3)
        return makeArray<int>(3);
    else
        return nullptr;
}

void testArr(int arr[])
{
    if (arr != nullptr)
    {
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;
        std::cout << "Value 2 is " << arr[1] << std::endl;
    }
    else
        std::cout << "Array is empty." << std::endl;
}

int main() {
    auto arr0{createInt(4)}, arr1{createInt(3)};
    std::cout << "\tTesting arr0:\n";
    testArr(arr0.get());
    std::cout << "\tTesting arr1:\n";
    testArr(arr1.get());
    std::cout << "\tFinished testing\n";
    return 0;
}

我是否只有一台映射器可以处理目录下的所有文件。

2 个答案:

答案 0 :(得分:0)

如果设置fuse以将HDFS安装到本地目录,则输出可以是挂载的文件系统。

例如,我将HDFS本地安装到 / mnt / hdfs 。我运行以下命令,效果很好:

hadoop fs -getmerge / reports / some_output /mnt/hdfs/reports/some_output.txt

当然,使用fuse将HDFS挂载到本地目录还有其他原因,但这对我们来说是一个很好的副作用

答案 1 :(得分:0)

  

我是否只有一台映射器可以处理目录下的所有文件。

您是否查看了CombinedFileInputFormat? Felix Ren-Chyan Chern写了一些关于详细设置的内容。