hadoop中的全局变量

hadoop中的全局变量,hadoop,mapreduce,Hadoop,Mapreduce,我的程序遵循迭代的map/reduce方法。如果满足某些条件,它需要停止。无论如何,我可以设置一个全局变量,该变量可以分布在所有map/reduce任务中,并检查全局变量是否达到完成条件 像这样的 While(Condition != true){ Configuration conf = getConf(); Job job = new Job(conf, "Dijkstra Graph Search"); job.s

我的程序遵循迭代的map/reduce方法。如果满足某些条件,它需要停止。无论如何,我可以设置一个全局变量,该变量可以分布在所有map/reduce任务中,并检查全局变量是否达到完成条件

像这样的

While(Condition != true){

            Configuration conf = getConf();
            Job job = new Job(conf, "Dijkstra Graph Search");

            job.setJarByClass(GraphSearch.class);
            job.setMapperClass(DijkstraMap.class);
            job.setReducerClass(DijkstraReduce.class);

            job.setOutputKeyClass(IntWritable.class);
            job.setOutputValueClass(Text.class);

}

其中condition是在每次map/reduce执行期间/之后修改的全局变量。

每次运行map-reduce作业时,都可以检查输出的状态、计数器中包含的值等,并在控制迭代的节点上决定是否要再进行一次迭代。我想我不明白在你的场景中,全球国家的需求从何而来

更一般地说,在执行节点之间共享状态有两种主要方式(尽管应该注意,共享状态是最好避免的,因为它限制了可伸缩性)

  • 向HDFS写入其他节点可以读取的文件(确保在作业退出时清除该文件,并且推测执行不会导致奇怪的失败)
  • 使用ZooKeeper在专用的ZK树节点中存储一些数据

  • 可以使用来组织多个Hadoop作业。指定要保留全局状态变量并使用虚拟内容初始化的HDFS路径。在每次迭代中,读取此HDFS路径的当前内容,删除这些内容,执行任意数量的map/reduce步骤,最后执行更新全局状态变量的全局reduce。根据任务的性质,您可能需要禁用推测性执行并允许多次重试。

    您可以使用配置。set(字符串名称、字符串值)设置您可以在映射器/还原器等中访问的值:

    在您的驱动程序中:

       conf.set("my.dijkstra.parameter", "value");
    
    例如,在地图绘制程序中:

    public void configure(JobConf job) {
           myParam = job.get("my.dijkstra.parameter");
       }
    
    但这可能不会帮助您查看以前作业的输出,以决定是否再开始一次迭代。也就是说,在作业执行后,该值不会被推回

    您还可以使用Hadoop存储将在所有节点之间分发的文件。如果要通过这种方式传递的值很小,那么这比简单地在HDFS上存储要好一些


    当然也可以用于此目的。但在算法中,它们看起来并不太可靠。看起来在某些情况下,它们可以增加两次(如果某个任务执行了一次以上,例如在执行失败或推测的情况下)-我不确定。

    这就是Hadoop 2.0中的工作方式

    在您的驱动程序中:

     conf.set("my.dijkstra.parameter", "value");
    
    在您的映射器中:

    protected void setup(Context context) throws IOException,
                InterruptedException {
            Configuration conf = context.getConfiguration();
    
            strProp = conf.get("my.dijkstra.parameter");
            // and then you can use it
        }
    

    你能再解释一下如何使用计数器吗?谢谢。试着做一个简短的介绍:这正好回答了我的问题。非常感谢你!