> Great. Keep in mind that, since you have a UUID component at the front of your key, you are doing something like a random-write workload. So, as your data grows, if your PK column (and its bloom filters) ends up being larger than the available RAM for caching, each write may generate a disk seek which will make throughput plummet. This is unlike some other storage options like HBase which does "blind puts".
> Just something to be aware of, for performance planning. Thanks for letting me know. I'll keep a note. > I think in 1.3 it was called "kudu test loadgen" and may have fewer options available. Cool. I just run it on one of the TS node ('kudu test loadgen <hostname> --num-threads=8 --num-rows-per-thread=1000000 --table-num-buckets=32'), and got the following: Generator report time total : 5434.15 ms time per row: 0.000679268 ms ~1.5M / sec? looks good. Best, Chao On Wed, Nov 1, 2017 at 1:40 PM, Todd Lipcon <t...@cloudera.com> wrote: > On Wed, Nov 1, 2017 at 1:23 PM, Chao Sun <sunc...@uber.com> wrote: > >> Thanks Todd! I improved my code to use multi Kudu clients for processing >> the Kafka messages and >> was able to improve the number to 250K - 300K per sec. Pretty happy with >> this now. >> > > Great. Keep in mind that, since you have a UUID component at the front of > your key, you are doing something like a random-write workload. So, as your > data grows, if your PK column (and its bloom filters) ends up being larger > than the available RAM for caching, each write may generate a disk seek > which will make throughput plummet. This is unlike some other storage > options like HBase which does "blind puts". > > Just something to be aware of, for performance planning. > > >> >> Will take a look at the perf tool - looks very nice. It seems it is not >> available on Kudu 1.3 though. >> >> > I think in 1.3 it was called "kudu test loadgen" and may have fewer > options available. > > -Todd > > On Wed, Nov 1, 2017 at 12:23 AM, Todd Lipcon <t...@cloudera.com> wrote: >> >>> On Wed, Nov 1, 2017 at 12:20 AM, Todd Lipcon <t...@cloudera.com> wrote: >>> >>>> Sounds good. >>>> >>>> BTW, you can try a quick load test using the 'kudu perf loadgen' tool. >>>> For example something like: >>>> >>>> kudu perf loadgen my-kudu-master.example.com --num-threads=8 >>>> --num-rows-per-thread=1000000 --table-num-buckets=32 >>>> >>>> There are also a bunch of options to tune buffer sizes, flush options, >>>> etc. But with the default settings above on an 8-node cluster I have, I was >>>> able to insert 8M rows in 44 seconds (180k/sec). >>>> >>>> Adding --buffer-size-bytes=10000000 almost doubled the above >>>> throughput (330k rows/sec) >>>> >>> >>> One more quick datapoint: I ran the above command simultaneously (in >>> parallel) four times. Despite running 4x as many clients, they all >>> finished in the same time as a single client did (ie aggregate throughput >>> ~1.2M rows/sec). >>> >>> Again this isn't a scientific benchmark, and it's such a short burst of >>> activity that it doesn't represent a real workload, but 15k rows/sec is >>> definitely at least an order of magnitude lower than the peak throughput I >>> would expect. >>> >>> -Todd >>> >>> >>>> >>>> -Todd >>>> >>>> >>>> >>>>> On Tue, Oct 31, 2017 at 11:25 PM, Todd Lipcon <t...@cloudera.com> >>>>> wrote: >>>>> >>>>>> >>>>>> >>>>>> On Tue, Oct 31, 2017 at 11:14 PM, Chao Sun <sunc...@uber.com> wrote: >>>>>> >>>>>>> Thanks Zhen and Todd. >>>>>>> >>>>>>> Yes increasing the # of consumers will definitely help, but we also >>>>>>> want to test the best throughput we can get from Kudu. >>>>>>> >>>>>> >>>>>> Sure, but increasing the number of consumers can increase the >>>>>> throughput (without increasing the number of Kudu tablet servers). >>>>>> >>>>>> Currently, if you run 'top' on the TS nodes, do you see them using a >>>>>> high amount of CPU? Similar question for 'iostat -dxm 1' - high IO >>>>>> utilization? My guess is that at 15k/sec you are hardly utilizing the >>>>>> nodes, and you're mostly bound by round trip latencies, etc. >>>>>> >>>>>> >>>>>>> >>>>>>> I think the default batch size is 1000 rows? >>>>>>> >>>>>> >>>>>> In manual flush mode, it's up to you to determine how big your >>>>>> batches are. It will buffer until you call 'Flush()'. So you could wait >>>>>> until you've accumulated way more than 1000 to flush. >>>>>> >>>>>> >>>>>>> I tested with a few different options between 1000 and 200000, but >>>>>>> always got some number between 15K to 20K per sec. Also tried flush >>>>>>> background mode and 32 hash partitions but results are similar. >>>>>>> >>>>>> >>>>>> In your AUTO_FLUSH test, were you still calling Flush()? >>>>>> >>>>>> >>>>>>> The primary key is UUID + some string column though - they always >>>>>>> come in batches, e.g., 300 rows for uuid1 followed by 400 rows for >>>>>>> uuid2, >>>>>>> etc. >>>>>>> >>>>>> >>>>>> Given this, are you hash-partitioning on just the UUID portion of the >>>>>> PK? ie if your PK is (uuid, timestamp), you could hash-partitition on the >>>>>> UUID. This should ensure that you get pretty good batching of the writes. >>>>>> >>>>>> Todd >>>>>> >>>>>> >>>>>>> On Tue, Oct 31, 2017 at 6:25 PM, Todd Lipcon <t...@cloudera.com> >>>>>>> wrote: >>>>>>> >>>>>>>> In addition to what Zhen suggests, I'm also curious how you are >>>>>>>> sizing your batches in manual-flush mode? With 128 hash partitions, >>>>>>>> each >>>>>>>> batch is generating 128 RPCs, so if for example you are only batching >>>>>>>> 1000 >>>>>>>> rows at a time, you'll end up with a lot of fixed overhead in each RPC >>>>>>>> to >>>>>>>> insert just 1000/128 = ~8 rows. >>>>>>>> >>>>>>>> Generally I would expect an 8 node cluster (even with HDDs) to be >>>>>>>> able to sustain several hundred thousand rows/second insert rate. Of >>>>>>>> course, it depends on the size of the rows and also the primary key >>>>>>>> you've >>>>>>>> chosen. If your primary key is generally increasing (such as the kafka >>>>>>>> sequence number) then you should have very little compaction and good >>>>>>>> performance. >>>>>>>> >>>>>>>> -Todd >>>>>>>> >>>>>>>> On Tue, Oct 31, 2017 at 6:20 PM, Zhen Zhang <zhqu...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Maybe you can add your consumer number? In my opinion, >>>>>>>>> more threads to insert can give a better throughput. >>>>>>>>> >>>>>>>>> 2017-10-31 15:07 GMT+08:00 Chao Sun <sunc...@uber.com>: >>>>>>>>> >>>>>>>>>> OK. Thanks! I changed to manual flush mode and it increased to >>>>>>>>>> ~15K / sec. :) >>>>>>>>>> >>>>>>>>>> Is there any other tuning I can do to further improve this? and >>>>>>>>>> also, how much would >>>>>>>>>> SSD help in this case (only upsert)? >>>>>>>>>> >>>>>>>>>> Thanks again, >>>>>>>>>> Chao >>>>>>>>>> >>>>>>>>>> On Mon, Oct 30, 2017 at 11:42 PM, Todd Lipcon <t...@cloudera.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> If you want to manage batching yourself you can use the manual >>>>>>>>>>> flush mode. Easiest would be the auto flush background mode. >>>>>>>>>>> >>>>>>>>>>> Todd >>>>>>>>>>> >>>>>>>>>>> On Oct 30, 2017 11:10 PM, "Chao Sun" <sunc...@uber.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Todd, >>>>>>>>>>>> >>>>>>>>>>>> Thanks for the reply! I used a single Kafka consumer to pull >>>>>>>>>>>> the data. >>>>>>>>>>>> For Kudu, I was doing something very simple that basically just >>>>>>>>>>>> follow the example here >>>>>>>>>>>> <https://github.com/cloudera/kudu-examples/blob/master/java/java-sample/src/main/java/org/kududb/examples/sample/Sample.java> >>>>>>>>>>>> . >>>>>>>>>>>> In specific: >>>>>>>>>>>> >>>>>>>>>>>> loop { >>>>>>>>>>>> Insert insert = kuduTable.newInsert(); >>>>>>>>>>>> PartialRow row = insert.getRow(); >>>>>>>>>>>> // fill the columns >>>>>>>>>>>> kuduSession.apply(insert) >>>>>>>>>>>> } >>>>>>>>>>>> >>>>>>>>>>>> I didn't specify the flushing mode, so it will pick up the >>>>>>>>>>>> AUTO_FLUSH_SYNC as default? >>>>>>>>>>>> should I use MANUAL_FLUSH? >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> Chao >>>>>>>>>>>> >>>>>>>>>>>> On Mon, Oct 30, 2017 at 10:39 PM, Todd Lipcon < >>>>>>>>>>>> t...@cloudera.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hey Chao, >>>>>>>>>>>>> >>>>>>>>>>>>> Nice to hear you are checking out Kudu. >>>>>>>>>>>>> >>>>>>>>>>>>> What are you using to consume from Kafka and write to Kudu? Is >>>>>>>>>>>>> it possible that it is Java code and you are using the SYNC flush >>>>>>>>>>>>> mode? >>>>>>>>>>>>> That would result in a separate round trip for each record and >>>>>>>>>>>>> thus very >>>>>>>>>>>>> low throughput. >>>>>>>>>>>>> >>>>>>>>>>>>> Todd >>>>>>>>>>>>> >>>>>>>>>>>>> On Oct 30, 2017 10:23 PM, "Chao Sun" <sunc...@uber.com> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Hi, >>>>>>>>>>>>> >>>>>>>>>>>>> We are evaluating Kudu (version kudu 1.3.0-cdh5.11.1, revision >>>>>>>>>>>>> af02f3ea6d9a1807dcac0ec75bfbca79a01a5cab) on a 8-node cluster. >>>>>>>>>>>>> The data are coming from Kafka at a rate of around 30K / sec, >>>>>>>>>>>>> and hash partitioned into 128 buckets. However, with default >>>>>>>>>>>>> settings, Kudu >>>>>>>>>>>>> can only consume the topics at a rate of around 1.5K / second. >>>>>>>>>>>>> This is a >>>>>>>>>>>>> direct ingest with no transformation on the data. >>>>>>>>>>>>> >>>>>>>>>>>>> Could this because I was using the default configurations? >>>>>>>>>>>>> also we are using Kudu on HDD - could that also be related? >>>>>>>>>>>>> >>>>>>>>>>>>> Any help would be appreciated. Thanks. >>>>>>>>>>>>> >>>>>>>>>>>>> Best, >>>>>>>>>>>>> Chao >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Todd Lipcon >>>>>>>> Software Engineer, Cloudera >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Todd Lipcon >>>>>> Software Engineer, Cloudera >>>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Todd Lipcon >>>> Software Engineer, Cloudera >>>> >>> >>> >>> >>> -- >>> Todd Lipcon >>> Software Engineer, Cloudera >>> >> >> > > > -- > Todd Lipcon > Software Engineer, Cloudera >