Hi Volodymyr,

All good points. The Arrow/Drill conversion is a good option, especially for 
readers and clients. Between operators, such conversion is likely to introduce 
performance hits. As you know, the main feature that differentiates one query 
engine from another is performance, so adding conversions is unlikely to help 
Drill in the performance battle.

Flatten should actually be pretty simple with EVF. Creating repeated values is 
much like filling in implicit columns: set a value, then "copy down" n times.

Still, you raise good issues. Operators that fit your description are things 
like exchanges: these operators want to work at the low level of buffers. Not 
much the column readers/writers can do to help. And, as you point out, 
commercial components will be a challenge as Apache Drill does not maintain 
that code.

Your larger point is valid: no matter how we approach it, moving to Arrow is a 
large project that will break compatibility.

We've discussed a simple first step: Support an Arrow client to see if there is 
any interest. Support Arrow readers to see if that gives us any benefit. These 
are the visible tip of the iceberg. If we see advantages, we can then think 
about changing the internals; the vast bulk of the iceberg which is below water 
and unseen.

I think I disagree that we'd want to swap code that works directly with 
ValueVectors to code that works directly with ArrowVectors. Doing so locks us 
into someone else's memory format and forces Drill to change every time Arrow 
changes. Give the small size of the Drill team, and the frantic pace of Arrow 
change, This was the team's concern early on and I'm still not convinced this 
is a good strategy.

So, my original point remains: what is the benefit of all this cost? Is there 
another path that gives us greater benefit for the same or lesser cost? In 
short, what is our goal? Where do we want Drill to go?

In fact, another radical suggestion is to embrace the wonderful work done on 
Presto. Maybe Drill 2.0 is simply Presto. We focus on adding support for local 
files (Drill's unique strength), and embrace Presto's great support for data 
types, connectors, UDFs, clients and so on.

As a team, we should ask the fundamental question: What benefits can Drill 
offer that are not already offered by, say Presto or commercial Drill 
derivatives? If new can answer that question, we'll have a better idea about 
whether investment in Arrow will get us there.

Or, are we better off to just leave well enough alone as we have done for 
several years?

Thanks,
- Paul

 

    On Thursday, January 9, 2020, 05:57:52 AM PST, Volodymyr Vysotskyi 
<volody...@apache.org> wrote:  
 
 Hi all,

Glad to see that this discussion became active again!

I have some comments regarding the steps for moving from Drill Vectors to
Arrow Vectors.

No doubt that using EVF for all operators and readers instead of value
vectors will simplify things a lot.
But considering the target goal - integration with Arrow, it may be the
main show-stopper for it.
There may be some operators which would be hard to adapt to use EVF, for
example, I think Flatten operator will be among them since its
implementation deeply connected with value vectors.
Also, it requires moving all storage and format plugins to EVF, which also
may be problematic, for example, some plugins like MaprDB have specific
features, and it should be considered when moving to EVF.
Some other plugins are so obsolete, that I'm not sure that they still work
and that someone still uses it, so except moving to EVF, they should be
resurrected to verify that they weren't broken more than before.

This is a huge piece of work, and only after that, we will proceed with the
next step - integrating Arrow to EVF and then handling new Arrow-related
issues for all the operators and readers at the same time.

I propose to update these steps a little bit.
1. I agree that at first, we should extract EVF-related classes into a
separate module.
2. But as the next step, I propose to extract EVF API which doesn't depend
on the vector implementation (Drill vectors, or Arrow ones).
3. After that, introduce module with Arrow which also implements this EVF
API.
4. Introduce transformers that will be able to convert from Drill vectors
into Arrow vectors and vice versa. These transformers may be implemented to
work using EVF abstractions instead of operating with specific vector
implementations.

5.1. At this point, we can introduce Arrow connectors to fetch the data in
Arrow format or return it in such a format using transformers from step 4.

5.2. Also, at this point, we may start rewriting operators to EVF and
switching EVF implementation from the EVF based on Drill Vectors to the
implementation which uses Arrow Vectors. Or switching implementations for
existing EVF-based format plugins and fix newly discovered issues in Arrow.
Since at this point we will have operators which use Arrow format and
operators which use Drill Vectors format, we should insert operators that
transform one vector format to another introduced in step 4 between every
pair of operators which returns batches in a different format.

I know, that such an approach requires some additional work, like
introducing transformers from step 4 and may cause some performance
degradations for the case when format transformation is complex for some
types and when we still have sequences of operators with different formats.

But with this approach, transitioning to Arrow wouldn't be blocked until
everything is moved to EVF and it would be possible to transmit
step-by-step, and Drill still will be able to switch between formats if it
would be required.

Kind regards,
Volodymyr Vysotskyi


On Thu, Jan 9, 2020 at 2:45 PM Igor Guzenko <ihor.huzenko....@gmail.com>
wrote:

> Hi Paul,
>
> Though I have very limited knowledge about Arrow at the moment, I can
> highlight a few advantages of trying it:
>  1. Allows fixing all the long-standing nullability issues and provide
> better integration for storage plugins like Hive.
>                https://jira.apache.org/jira/browse/DRILL-1344
>                https://jira.apache.org/jira/browse/DRILL-3831
>                https://jira.apache.org/jira/browse/DRILL-4824
>                https://jira.apache.org/jira/browse/DRILL-7255
>                https://jira.apache.org/jira/browse/DRILL-7366
> 2. Some work was done by community to implement optimized Arrow readers for
> Parquet and other formats&tools. We could try to adopt and check whether we
> can benefit from them.
> 3. Since Arrow is under active development we could try their newest
> features, like Flight which promises improved data transfers over the
> network.
>
> Thanks,
> Igor
> On Wed, Jan 8, 2020 at 11:55 PM Paul Rogers <par0...@yahoo.com.invalid>
> wrote:
>
> > Hi Igor,
> >
> > Before diving into design issues, it may be worthwhile to think about the
> > premise: should Drill adopt Arrow as its internal memory layout? This is
> > the question that the team has wrestled with since Arrow was launched.
> > Arrow has three parts. Let's think about each.
> >
> > First is a direct memory layout. The approach you suggest will let us
> work
> > with the Arrow memory format. Use EVF to access vectors, then the
> > underlying vectors can be swapped from Drill to Arrow. But, what is the
> > advantage of using Arrow? The arrow layout isn't better than Drill's; it
> is
> > just different. Adopting the Arrow memory layout by itself provides
> little
> > benefit, but bit cost. This is one reason the team has been so reluctant
> to
> > atop Arrow.
> >
> > The only advantage of using the Arrow memory layout is if Drill could
> > benefit from code written for Arrow. The second part of Arrow is a set of
> > modules to manipulate vectors. Gandiva is the most prominent example.
> > However, there are major challenges. Most SQL operations are defined to
> > work on rows; some clever thinking will be needed to convert those
> > operations into a series of column operations. (Drill's codegen is NOT
> > columnar: it works row-by-row.) So, if we want to benefit from Gandiva,
> we
> > must completely rethink how we process batches.
> >
> > Is it worth doing all that work? The primary benefit would be
> performance.
> > But, it is not clear that our current implementation is the bottleneck.
> The
> > current implementation is row-based, code generated in Java. Would be
> great
> > for someone to do some benchmarks to show the benefit from adopting
> Gandiva
> > to see if the potential gain justifies the likely large development cost.
> >
> > The third advantage of using Arrow is to allow exchange of vectors
> between
> > Drill and Arrow-based clients or readers. As it turns out, this is not
> the
> > big win it seems. As we've discussed, we could easily create an
> Arrow-based
> > client for Drill -- there will be an RPC between the client and Drill and
> > we can use that to do format conversion.
> >
> > For readers, Drill will want control over batch sizes; Drill cannot
> > blindly accept whatever size vectors a reader chooses to produce. (More
> on
> > that later.) Incoming data will be subject to projection and selection,
> so
> > it will quickly move out of the incoming Arrow vectors into vector which
> > Drill creates.
> >
> > Arrow gets (or got) a lot of press. However, our job is to focus on
> what's
> > best for Drill. There actually might be a memory layout for Drill that is
> > better than Arrow (and better than our current vectors.) A couple of us
> did
> > a prototype some time ago that seemed to show promise. So, it is not
> clear
> > that adopting Arrow is necessarily a huge win: maybe it is, maybe not. We
> > need to figure it out.
> >
> > What IS clearly a huge win is the idea you outlined: creating a layer
> > between memory layout and the rest of Drill so that we can try out
> > different memory layouts to see what works best.
> >
> > Thanks,
> > - Paul
> >
> >
> >
> >    On Wednesday, January 8, 2020, 10:02:43 AM PST, Igor Guzenko <
> > ihor.huzenko....@gmail.com> wrote:
> >
> >  Hello Paul,
> >
> > I totally agree that integrating Arrow by simply replacing Vectors usage
> > everywhere will cause a disaster.
> > After the first look at the new *E*nhanced*V*ector*F*ramework and based
> on
> > your suggestions I think I have an idea to share.
> > In my opinion, the integration can be done in the two major stages:
> >
> > *1. Preparation Stage*
> >      1.1 Extract all EVF and related components to a separate module. So
> > the new separate module will depend only upon Vectors module.
> >      1.2 Step-by-step rewriting of all operators to use a higher-level
> > EVF module and remove Vectors module from exec and modules dependencies.
> >      1.3 Ensure that only module which depends on Vectors is the new EVF
> > one.
> > *2. Integration Stage*
> >        2.1 Add dependency on Arrow Vectors module into EVF module.
> >        2.2 Replace all usages of Drill Vectors & Protobuf Meta with
> Arrow
> > Vectors & Flatbuffers Meta in EVF module.
> >        2.3 Finalize integration by removing Drill Vectors module
> > completely.
> >
> >
> > *NOTE:* I think that any way we won't preserve any backward compatibility
> > for drivers and custom UDFs.
> > And proposed changes are a major step forward to be included in Drill 2.0
> > version.
> >
> >
> > Below is the very first list of packages that in future may be
> transformed
> > into EVF module:
> > *Module:* exec/Vectors
> > *Packages:*
> > org.apache.drill.exec.record.metadata - (An enhanced set of classes to
> > describe a Drill schema.)
> > org.apache.drill.exec.record.metadata.schema.parser
> >
> > org.apache.drill.exec.vector.accessor - (JSON-like readers and writers
> for
> > each kind of Drill vector.)
> > org.apache.drill.exec.vector.accessor.convert
> > org.apache.drill.exec.vector.accessor.impl
> > org.apache.drill.exec.vector.accessor.reader
> > org.apache.drill.exec.vector.accessor.writer
> > org.apache.drill.exec.vector.accessor.writer.dummy
> >
> > *Module:* exec/Java Execution Engine
> > *Packages:*
> > org.apache.drill.exec.physical.rowSet - (Record batches management)
> > org.apache.drill.exec.physical.resultSet - (Enhanced rowSet with memory
> > mgmt)
> > org.apache.drill.exec.physical.impl.scan - (Row set based scan)
> >
> > Thanks,
> > Igor Guzenko
> >
> >
>
  

Reply via email to