Hi David, In short to summarize:
1. I ingest data. Kudus maintenance threads stops working (soft memory limit) and incoming data is throttled. There are no errors reported on the client side. 2. I stop ingestion and wait until i *think* Kudu is finsished. 3. I restart Kudu. 4. I validate the inserted data by doing count(*) on groups of data in Kudu. For several groups, Kudu reports a lot of rows missing. 5. I ingest the same data again. Client reports that all row are already present. 6. Doing the count(*) exercise again now gives me the correct number of rows. This tells me that the data was ingested into Kudu on the first attempt but a scan did not find the data. Inserting the data again made it visible. Br, Petter 2017-12-07 21:39 GMT+01:00 David Alves <davidral...@gmail.com>: > Hi Petter > > I'd like to clarify what exactly happened and exactly what are you > referring to as "inconsistency". > From what I understand of the first error you observed, the Kudu was > underprovisioned, memory wise, and the ingest jobs/queries failed. Is that > right? Since Kudu doesn't have atomic multi-row writes, it's currently > expected in this case that you'll end up with partially written data. > If you tried the same job again, and it succeeded, for certain types of > operation (UPSERT, INSERT IGNORE) then the remaining rows would be written > and all the data would be there as expected. > I'd like to distinguish this lack of atomicity on multi-row > transactions from "inconsistency", which is what you might observe if an > operation didn't fail, but you couldn't see all the data. For this latter > case there are options you can choose to avoid any inconsistency. > > Best > David > > > > On Wed, Dec 6, 2017 at 4:26 AM, Petter von Dolwitz (Hem) < > petter.von.dolw...@gmail.com> wrote: > >> Thanks for your reply Andrew! >> >> >How did you verify that all the data was inserted and how did you find >> some data missing? >> This was done using Impala. We counted the rows for groups representing >> the chunks we inserted. >> >> >Following up on what I posted, take a look at >> https://kudu.apache.org/docs/transaction_semantics.html#_ >> read_operations_scans. It seems definitely possible that not all of the >> rows had finished inserting when counting, or that the scans were sent to a >> stale replica. >> Before we shut down we could only see the following in the logs. I.e., no >> sign that ingestion was still ongoing. >> >> kudu-tserver.ip-xx-yyy-z-nnn.root.log.INFO.20171201-065232.90314:I1201 >> 07:27:35.010694 90793 maintenance_manager.cc:383] P >> a38902afefca4a85a5469d149df9b4cb: we have exceeded our soft memory limit >> (current capacity is 67.52%). However, there are no ops currently runnable >> which would free memory. >> >> Also the (cloudera) metric total_kudu_rows_inserted_rate_across_kudu_replicas >> showed zero. >> >> Still it seems like some data became inconsistent after restart. But if >> the maintenance_manager performs important jobs that are required to ensure >> that all data is inserted then I can understand why we ended up with >> inconsistent data. But, if I understand you correct, you are saying that >> these jobs are not critical for ingestion. In the link you provided I read >> "Impala scans are currently performed as READ_LATEST and have no >> consistency guarantees.". I would assume this means that it does not >> guarantee consistency if new data is inserted but should give valid (and >> same) results if no new data is inserted? >> >> I have not tried the ksck tool yet. Thank you for reminding. I will have >> a look. >> >> Br, >> Petter >> >> >> 2017-12-06 1:31 GMT+01:00 Andrew Wong <aw...@cloudera.com>: >> >>> How did you verify that all the data was inserted and how did you find >>>> some data missing? I'm wondering if it's possible that the initial >>>> "missing" data was data that Kudu was still in the process of inserting >>>> (albeit slowly, due to memory backpressure or somesuch). >>>> >>> >>> Following up on what I posted, take a look at >>> https://kudu.apache.org/docs/transaction_semantics.html#_ >>> read_operations_scans. It seems definitely possible that not all of the >>> rows had finished inserting when counting, or that the scans were sent to a >>> stale replica. >>> >>> On Tue, Dec 5, 2017 at 4:18 PM, Andrew Wong <aw...@cloudera.com> wrote: >>> >>>> Hi Petter, >>>> >>>> When we verified that all data was inserted we found that some data was >>>>> missing. We added this missing data and on some chunks we got the >>>>> information that all rows were already present, i.e impala says something >>>>> like Modified: 0 rows, nnnnnnn errors. Doing the verification again now >>>>> shows that the Kudu table is complete. So, even though we did not insert >>>>> any data on some chunks, a count(*) operation over these chunks now >>>>> returns >>>>> a different value. >>>> >>>> >>>> How did you verify that all the data was inserted and how did you find >>>> some data missing? I'm wondering if it's possible that the initial >>>> "missing" data was data that Kudu was still in the process of inserting >>>> (albeit slowly, due to memory backpressure or somesuch). >>>> >>>> Now to my question. Will data be inconsistent if we recycle Kudu after >>>>> seeing soft memory limit warnings? >>>> >>>> >>>> Your data should be consistently written, even with those warnings. >>>> AFAIK they would cause a bit of slowness, not incorrect results. >>>> >>>> Is there a way to tell when it is safe to restart Kudu to avoid these >>>>> issues? Should we use any special procedure when restarting (e.g. only >>>>> restart the tablet servers, only restart one tablet server at a time or >>>>> something like that)? >>>> >>>> >>>> In general, you can use the `ksck` tool to check the health of your >>>> cluster. See https://kudu.apache.org/docs/command_line_tools_referenc >>>> e.html#cluster-ksck for more details. For restarting a cluster, I >>>> would recommend taking down all tablet servers at once, otherwise tablet >>>> replicas may try to replicate data from the server that was taken down. >>>> >>>> Hope this helped, >>>> Andrew >>>> >>>> On Tue, Dec 5, 2017 at 10:42 AM, Petter von Dolwitz (Hem) < >>>> petter.von.dolw...@gmail.com> wrote: >>>> >>>>> Hi Kudu users, >>>>> >>>>> We just started to use Kudu (1.4.0+cdh5.12.1). To make a baseline for >>>>> evaluation we ingested 3 month worth of data. During ingestion we were >>>>> facing messages from the maintenance threads that a soft memory limit were >>>>> reached. It seems like the background maintenance threads stopped >>>>> performing their tasks at this point in time. It also so seems like the >>>>> memory was never recovered even after stopping ingestion so I guess there >>>>> was a large backlog being built up. I guess the root cause here is that we >>>>> were a bit too conservative when giving Kudu memory. After a reststart a >>>>> lot of maintenance tasks were started (i.e. compaction). >>>>> >>>>> When we verified that all data was inserted we found that some data >>>>> was missing. We added this missing data and on some chunks we got the >>>>> information that all rows were already present, i.e impala says something >>>>> like Modified: 0 rows, nnnnnnn errors. Doing the verification again now >>>>> shows that the Kudu table is complete. So, even though we did not insert >>>>> any data on some chunks, a count(*) operation over these chunks now >>>>> returns >>>>> a different value. >>>>> >>>>> Now to my question. Will data be inconsistent if we recycle Kudu after >>>>> seeing soft memory limit warnings? >>>>> >>>>> Is there a way to tell when it is safe to restart Kudu to avoid these >>>>> issues? Should we use any special procedure when restarting (e.g. only >>>>> restart the tablet servers, only restart one tablet server at a time or >>>>> something like that)? >>>>> >>>>> The table design uses 50 tablets per day (times 90 days). It is 8 TB >>>>> of data after 3xreplication over 5 tablet servers. >>>>> >>>>> Thanks, >>>>> Petter >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Andrew Wong >>>> >>> >>> >>> >>> -- >>> Andrew Wong >>> >> >> >