Hi Matthias, I understand your point about "advertising" the interfaces but there is so much stuff to be advertised :). Honestly, I think ProgramDescription doesn't add much value although it is kind of neat. Parameters can be described in the code or by displaying a help message. However, I'm in favor of making it easier to list all executable classes in a JAR. Therefore, I like your proposed changes. I just don't see much of a use of the Program or ProgramDescription interface in the examples. That's just my personal opinion.
Best regards, Max On Tue, May 26, 2015 at 5:10 PM, Flavio Pompermaier <pomperma...@okkam.it> wrote: > I agree with Matthias,I didn't know about ProgramDesciption and Program > Interfaces because they are not advertised anywhere.. > > On Tue, May 26, 2015 at 5:01 PM, Matthias J. Sax < > mj...@informatik.hu-berlin.de> wrote: > > > I see your point. > > > > However, right now only few people are aware of "ProgramDesciption" > > interface. If we want to "advertise" for it, it should be used (at > > least) in a few examples. Otherwise, people will never use it, and the > > changes I plan to apply are kind of useless. I would even claim, that > > the interface should be removed completely is this case... > > > > > > On 05/26/2015 03:31 PM, Maximilian Michels wrote: > > > Sorry, my bad. Yes, it is helpful to have a separate program and > > parameter > > > description in ProgramDescription. I'm not sure if it adds much value > to > > > implement ProgramDescription in the examples. It introduces verbosity > and > > > might give the impression that you have to implement ProgramDescription > > in > > > your Flink job. > > > > > > On Tue, May 26, 2015 at 12:00 PM, Matthias J. Sax < > > > mj...@informatik.hu-berlin.de> wrote: > > > > > >> Hi Max, > > >> > > >> thanks for your feedback. I guess you confuse the interfaces "Program" > > >> and "ProgramDescription". Using "Program" the use of main method is > > >> replaced by "getPlan(...)". However, "ProgramDescription" only adds > > >> method "getDescription()" which returns a string that explains the > usage > > >> of the program (ie, short description, expected parameters). > > >> > > >> Thus, adding "ProgramDescription" to the examples, does not change the > > >> examples -- main method will still be uses. It only adds the ability > > >> that a program "explains" itself (ie, give meta info). Furhtermore, > > >> "ProgramDescription" is also not related to the new "ParameterTool". > > >> > > >> -Matthias > > >> > > >> On 05/26/2015 11:46 AM, Maximilian Michels wrote: > > >>> I don't think `getDisplayName()` is necessary either. The class name > > and > > >>> the description string should be fine. Adding ProgramDescription to > the > > >>> examples is not necessary; as already pointed out, using the main > > method > > >> is > > >>> more convenient for most users. As far as I know, the idea of the > > >>> ParameterTool was to use it only in the user code and not > automatically > > >>> handle parameters. > > >>> > > >>> Changing the interface would be quite API breaking but since most > > >> programs > > >>> use the main method, IMHO we could do it. > > >>> > > >>> On Fri, May 22, 2015 at 10:09 PM, Matthias J. Sax < > > >>> mj...@informatik.hu-berlin.de> wrote: > > >>> > > >>>> Makes sense to me. :) > > >>>> > > >>>> One more thing: What about extending the "ProgramDescription" > > interface > > >>>> to have multiple methods as Flavio suggested (with the config(...) > > >>>> method that should be handle by the ParameterTool) > > >>>> > > >>>>> public interface FlinkJob { > > >>>>> > > >>>>> /** The name to display in the job submission UI or shell */ > > >>>>> //e.g. "My Flink HelloWorld" > > >>>>> String getDisplayName(); > > >>>>> //e.g. "This program does this and that etc.." > > >>>>> String getDescription(); > > >>>>> //e.g. <0,Integer,"An integer representing my first param">, > > >>>> <1,String,"An string representing my second param"> > > >>>>> List<Tuple3<Integer, TypeInfo, String>> paramDescription; > > >>>>> /** Set up the flink job in the passed ExecutionEnvironment */ > > >>>>> ExecutionEnvironment config(ExecutionEnvironment env); > > >>>>> } > > >>>> > > >>>> Right now, the interface is used only a couple of times in Flink's > > code > > >>>> base, so it would not be a problem to update those classes. However, > > it > > >>>> could break external code that uses the interface already (even if I > > >>>> doubt that the interface is well known and used often [or at all]). > > >>>> > > >>>> I personally don't think, that "getDiplayName()" to too helpful. > > >>>> Splitting the program description and the parameter description > seems > > to > > >>>> be useful. For example, if wrong parameters are provided, the > > parameter > > >>>> description can be included in the error message. If > program+parameter > > >>>> description is given in a single string, this is not possible. But > > this > > >>>> is only a minor issue of course. > > >>>> > > >>>> Maybe, we should also add the interface to the current Flink > examples, > > >>>> to make people more aware of it. Is there any documentation on the > web > > >>>> site. > > >>>> > > >>>> > > >>>> -Matthias > > >>>> > > >>>> > > >>>> > > >>>> On 05/22/2015 09:43 PM, Robert Metzger wrote: > > >>>>> Thank you for working on this. > > >>>>> My responses are inline below: > > >>>>> > > >>>>> (Flavio) > > >>>>> > > >>>>>> My suggestion is to create a specific Flink interface to get also > > >>>>>> description of a job and standardize parameter passing. > > >>>>> > > >>>>> > > >>>>> I've recently merged the ParameterTool which is solving the > > >> "standardize > > >>>>> parameter passing" problem (at least it presents a best practice) : > > >>>>> > > >>>> > > >> > > > http://ci.apache.org/projects/flink/flink-docs-master/apis/best_practices.html#parsing-command-line-arguments-and-passing-them-around-in-your-flink-application > > >>>>> > > >>>>> Regarding the description: Maybe we can use the > "ProgramDescription" > > >>>>> interface for getting a string describing the program in the web > > >>>> frontend. > > >>>>> > > >>>>> (Matthias) > > >>>>> > > >>>>>> I don't want to start working on it, before it's clear that it > has a > > >>>>>> chance to be > > >>>>>> included in Flink. > > >>>>> > > >>>>> > > >>>>> I think the changes discussed here won't change the current > behavior, > > >> but > > >>>>> they add new functionality which > > >>>>> can make the life of our users easier, so I'll vote to include your > > >>>> changes > > >>>>> (given they meet our quality standards) > > >>>>> > > >>>>> > > >>>>> If multiple classes implement "Program" interface an exception > should > > >> be > > >>>>>> through (I think that would make sense). However, I am not sure > was > > >>>>>> "good" behavior is, if a single "Program"-class is found and an > > >>>>>> additional main-method class. > > >>>>>> - should "Program"-class be executed (ie, "overwrite" > main-method > > >>>> class) > > >>>>>> - or, better to through an exception ? > > >>>>> > > >>>>> > > >>>>> I would give a class implementing "Program" priority over a random > > >> main() > > >>>>> method in a random class. > > >>>>> Maybe printing a WARN log message informing the user that the > > "Program" > > >>>>> class has been choosen. > > >>>>> > > >>>>> > > >>>>> If no "Program"-class is found, but a single main-method class, > Flink > > >>>>>> could execute using main method. But I am not sure either, if this > > is > > >>>>>> "good" behavior. If multiple main-method classes are present, > > throwing > > >>>>>> and exception is the only way to got, I guess. > > >>>>> > > >>>>> > > >>>>> I think the best effort approach "one class with main() found" is > > good. > > >>>> In > > >>>>> case of multiple main methods, a helpful exception is the best > > approach > > >>>> in > > >>>>> my opinion. > > >>>>> > > >>>>> > > >>>>> If the manifest contains "program-class" or "Main-Class" entry, > > >>>>>> should we check the jar file right away if the specified class is > > >> there? > > >>>>>> Right now, no check is performed and an error occurs if the user > > tries > > >>>>>> to execute the job. > > >>>>> > > >>>>> > > >>>>> I'd say the current approach is sufficient. There is no need to > have > > a > > >>>>> special code path which is doing the check. > > >>>>> I think the error message will be pretty similar in both cases and > I > > >> fear > > >>>>> that this additional code could also introduce new bugs ;) > > >>>>> > > >>>>> > > >>>>> > > >>>>> > > >>>>> On Fri, May 22, 2015 at 9:06 PM, Matthias J. Sax < > > >>>>> mj...@informatik.hu-berlin.de> wrote: > > >>>>> > > >>>>>> Hi, > > >>>>>> > > >>>>>> two more thoughts to this discussion: > > >>>>>> > > >>>>>> 1) looking at the commit history of "CliFrontend", I found the > > >>>>>> following closed issue and the closing pull request > > >>>>>> * https://issues.apache.org/jira/browse/FLINK-1095 > > >>>>>> * https://github.com/apache/flink/pull/238 > > >>>>>> It stand in opposite of Flavio's request to have a job > description. > > >> Any > > >>>>>> comment on this? Should a removed feature be re-introduced? If > not, > > I > > >>>>>> would suggest to remove the "ProgramDescription" interface > > completely. > > >>>>>> > > >>>>>> 2) If the manifest contains "program-class" or "Main-Class" > entry, > > >>>>>> should we check the jar file right away if the specified class is > > >> there? > > >>>>>> Right now, no check is performed and an error occurs if the user > > tries > > >>>>>> to execute the job. > > >>>>>> > > >>>>>> > > >>>>>> -Matthias > > >>>>>> > > >>>>>> > > >>>>>> On 05/22/2015 12:06 PM, Matthias J. Sax wrote: > > >>>>>>> Thanks for your feedback. > > >>>>>>> > > >>>>>>> I agree on the main method "problem". For scanning and listing > all > > >>>> stuff > > >>>>>>> that is found it's fine. > > >>>>>>> > > >>>>>>> The tricky question is the automatic invocation mechanism, if > "-c" > > >> flag > > >>>>>>> is not used, and no manifest program-class or Main-Class entry is > > >>>> found. > > >>>>>>> > > >>>>>>> If multiple classes implement "Program" interface an exception > > should > > >>>> be > > >>>>>>> through (I think that would make sense). However, I am not sure > was > > >>>>>>> "good" behavior is, if a single "Program"-class is found and an > > >>>>>>> additional main-method class. > > >>>>>>> - should "Program"-class be executed (ie, "overwrite" > main-method > > >>>>>> class) > > >>>>>>> - or, better to through an exception ? > > >>>>>>> > > >>>>>>> If no "Program"-class is found, but a single main-method class, > > Flink > > >>>>>>> could execute using main method. But I am not sure either, if > this > > is > > >>>>>>> "good" behavior. If multiple main-method classes are present, > > >> throwing > > >>>>>>> and exception is the only way to got, I guess. > > >>>>>>> > > >>>>>>> To sum up: Should Flink consider main-method classes for > automatic > > >>>>>>> invocation, or should it be required for main-method classes to > > >> either > > >>>>>>> list them in "program-class" or "Main-Class" manifest parameter > (to > > >>>>>>> enable them for automatic invocation)? > > >>>>>>> > > >>>>>>> > > >>>>>>> -Matthias > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>> On 05/22/2015 09:56 AM, Maximilian Michels wrote: > > >>>>>>>> Hi Matthias, > > >>>>>>>> > > >>>>>>>> Thank you for taking the time to analyze Flink's invocation > > >> behavior. > > >>>> I > > >>>>>>>> like your proposal. I'm not sure whether it is a good idea to > scan > > >> the > > >>>>>>>> entire JAR for main methods. Sometimes, main methods are added > > >> solely > > >>>>>> for > > >>>>>>>> testing purposes and don't really serve any practical use. > > However, > > >> if > > >>>>>>>> you're already going through the JAR to find the > > ProgramDescription > > >>>>>>>> interface, then you might look for main methods as well. As long > > as > > >> it > > >>>>>> is > > >>>>>>>> just a listing without execution, that should be fine. > > >>>>>>>> > > >>>>>>>> Best regards, > > >>>>>>>> Max > > >>>>>>>> > > >>>>>>>> On Thu, May 21, 2015 at 3:43 PM, Matthias J. Sax < > > >>>>>>>> mj...@informatik.hu-berlin.de> wrote: > > >>>>>>>> > > >>>>>>>>> Hi, > > >>>>>>>>> > > >>>>>>>>> I had a look into the current Workflow of Flink with regard to > > the > > >>>>>>>>> progressing steps of a jar file. > > >>>>>>>>> > > >>>>>>>>> If I got it right it works as follows (not sure if this is > > >> documented > > >>>>>>>>> somewhere): > > >>>>>>>>> > > >>>>>>>>> 1) check, if "-c" flag is used to set program entry point > > >>>>>>>>> if yes, goto 4 > > >>>>>>>>> 2) try to extract "program-class" property from manifest > > >>>>>>>>> (if found goto 4) > > >>>>>>>>> 3) try to extract "Main-Class" property from manifest > > >>>>>>>>> -> if not found through exception (this happens also, if no > > >>>> manifest > > >>>>>>>>> file is found at all) > > >>>>>>>>> > > >>>>>>>>> 4) check if entry point class implements "Program" interface > > >>>>>>>>> if yes, goto 6 > > >>>>>>>>> 5) check if entry point class provided "public static void > > >>>>>> main(String[] > > >>>>>>>>> args)" method > > >>>>>>>>> -> if not, through exception > > >>>>>>>>> > > >>>>>>>>> 6) execute program (ie, show plan/info or really run it) > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I also "discovered" the interface "ProgramDescription" with a > > >> single > > >>>>>>>>> method "String getDescription()". Even if some examples > implement > > >>>> this > > >>>>>>>>> interface (and use it in the example itself), Flink basically > > >> ignores > > >>>>>>>>> it... From the CLI there is no way to get this info, and the > > WebUI > > >>>> does > > >>>>>>>>> actually get it if present, however, doesn't show it > anywhere... > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> I think it would be nice, if we would extend the following > > >> functions: > > >>>>>>>>> > > >>>>>>>>> - extend the possibility to specify multiple entry classes in > > >>>>>>>>> "program-class" or "Main-Class" -> in this case, the user needs > > to > > >>>> use > > >>>>>>>>> "-c" flag to pick program to run every time > > >>>>>>>>> > > >>>>>>>>> - add a CLI option that allows the user to see what entry > point > > >>>>>> classes > > >>>>>>>>> are available > > >>>>>>>>> for this, consider > > >>>>>>>>> a) "program-class" entry > > >>>>>>>>> b) "Main-Class" entry > > >>>>>>>>> c) if neither is found, scan jar-file for classes > > implementing > > >>>>>>>>> "Program" interface > > >>>>>>>>> d) if still not found, scan jar-file for classes with > "main" > > >>>>>> method > > >>>>>>>>> > > >>>>>>>>> - if user looks for entry point classes via CLI, check for > > >>>>>>>>> "ProgramDesciption" interface and show info > > >>>>>>>>> > > >>>>>>>>> - extend WebUI to show all available entry-classes (pull > request > > >>>>>>>>> already there, for multiple entries in "program-class") > > >>>>>>>>> > > >>>>>>>>> - extend WebUI to show "ProgramDescription" info > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> What do you think? I am not too sure about the "auto scan" of > the > > >> jar > > >>>>>>>>> file if no manifest entry is provided. We might get some "fat > > jars" > > >>>> and > > >>>>>>>>> scanning might take some time. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> -Matthias > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On 05/19/2015 10:44 AM, Stephan Ewen wrote: > > >>>>>>>>>> We actually has an interface like that before ("Program"). It > is > > >>>> still > > >>>>>>>>>> supported, but in all new programs we simply use the Java main > > >>>> method. > > >>>>>>>>> The > > >>>>>>>>>> advantage is that > > >>>>>>>>>> most IDEs can create executable JARs automatically, setting > the > > >> JAR > > >>>>>>>>>> manifest attributes, etc. > > >>>>>>>>>> > > >>>>>>>>>> The "Program" interface still works, though. Most tool classes > > >> (like > > >>>>>>>>>> "PackagedProgram") have a way to figure out whether the code > > uses > > >>>>>>>>> "main()" > > >>>>>>>>>> or implements "Program" > > >>>>>>>>>> and calls the right method. > > >>>>>>>>>> > > >>>>>>>>>> You can try and extend the program interface. If you want to > > >>>>>> consistently > > >>>>>>>>>> support multiple programs in one JAR file, you may need to > > adjust > > >>>> the > > >>>>>>>>> util > > >>>>>>>>>> classes as > > >>>>>>>>>> well to deal with that. > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>> On Tue, May 19, 2015 at 10:10 AM, Matthias J. Sax < > > >>>>>>>>>> mj...@informatik.hu-berlin.de> wrote: > > >>>>>>>>>> > > >>>>>>>>>>> Supporting an interface like this seems to be a nice idea. > Any > > >>>> other > > >>>>>>>>>>> opinions on it? > > >>>>>>>>>>> > > >>>>>>>>>>> It seems to be some more work to get it done right. I don't > > want > > >> to > > >>>>>>>>>>> start working on it, before it's clear that it has a chance > to > > be > > >>>>>>>>>>> included in Flink. > > >>>>>>>>>>> > > >>>>>>>>>>> @Flavio: I moved the discussion to dev mailing list (user > list > > is > > >>>> not > > >>>>>>>>>>> appropriate for this discussion). Are you subscribed to it or > > >>>> should > > >>>>>> I > > >>>>>>>>>>> cc you in each mail? > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> -Matthias > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> On 05/19/2015 09:39 AM, Flavio Pompermaier wrote: > > >>>>>>>>>>>> Nice feature Matthias! > > >>>>>>>>>>>> My suggestion is to create a specific Flink interface to get > > >> also > > >>>>>>>>>>>> description of a job and standardize parameter passing. > > >>>>>>>>>>>> Then, somewhere (e.g. Manifest) you could specify the list > of > > >>>>>> packages > > >>>>>>>>>>> (or > > >>>>>>>>>>>> also directly the classes) to inspect with reflection to > > extract > > >>>> the > > >>>>>>>>> list > > >>>>>>>>>>>> of available Flink jobs. > > >>>>>>>>>>>> Something like: > > >>>>>>>>>>>> > > >>>>>>>>>>>> public interface FlinkJob { > > >>>>>>>>>>>> > > >>>>>>>>>>>> /** The name to display in the job submission UI or shell */ > > >>>>>>>>>>>> //e.g. "My Flink HelloWorld" > > >>>>>>>>>>>> String getDisplayName(); > > >>>>>>>>>>>> //e.g. "This program does this and that etc.." > > >>>>>>>>>>>> String getDescription(); > > >>>>>>>>>>>> //e.g. <0,Integer,"An integer representing my first > param">, > > >>>>>>>>>>> <1,String,"An > > >>>>>>>>>>>> string representing my second param"> > > >>>>>>>>>>>> List<Tuple3<Integer, TypeInfo, String>> paramDescription; > > >>>>>>>>>>>> /** Set up the flink job in the passed ExecutionEnvironment > > */ > > >>>>>>>>>>>> ExecutionEnvironment config(ExecutionEnvironment env); > > >>>>>>>>>>>> } > > >>>>>>>>>>>> > > >>>>>>>>>>>> What do you think? > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>>> On Sun, May 17, 2015 at 10:38 PM, Matthias J. Sax < > > >>>>>>>>>>>> mj...@informatik.hu-berlin.de> wrote: > > >>>>>>>>>>>> > > >>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I like the idea that Flink's WebClient can show different > > plans > > >>>> for > > >>>>>>>>>>>>> different jobs within a single jar file. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> I prepared a prototype for this feature. You can find it > > here: > > >>>>>>>>>>>>> https://github.com/mjsax/flink/tree/multipleJobsWebUI > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> To test the feature, you need to prepare a jar file, that > > >>>> contains > > >>>>>> the > > >>>>>>>>>>>>> code of multiple programs and specify each entry class in > the > > >>>>>> manifest > > >>>>>>>>>>>>> file as comma separated values in "program-class" line. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Feedback is welcome. :) > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> -Matthias > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> On 05/08/2015 03:08 PM, Flavio Pompermaier wrote: > > >>>>>>>>>>>>>> Thank you all for the support! > > >>>>>>>>>>>>>> It will be a really nice feature if the web client could > be > > >> able > > >>>>>> to > > >>>>>>>>>>> show > > >>>>>>>>>>>>>> me the list of Flink jobs within my jar.. > > >>>>>>>>>>>>>> it should be sufficient to mark them with a special > > annotation > > >>>> and > > >>>>>>>>>>>>>> inspect the classes within the jar.. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Fri, May 8, 2015 at 3:03 PM, Malte Schwarzer < > m...@mieo.de > > >>>>>>>>>>>>>> <mailto:m...@mieo.de>> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi Flavio, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> you also can put each job in a single class and use > the > > –c > > >>>>>>>>>>> parameter > > >>>>>>>>>>>>>> to execute jobs separately: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> /bin/flink run –c com.myflinkjobs.JobA > > >>>>>>>>>>> /path/to/jar/multiplejobs.jar > > >>>>>>>>>>>>>> /bin/flink run –c com.myflinkjobs.JobB > > >>>>>>>>>>> /path/to/jar/multiplejobs.jar > > >>>>>>>>>>>>>> … > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Cheers > > >>>>>>>>>>>>>> Malte > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Von: Robert Metzger <rmetz...@apache.org <mailto: > > >>>>>>>>>>> rmetz...@apache.org > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Antworten an: <u...@flink.apache.org <mailto: > > >>>>>>>>> u...@flink.apache.org > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> Datum: Freitag, 8. Mai 2015 14:57 > > >>>>>>>>>>>>>> An: "u...@flink.apache.org <mailto: > > u...@flink.apache.org > > >>> " > > >>>>>>>>>>>>>> <u...@flink.apache.org <mailto:u...@flink.apache.org > >> > > >>>>>>>>>>>>>> Betreff: Re: Package multiple jobs in a single jar > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi Flavio, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> the pom from our quickstart is a good > > >>>>>>>>>>>>>> reference: > > >>>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>> > > >>>>>> > > >>>> > > >> > > > https://github.com/apache/flink/blob/master/flink-quickstart/flink-quickstart-java/src/main/resources/archetype-resources/pom.xml > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Fri, May 8, 2015 at 2:53 PM, Flavio Pompermaier > > >>>>>>>>>>>>>> <pomperma...@okkam.it <mailto:pomperma...@okkam.it>> > > >> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Ok, get it. > > >>>>>>>>>>>>>> And is there a reference pom.xml for shading my > > >>>>>> application > > >>>>>>>>>>> into > > >>>>>>>>>>>>>> one fat-jar? which flink dependencies can I > exclude? > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Fri, May 8, 2015 at 1:05 PM, Fabian Hueske < > > >>>>>>>>>>> fhue...@gmail.com > > >>>>>>>>>>>>>> <mailto:fhue...@gmail.com>> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> I didn't say that the main should return the > > >>>>>>>>>>>>>> ExecutionEnvironment. > > >>>>>>>>>>>>>> You can define and execute as many programs > in a > > >>>> main > > >>>>>>>>>>>>>> function as you like. > > >>>>>>>>>>>>>> The program can be defined somewhere else, > e.g., > > >> in > > >>>> a > > >>>>>>>>>>>>>> function that receives an ExecutionEnvironment > > and > > >>>>>>>>> attaches > > >>>>>>>>>>>>>> a program such as > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> public void > buildMyProgram(ExecutionEnvironment > > >>>> env) { > > >>>>>>>>>>>>>> DataSet<String> lines = > env.readTextFile(...); > > >>>>>>>>>>>>>> // do something > > >>>>>>>>>>>>>> lines.writeAsText(...); > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> That method could be invoked from main(): > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> psv main() { > > >>>>>>>>>>>>>> ExecutionEnv env = ... > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> if(...) { > > >>>>>>>>>>>>>> buildMyProgram(env); > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> else { > > >>>>>>>>>>>>>> buildSomeOtherProg(env); > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> env.execute(); > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> // run some more programs > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> 2015-05-08 12:56 GMT+02:00 Flavio Pompermaier > > >>>>>>>>>>>>>> <pomperma...@okkam.it <mailto: > > >> pomperma...@okkam.it > > >>>>>> : > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi Fabian, > > >>>>>>>>>>>>>> thanks for the response. > > >>>>>>>>>>>>>> So my mains should be converted in a > method > > >>>>>> returning > > >>>>>>>>>>>>>> the ExecutionEnvironment. > > >>>>>>>>>>>>>> However it think that it will be very nice > > to > > >>>>>> have a > > >>>>>>>>>>>>>> syntax like the one of the Hadoop > > >> ProgramDriver > > >>>> to > > >>>>>>>>>>>>>> define jobs to invoke from a single root > > >> class. > > >>>>>>>>>>>>>> Do you think it could be useful? > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Fri, May 8, 2015 at 12:42 PM, Fabian > > Hueske > > >>>>>>>>>>>>>> <fhue...@gmail.com <mailto: > > fhue...@gmail.com > > >>>> > > >>>>>>>>> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> You easily have multiple Flink > programs > > >> in a > > >>>>>>>>> single > > >>>>>>>>>>>>>> JAR file. > > >>>>>>>>>>>>>> A program is defined using an > > >>>>>>>>> ExecutionEnvironment > > >>>>>>>>>>>>>> and executed when you call > > >>>>>>>>>>>>>> ExecutionEnvironment.exeucte(). > > >>>>>>>>>>>>>> Where and how you do that does not > > matter. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> You can for example implement a main > > >>>> function > > >>>>>>>>> such > > >>>>>>>>>>>>> as: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> public static void main(String... > args) > > { > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> if (today == Monday) { > > >>>>>>>>>>>>>> ExecutionEnvironment env = ... > > >>>>>>>>>>>>>> // define Monday prog > > >>>>>>>>>>>>>> env.execute() > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> else { > > >>>>>>>>>>>>>> ExecutionEnvironment env = ... > > >>>>>>>>>>>>>> // define other prog > > >>>>>>>>>>>>>> env.execute() > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> } > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> 2015-05-08 11:41 GMT+02:00 Flavio > > >>>> Pompermaier > > >>>>>>>>>>>>>> <pomperma...@okkam.it <mailto: > > >>>>>>>>> pomperma...@okkam.it > > >>>>>>>>>>>>>>> : > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi to all, > > >>>>>>>>>>>>>> is there any way to keep multiple > > jobs > > >>>> in > > >>>>>> a > > >>>>>>>>> jar > > >>>>>>>>>>>>>> and then choose at runtime the one > > to > > >>>>>> execute > > >>>>>>>>>>>>>> (like what ProgramDriver does in > > >>>> Hadoop)? > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Best, > > >>>>>>>>>>>>>> Flavio > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>>> > > >>>>> > > >>>> > > >>>> > > >>> > > >> > > >> > > > > > > > >