【问题标题】:Getting the file name in Hadoop mapper using Hadoop Pipes使用 Hadoop Pipes 在 Hadoop 映射器中获取文件名
【发布时间】:2012-12-24 06:23:17
【问题描述】:

我怎样才能得到输入文件hadoop mapper in Hadoop Pipes?中执行的名称

我可以在基于 java 的 map reducer 中轻松获取文件名,例如

FileSplit fileSplit = (FileSplit)context.getInputSplit();细绳 文件名 = fileSplit.getPath().getName(); System.out.println("文件 name "+filename); System.out.println("目录和 文件名"+fileSplit.getPath().toString());

但是我怎样才能进入 C++;

请帮帮我

谢谢

【问题讨论】:

    标签: hadoop hadoop-streaming


    【解决方案1】:

    对于流/管道作业,作业配置被序列化为进程环境变量。

    定义输入文件的作业配置属性名为map.input.file。启动 C++ 程序的 PipeMapRed 类负责此序列化(configure 方法,第 151 行),并确保作业配置属性名称被转义(addJobConfToEnvironment 方法第 206/266 行) - 这意味着所有非a-Za-z0-9 字符被替换为下划线(safeEnvVarName 方法,第 276/284 行) - 因此您在 c++ 程序中查找的实际环境变量将命名为 map_input_file

    我不是c++程序员,所以我不能告诉你如何获取环境变量,但我相信它足够简单。

    【讨论】:

    • 我发现在我的 hadoop 工作中,根据 syslog,PipeMapRed 占用了整个工作时间的大部分,大约 10 分钟,而映射过程只占用不到 1 分钟,为什么?
    【解决方案2】:

    如果您在 Python 中使用 HADOOP 2.x

    file_name = os.environ['mapreduce_map_input_file']
    

    【讨论】:

      【解决方案3】:

      通过解析mapreduce_map_input_file(new) 或map_input_file(deprecated) 环境变量,可以得到地图输入文件名。

      注意:
      这两个环境变量区分大小写,所有字母都应小写

      【讨论】:

        【解决方案4】:

        想出了如何在 Python 中做到这一点:

        import os
        filename = os.environ['map_input_file']
        

        filename 是您想要的变量 - 这将为您提供映射器正在处理的文件名。

        其他一些有用的环境变量是:

        • mapred_job_id = 完整的作业 ID
        • mapred_tip_id = 特定映射器或缩减器任务的 ID

        【讨论】:

          【解决方案5】:

          我一直在为同样的问题而苦苦挣扎。我找到了解决方案。

          void map(HadoopPipes::MapContext& context) {                                                                                         
              string path;
              path = context.getInputSplit();                                                                                                    
              path.erase(path.end()-1);
          }
          

          我只发布了读取文件名部分。 getInputSplit() 方法返回文件的整个路径 + 最后的一些未知字符。我想要文件的纯路径,所以删除字符串的结束字符。我不知道为什么奇怪的字符被添加到字符串的末尾,但是让我们通过删除结束字符来使用它~!

          【讨论】:

            【解决方案6】:

            下面的代码将能够打印文件名

            filepath = os.environ['mapreduce_map_input_file']
            
            filename = os.path.split(filepath)[-1]
            
            print filename
            

            【讨论】:

            猜你喜欢
            • 2013-10-01
            • 1970-01-01
            • 2013-10-18
            • 2015-07-17
            • 1970-01-01
            • 2013-07-18
            • 1970-01-01
            • 2014-06-09
            • 2011-04-12
            相关资源
            最近更新 更多