i not found the "iterateWithTermination" function, only "iterate" and
"iterateDelta". i use flink 0.9.0 with java.

2015-07-20 11:30 GMT+02:00 Sachin Goel <sachingoel0...@gmail.com>:

> Hi
> You can use iterateWithTermination to terminate before max iterations. The
> feedback for iteration then would be (next solution, isConverged) where
> isConverged is an empty data set if you wish to terminate.
> However, this is something I have a pull request for:
> https://github.com/apache/flink/pull/918. Take a look.
>
> -- Sachin Goel
> Computer Science, IIT Delhi
> m. +91-9871457685
>
> On Mon, Jul 20, 2015 at 2:55 PM, Pa Rö <paul.roewer1...@googlemail.com>
> wrote:
>
>> hello community,
>>
>> i have write a k-means app in flink, now i want change my terminate
>> condition from max iteration to checking the changing of the cluster
>> centers, but i don't know how i can break the flink loop. here my execution
>> code of flink:
>>
>> public void run() {
>>         //load properties
>>         Properties pro = new Properties();
>>         FileSystem fs = null;
>>         try {
>>
>> pro.load(FlinkMain.class.getResourceAsStream("/config.properties"));
>>             fs = FileSystem.get(new
>> URI(pro.getProperty("hdfs.namenode")),new
>> org.apache.hadoop.conf.Configuration());
>>         } catch (Exception e) {
>>             e.printStackTrace();
>>         }
>>
>>         int maxIteration =
>> Integer.parseInt(pro.getProperty("maxiterations"));
>>         String outputPath =
>> fs.getHomeDirectory()+pro.getProperty("flink.output");
>>         // set up execution environment
>>         ExecutionEnvironment env =
>> ExecutionEnvironment.getExecutionEnvironment();
>>         // get input points
>>         DataSet<GeoTimeDataTupel> points = getPointDataSet(env);
>>         DataSet<GeoTimeDataCenter> centroids = null;
>>         try {
>>             centroids = getCentroidDataSet(env);
>>         } catch (Exception e1) {
>>             e1.printStackTrace();
>>         }
>>         // set number of bulk iterations for KMeans algorithm
>>         IterativeDataSet<GeoTimeDataCenter> loop =
>> centroids.iterate(maxIteration);
>>         DataSet<GeoTimeDataCenter> newCentroids = points
>>             // compute closest centroid for each point
>>             .map(new
>> SelectNearestCenter(this.getBenchmarkCounter())).withBroadcastSet(loop,
>> "centroids")
>>             // count and sum point coordinates for each centroid
>>             .groupBy(0).reduceGroup(new CentroidAccumulator())
>>             // compute new centroids from point counts and coordinate sums
>>             .map(new CentroidAverager(this.getBenchmarkCounter()));
>>         // feed new centroids back into next iteration
>>         DataSet<GeoTimeDataCenter> finalCentroids =
>> loop.closeWith(newCentroids);
>>         DataSet<Tuple2<Integer, GeoTimeDataTupel>> clusteredPoints =
>> points
>>             // assign points to final clusters
>>             .map(new
>> SelectNearestCenter(-1)).withBroadcastSet(finalCentroids, "centroids");
>>         // emit result
>>         clusteredPoints.writeAsCsv(outputPath+"/points", "\n", " ");
>>         finalCentroids.writeAsText(outputPath+"/centers");//print();
>>         // execute program
>>         try {
>>             env.execute("KMeans Flink");
>>         } catch (Exception e) {
>>             e.printStackTrace();
>>         }
>>     }
>>
>> is it possible to use a contruct like: if(centroids equals points){break
>> the loop}???
>>
>> best regards,
>> paul
>>
>
>

Reply via email to