I see, is the issue that we currently are using a JSON representation for options when being serialized and when we get some unknown option, we don't know how to convert it into its JSON form?
On Mon, Oct 15, 2018 at 2:41 PM Robert Bradshaw <rober...@google.com> wrote: > On Mon, Oct 15, 2018 at 11:30 PM Lukasz Cwik <lc...@google.com> wrote: > > > > On Mon, Oct 15, 2018 at 1:17 PM Robert Bradshaw <rober...@google.com> > wrote: > >> > >> On Mon, Oct 15, 2018 at 7:50 PM Lukasz Cwik <lc...@google.com> wrote: > >> > > >> > I agree with the sentiment for better error checking. > >> > > >> > We can try to make it such that the SDK can "fetch" the set of > options that the runner supports by making a call to the Job API. The API > could return a list of option names (descriptions for --help purposes and > also potentially the expected format) which would remove the worry around > "unknown" options. Yes I understand to be able to make the Job API call, we > may need to parse some options from the args parameters first and then > parse the unknown options after they are fetched. > >> > >> This is an interesting idea, but seems it could get quite complicated. > >> E.g. for delegating runners, one would first read the options to > >> determine which runner to fetch the options from, which would then > >> return a set of options that possibly depends on the values of some of > >> its options... > >> > >> > Alternatively, we can choose an explicit format upfront. > >> > To expand on the exact format for --runner_option=..., here are some > different ideas: > >> > 1) Specified multiple times, each one is an explicit flag > >> > --runner_option=--blah=bar --runner_option=--foo=baz1 > --runner_option=--foo=baz2 > >> > >> I'm -1 on this format. We should move away from the idea that options > >> == flags (as that doesn't compose well with other libraries that do > >> their own flags parsing). The ability to parse a set of flags into > >> options is just a convenience that an author may (or may not) choose > >> to use (e.g. when running pipelines a long-lived process like a > >> service or a notebook, the command line flags are almost certainly not > >> the right interface). > >> > >> > 2) specified multiple times, we drop the explicit flag > >> > --runner_option=blah=bar --runner_option=foo=baz1 > --runner_option=foo=baz2 > >> > >> This or (4) is my preference. > >> > >> > 3) we use a string which the runner can choose to interpret however > they want (JSON/XML shown below) > >> > --runner_option='{"blah": "bar", "foo": ["baz1", "baz2"]}' > >> > > --runner_option='<options><blah>bar</blah><foo>baz1</foo><foo>baz2</foo></options>' > >> > >> This would make validation hard. Also, I think it makes sense for some > >> runner options to be "shared" (parallelism") by convention, so letting > >> it be a free-form string wouldn't allow different runners to inspect > >> different bits. > >> > >> We should consider if we should use urns for namespacing, and > >> assigning semantic meaning to strings, here. > >> > >> > 4) we use a string which must be a specific format such as JSON > (allows the SDK to do simple validation): > >> > --runner_option='{"blah": "bar", "foo": ["baz1", "baz2"]}' > >> > >> I like this in that at least some validation can be performed, and > >> expectations of how to format richer types. On the other hand it gets > >> a bit verbose, given that most (I'd imagine) options will be simple. > >> As with normal options, > >> > >> --option1=value1 --option2=value2 > >> > >> is shorthand for {"option1": value1, "option2": value2}. > >> > > I lean to 4 the most. With 2, you run into issues of what does > --runner_option=foo=["a", "b"] --runner_option=foo=["c", "d"] mean? > > Is it an error or list of lists or concatenated. Similar issues for map > types represented via JSON object {...} > > We can err to be on the safe side unless/until an argument can be made > that merging is more natural. I just think this will be excessively > verbose to use. > > >> > I would strongly suggest that we go with the "fetch" approach, since > this makes the set of options discoverable and helps users find errors much > earlier in their pipeline. > >> > >> This seems like an advanced feature that SDKs may want to support, but > >> I wouldn't want to require this complexity for bootstrapping an SDK. > >> > > SDKs that are starting off wouldn't need to "fetch" options, they could > choose to not support runner options or they could choose to pass all > options through to the runner blindly. Fetching the options only provides > the SDK the ability to provide error checking upfront and useful error/help > messages. > > But how to even pass all options through blindly is exactly the > difficulty we're running into here. > > >> Regarding always keeping runner options separate, +1, though I'm not > >> sure the line is always clear. > >> > >> > >> > On Mon, Oct 15, 2018 at 8:04 AM Robert Bradshaw <rober...@google.com> > wrote: > >> >> > >> >> On Mon, Oct 15, 2018 at 3:58 PM Maximilian Michels <m...@apache.org> > wrote: > >> >> > > >> >> > I agree that the current approach breaks the pipeline options > contract > >> >> > because "unknown" options get parsed in the same way as options > which > >> >> > have been defined by the user. > >> >> > >> >> FWIW, I think we're already breaking this "contract." Unknown options > >> >> are silently ignored; with this change we just change how we record > >> >> them. It still feels a bit hacky though. > >> >> > >> >> > I'm not sure the `experiments` flag works for us. AFAIK it only > allows > >> >> > true/false flags. We want to pass all types of pipeline options to > the > >> >> > Runner. > >> >> > >> >> Experiments is an arbitrary set of strings, which can be of the form > >> >> "param=value" if that's useful. (Dataflow does this.) There is, > again, > >> >> no namespacing on the param names, but we could user urns or impose > >> >> some other structure here. > >> >> > >> >> > How to solve this? > >> >> > > >> >> > 1) Add all options of all Runners to each SDK > >> >> > We added some of the FlinkRunner options to the Python SDK but > realized > >> >> > syncing is rather cumbersome in the long term. However, we want > the most > >> >> > important options to be validated on the client side. > >> >> > >> >> I don't think this is sustainable in the long run. However, thinking > >> >> about this, in the worse case validation happens after construction > >> >> but before execution (as with much of our other validation) so it > >> >> isn't that bad. > >> >> > >> >> > 2) Pass "unknown" options via a separate list in the Proto which > can > >> >> > only be accessed internally by the Runners. This still allows > passing > >> >> > arbitrary options but we wouldn't leak unknown options and display > them > >> >> > as top-level options. > >> >> > >> >> I think there needs to be a way for the user to communicate values > >> >> directly to the runner regardless of the SDK. My preference would be > >> >> to make this explicit, e.g. (repeated) --runner_option=..., rather > >> >> than scooping up all unknown flags at command line parsing time. > >> >> Perhaps an SDK that is aware of some runners could choose to lift > >> >> these as top-level options, but still pass them as runner options. > >> >> > >> >> > On 13.10.18 02:34, Charles Chen wrote: > >> >> > > The current release branch > >> >> > > (https://github.com/apache/beam/commits/release-2.8.0) was cut > after the > >> >> > > revert went in. Sent out > https://github.com/apache/beam/pull/6683 as a > >> >> > > revert of the revert. Regarding your comment above, I can help > out with > >> >> > > the design / PR reviews for common Python code as you suggest. > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 4:48 PM Thomas Weise <t...@apache.org > >> >> > > <mailto:t...@apache.org>> wrote: > >> >> > > > >> >> > > Thanks, will tag you and looking forward to feedback so we > can > >> >> > > ensure that changes work for everyone. > >> >> > > > >> >> > > Looking at the PR, I see agreement from Max to revert the > change on > >> >> > > the release branch, but not in master. Would you mind to > restore it > >> >> > > in master? > >> >> > > > >> >> > > Thanks > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 4:40 PM Ahmet Altay < > al...@google.com > >> >> > > <mailto:al...@google.com>> wrote: > >> >> > > > >> >> > > > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 11:31 AM, Charles Chen < > c...@google.com > >> >> > > <mailto:c...@google.com>> wrote: > >> >> > > > >> >> > > What I mean is that a user may find that it works > for them > >> >> > > to pass "--myarg blah" and access it as > "options.myarg" > >> >> > > without explicitly defining a "my_arg" flag due to > the added > >> >> > > logic. This is not the intended behavior and we may > want to > >> >> > > change this implementation detail in the future. > However, > >> >> > > having this logic in a released version makes it > hard to > >> >> > > change this behavior since users may erroneously > depend on > >> >> > > this undocumented behavior. Instead, we should > namespace / > >> >> > > scope this so that it is obvious that this is meant > for > >> >> > > runner (and not Beam user) consumption. > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 10:48 AM Thomas Weise > >> >> > > <t...@apache.org <mailto:t...@apache.org>> wrote: > >> >> > > > >> >> > > Can you please elaborate more what practical > problems > >> >> > > this introduces for users? > >> >> > > > >> >> > > I can see that this change allows a user to > specify a > >> >> > > runner specific option, which in the future may > change > >> >> > > because we decide to scope differently. If this > only > >> >> > > affects users of the portable Flink runner (like > us), > >> >> > > then no need to revert, because at this early > stage we > >> >> > > prefer something that works over being blocked. > >> >> > > > >> >> > > It would also be really great if some of the > core Python > >> >> > > SDK developers could help out with the design > aspects > >> >> > > and PR reviews of changes that affect common > Python > >> >> > > code. Anyone who specifically wants to be tagged > on > >> >> > > relevant JIRAs and PRs? > >> >> > > > >> >> > > > >> >> > > I would be happy to be tagged, and I can also help with > >> >> > > including other relevant folks whenever possible. In > general I > >> >> > > think Robert, Charles, myself are good candidates. > >> >> > > > >> >> > > > >> >> > > Thanks > >> >> > > > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 10:20 AM Ahmet Altay > >> >> > > <al...@google.com <mailto:al...@google.com>> > wrote: > >> >> > > > >> >> > > > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 10:11 AM, Charles > Chen > >> >> > > <c...@google.com <mailto:c...@google.com>> > wrote: > >> >> > > > >> >> > > For context, I made comments on > >> >> > > https://github.com/apache/beam/pull/6600 > noting > >> >> > > that the changes being made were not > good for > >> >> > > Beam backwards-compatibility. The > change as is > >> >> > > allows users to use pipeline options > without > >> >> > > explicitly defining them, which is not > the type > >> >> > > of usage we would like to encourage > since we > >> >> > > prefer to be explicit whenever > possible. If > >> >> > > users write pipelines with this sort of > pattern, > >> >> > > they will potentially encounter pain when > >> >> > > upgrading to a later version since this > is an > >> >> > > implementation detail and not an > officially > >> >> > > supported pattern. I agree with the > comments > >> >> > > above that this is ultimately a scoping > issue. > >> >> > > I would not have a problem with these > changes if > >> >> > > they were explicitly scoped under either > a > >> >> > > runner or unparsed options namespace. > >> >> > > > >> >> > > As a second note, since the 2.8.0 > release is > >> >> > > being cut right now, because of these > >> >> > > backwards-compatibility concerns, I would > >> >> > > suggest reverting these changes, at > least until > >> >> > > 2.8.0 is cut, so we can have a > discussion here > >> >> > > before committing to and releasing any > API-level > >> >> > > changes. > >> >> > > > >> >> > > > >> >> > > +1 I would like to revert the changes in > order not > >> >> > > rush this into the release. Once this > discussion > >> >> > > results in an agreement changes can be > brought back. > >> >> > > > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 9:26 AM Henning > Rohde > >> >> > > <hero...@google.com <mailto: > hero...@google.com>> > >> >> > > wrote: > >> >> > > > >> >> > > Agree that pipeline options lack some > >> >> > > mechanism for scoping. It is also > not always > >> >> > > possible distinguish options meant > to be > >> >> > > consumed at pipeline construction > time, by > >> >> > > the runner, by the SDK harness, by > the user > >> >> > > code or any combination -- and this > causes > >> >> > > confusion every now and then. > >> >> > > > >> >> > > For Dataflow, we have been using > >> >> > > "experiments" for arbitrary > runner-specific > >> >> > > options. It's simply a string list > pipeline > >> >> > > option that all SDKs support and, > for Go at > >> >> > > least, is sent to portable runners. > Flink > >> >> > > can do the same in the short term to > move > >> >> > > forward. > >> >> > > > >> >> > > Henning > >> >> > > > >> >> > > > >> >> > > On Fri, Oct 12, 2018 at 8:50 AM > Thomas Weise > >> >> > > <t...@apache.org <mailto: > t...@apache.org>> wrote: > >> >> > > > >> >> > > [moving to the list] > >> >> > > > >> >> > > The requirement driving this > part of the > >> >> > > change was to allow a user to > specify > >> >> > > pipeline options that a runner > supports > >> >> > > without having to declare those > in each > >> >> > > language SDK. > >> >> > > > >> >> > > In the specific scenario, we have > >> >> > > options that the Flink runner > supports > >> >> > > (and can validate), that are not > >> >> > > enumerated in the Python SDK. > >> >> > > > >> >> > > I think we have a bigger problem > scoping > >> >> > > pipeline options. For example, > the > >> >> > > runner options are dumped into > the SDK > >> >> > > worker. There is also a > possibility of > >> >> > > name collisions. So I think this > would > >> >> > > benefit from broader feedback. > >> >> > > > >> >> > > Thanks, > >> >> > > Thomas > >> >> > > > >> >> > > > >> >> > > ---------- Forwarded message > --------- > >> >> > > From: *Charles Chen* > >> >> > > <notificati...@github.com > >> >> > > <mailto:notificati...@github.com > >> > >> >> > > Date: Fri, Oct 12, 2018 at 8:36 > AM > >> >> > > Subject: Re: [apache/beam] > [BEAM-5442] > >> >> > > Store duplicate unknown options > in a > >> >> > > list argument (#6600) > >> >> > > To: apache/beam < > b...@noreply.github.com > >> >> > > <mailto:b...@noreply.github.com > >> > >> >> > > Cc: Thomas Weise < > thomas.we...@gmail.com > >> >> > > <mailto:thomas.we...@gmail.com > >>, > >> >> > > Mention < > ment...@noreply.github.com > >> >> > > <mailto: > ment...@noreply.github.com>> > >> >> > > > >> >> > > > >> >> > > CC: @tweise < > https://github.com/tweise> > >> >> > > > >> >> > > — > >> >> > > You are receiving this because > you were > >> >> > > mentioned. > >> >> > > Reply to this email directly, > view it on > >> >> > > GitHub > >> >> > > < > https://github.com/apache/beam/pull/6600#issuecomment-429367754>, > >> >> > > or mute the thread > >> >> > > < > https://github.com/notifications/unsubscribe-auth/AAQGDwwt15R85eq9pySUisyxq2HYz-Vyks5ukLcLgaJpZM4XMo-T > >. > >> >> > > > >> >> > > > >> >> > > >