1

我已经使用了这个在大多数网站中都有的例子..

int letterCnt = G.grid().reduce(
GridClosureCallMode.SPREAD,
F.yield("Counting Letters In This Phrase".split(" "),
    new C1<String, Integer>() {
        @Override public Integer apply(String word) {
            return word.length();
        }
    }
),
F.sumIntReducer()
);

第一个参数表示工作负载的平均分配(我假设它更像是循环基础)第二个参数具有将在所有发现的节点中执行的代码第三个接收来自在不同节点中执行的 apply() 的所有结果数据并进行相应处理。

我想知道是否可以用我们自己的函数替换第三个参数 F.sumIntReducer() 。如果是,我想看一个例子。假设创建具有与 F.sumIntReducer() 相同功能的相同函数(即,将不同节点找到的所有长度相加)。

4

2 回答 2

0

reduce 方法具有全局输入和输出数据类型。其结构示意图如下:

1   resultValue = grid.reduce(
2   job distribution mode,
3   executable logic function,
4   split function,
5   collect function);
  1. 任务的结果值直接赋值给reduce函数的返回值。Grid 是对应的网格,作业发送到的地方。这里可以定义多个网格并并行存在。
  2. 作业分配设置在此处定义。作业分配的参数提供三个选项: -GridClosureCallMode.BALANCE - 平衡(循环?)作业分布 -GridClosureCallMode.BROADCAST - 所有节点处理所有作业 -GridClosureCallMode.SPREAD - 所有作业随机分布
  3. 原子逻辑函数在这里定义。这部分称为作业;它被发送到一个节点,处理并包含全局结果的一部分。它定义了支持的输入和输出数据类型。GridGain 还支持开箱即用地分发此功能所需的所有库。这意味着主节点不限于使用所有节点都在本地可用的库,因为所有必要的库都随作业一起提供。这当然会产生更多的数据流量。
  4. 输入数据需要分发到节点。每个函数都提供有来自 split 函数的数据集之一。数据的细分存储在具有相应数据类型的数组列表中。由于实现结果,仅支持低级数据类型(根据 GridGain ,高级数据也应该可传输)。要传输更复杂的数据(如 PDF 和图像),必须封装成字节数组。
  5. 主节点使用此功能接收生成的零件并将它们重新组装成最终结果。

简单的例子:(不使用网格,因为只有内存操作而不是 CPU 密集型,所以不要指望单次执行的改进)

private static int countLettersReducer(String phrase) throws GridException {

        // final GridLogger log = grid.log();
        int letterCount = 0;

        // Execute Hello World task.
        try {

            @SuppressWarnings("unchecked")
            int letterCnt =

            grid.reduce(GridClosureCallMode.BALANCE,
            // input: string
            // output: integer
                    new GridClosure<String, Integer>() {

                        private static final long serialVersionUID = 1L;

                        // Create executable logic block for a job part
                        @Override
                        public Integer apply(String word) {
                            // Print out a given word, just so we can
                            // see which node is doing what.
                            // System.out.println(">>> Calculating for word: " + word);
                            // Return the length of a given word, i.e. number of
                            // letters.
                            return word.length();
                        }
                    },

                    // split tasks for single jobs according to this function
                    // split at linebreaks
                    Arrays.asList(phrase.split("\n")),

                    // Collection of words.
                    // Collect the results from each job of the nodes
                    //input and output is integer
                    new GridReducer<Integer, Integer>() {
                        /**
                         * 
                         */
                        private static final long serialVersionUID = 1L;
                        private int sum;

                        @Override
                        public boolean collect(Integer res) {
                            sum += res;

                            return true; // True means continue collecting until
                                            // last result.
                        }

                        // return the collected results
                        @Override
                        public Integer apply() {
                            return sum;
                        }
                    });

            letterCount = letterCnt;
        } catch (Exception e) {

        }
        return letterCount;
    }
于 2013-03-18T13:50:56.840 回答
0

是的,您可以定义自己的自定义减速器。例子在这里

于 2013-01-26T07:15:47.500 回答