Re: Re: Re: Re: Re: Kafka lost data issue
If producer doesn't get a response, retries but both produce-requests succeeded, you will get duplicates. Kafka does not have a Idempotent Producer. On Fri, Nov 13, 2015 at 4:35 AM, Prabhjot Bharajwrote: > Hi Gwen, > > If producer cant get a response but the message got committed, Because of > retries, can this producer be committing messages more than once?? > I'm trying to see this problem from the point of view of Idempotent > Producer > > Thanks, > Prabhjot > On Nov 13, 2015 1:26 PM, "Hawin Jiang" wrote: > >> Thanks Gwen for your excellent slides >> >> I will test it again based on your suggestions. >> >> >> >> >> Best regards >> Hawin >> >> On Thu, Nov 12, 2015 at 6:35 PM, Gwen Shapira wrote: >> >> > Hi, >> > >> > First, here's a handy slide-deck on avoiding data loss in Kafka: >> > >> > >> http://www.slideshare.net/gwenshap/kafka-reliability-when-it-absolutely-positively-has-to-be-there >> > >> > Note configuration parameters like the number of retries. >> > >> > Also, it looks like you are sending data to Kafka asynchronously, but >> you >> > don't have a callback - so if Send fails, you have no way of updating >> the >> > count, logging or anything else. I recommend taking a look at the >> callback >> > API for sending data and improving your test to at least record send >> > failures. >> > >> > Gwen >> > >> > >> > On Thu, Nov 12, 2015 at 11:10 AM, Hawin Jiang >> > wrote: >> > >> > > Hi Pradeep >> > > >> > > Here is my configuration >> > > >> > > # Producer Basics >> > # >> > > >> > > # list of brokers used for bootstrapping knowledge about the rest of >> the >> > > cluster >> > > # format: host1:port1,host2:port2 ... >> > > metadata.broker.list=localhost:9092 >> > > >> > > # name of the partitioner class for partitioning events; default >> > partition >> > > spreads data randomly >> > > #partitioner.class= >> > > >> > > # specifies whether the messages are sent asynchronously (async) or >> > > synchronously (sync) >> > > producer.type=sync >> > > >> > > # specify the compression codec for all data generated: none, gzip, >> > snappy, >> > > lz4. >> > > # the old config values work as well: 0, 1, 2, 3 for none, gzip, >> snappy, >> > > lz4, respectively >> > > compression.codec=none >> > > >> > > # message encoder >> > > serializer.class=kafka.serializer.DefaultEncoder >> > > >> > > # allow topic level compression >> > > #compressed.topics= >> > > >> > > # Async Producer >> > # >> > > # maximum time, in milliseconds, for buffering data on the producer >> queue >> > > #queue.buffering.max.ms= >> > > >> > > # the maximum size of the blocking queue for buffering on the producer >> > > #queue.buffering.max.messages= >> > > >> > > # Timeout for event enqueue: >> > > # 0: events will be enqueued immediately or dropped if the queue is >> full >> > > # -ve: enqueue will block indefinitely if the queue is full >> > > # +ve: enqueue will block up to this many milliseconds if the queue is >> > full >> > > #queue.enqueue.timeout.ms= >> > > >> > > # the number of messages batched at the producer >> > > #batch.num.messages= >> > > >> > > >> > > >> > > @Jinxing >> > > >> > > I have not found the kafka 0.8.3.0 on >> > > http://mvnrepository.com/artifact/org.apache.kafka/kafka_2.10. >> > > The latest release is 0.8.2.2. >> > > if we flush producer all the times, I think it will impact our >> > > performance. >> > > I just want to make sure how many messages in producer, then can be >> found >> > > it in consumer as well. >> > > We can not lost so many messages in our system. >> > > >> > > >> > > >> > > Best regards >> > > Hawin >> > > >> > > >> > > On Thu, Nov 12, 2015 at 7:02 AM, jinxing wrote: >> > > >> > > > i have 3 brokers; >> > > > the ack configuration is -1(all), meaning a message is sent >> > successfully >> > > > only after getting every broker's ack; >> > > > is this a bug? >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > At 2015-11-12 21:08:49, "Pradeep Gollakota" >> > > wrote: >> > > > >What is your producer configuration? Specifically, how many acks >> are >> > you >> > > > >requesting from Kafka? >> > > > > >> > > > >On Thu, Nov 12, 2015 at 2:03 AM, jinxing >> wrote: >> > > > > >> > > > >> in kafka_0.8.3.0: >> > > > >> kafkaProducer = new KafkaProducer<>(properties, new >> > > > ByteArraySerializer(), >> > > > >> new ByteArraySerializer()); >> > > > >> kafkaProducer.flush(); >> > > > >> you can call the flush after sending every few messages; >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> At 2015-11-12 17:36:24, "Hawin Jiang" >> > wrote: >> > > > >> >Hi Prabhjot >> > > > >> > >> > > > >> >The messages are "Thread1_kafka_1" and
Re: Re: Re: Re: Re: Kafka lost data issue
Hi Gwen, If producer cant get a response but the message got committed, Because of retries, can this producer be committing messages more than once?? I'm trying to see this problem from the point of view of Idempotent Producer Thanks, Prabhjot On Nov 13, 2015 1:26 PM, "Hawin Jiang"wrote: > Thanks Gwen for your excellent slides > > I will test it again based on your suggestions. > > > > > Best regards > Hawin > > On Thu, Nov 12, 2015 at 6:35 PM, Gwen Shapira wrote: > > > Hi, > > > > First, here's a handy slide-deck on avoiding data loss in Kafka: > > > > > http://www.slideshare.net/gwenshap/kafka-reliability-when-it-absolutely-positively-has-to-be-there > > > > Note configuration parameters like the number of retries. > > > > Also, it looks like you are sending data to Kafka asynchronously, but you > > don't have a callback - so if Send fails, you have no way of updating the > > count, logging or anything else. I recommend taking a look at the > callback > > API for sending data and improving your test to at least record send > > failures. > > > > Gwen > > > > > > On Thu, Nov 12, 2015 at 11:10 AM, Hawin Jiang > > wrote: > > > > > Hi Pradeep > > > > > > Here is my configuration > > > > > > # Producer Basics > > # > > > > > > # list of brokers used for bootstrapping knowledge about the rest of > the > > > cluster > > > # format: host1:port1,host2:port2 ... > > > metadata.broker.list=localhost:9092 > > > > > > # name of the partitioner class for partitioning events; default > > partition > > > spreads data randomly > > > #partitioner.class= > > > > > > # specifies whether the messages are sent asynchronously (async) or > > > synchronously (sync) > > > producer.type=sync > > > > > > # specify the compression codec for all data generated: none, gzip, > > snappy, > > > lz4. > > > # the old config values work as well: 0, 1, 2, 3 for none, gzip, > snappy, > > > lz4, respectively > > > compression.codec=none > > > > > > # message encoder > > > serializer.class=kafka.serializer.DefaultEncoder > > > > > > # allow topic level compression > > > #compressed.topics= > > > > > > # Async Producer > > # > > > # maximum time, in milliseconds, for buffering data on the producer > queue > > > #queue.buffering.max.ms= > > > > > > # the maximum size of the blocking queue for buffering on the producer > > > #queue.buffering.max.messages= > > > > > > # Timeout for event enqueue: > > > # 0: events will be enqueued immediately or dropped if the queue is > full > > > # -ve: enqueue will block indefinitely if the queue is full > > > # +ve: enqueue will block up to this many milliseconds if the queue is > > full > > > #queue.enqueue.timeout.ms= > > > > > > # the number of messages batched at the producer > > > #batch.num.messages= > > > > > > > > > > > > @Jinxing > > > > > > I have not found the kafka 0.8.3.0 on > > > http://mvnrepository.com/artifact/org.apache.kafka/kafka_2.10. > > > The latest release is 0.8.2.2. > > > if we flush producer all the times, I think it will impact our > > > performance. > > > I just want to make sure how many messages in producer, then can be > found > > > it in consumer as well. > > > We can not lost so many messages in our system. > > > > > > > > > > > > Best regards > > > Hawin > > > > > > > > > On Thu, Nov 12, 2015 at 7:02 AM, jinxing wrote: > > > > > > > i have 3 brokers; > > > > the ack configuration is -1(all), meaning a message is sent > > successfully > > > > only after getting every broker's ack; > > > > is this a bug? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > At 2015-11-12 21:08:49, "Pradeep Gollakota" > > > wrote: > > > > >What is your producer configuration? Specifically, how many acks are > > you > > > > >requesting from Kafka? > > > > > > > > > >On Thu, Nov 12, 2015 at 2:03 AM, jinxing > wrote: > > > > > > > > > >> in kafka_0.8.3.0: > > > > >> kafkaProducer = new KafkaProducer<>(properties, new > > > > ByteArraySerializer(), > > > > >> new ByteArraySerializer()); > > > > >> kafkaProducer.flush(); > > > > >> you can call the flush after sending every few messages; > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> At 2015-11-12 17:36:24, "Hawin Jiang" > > wrote: > > > > >> >Hi Prabhjot > > > > >> > > > > > >> >The messages are "Thread1_kafka_1" and "Thread2_kafka_1". > Something > > > > like > > > > >> >that. > > > > >> > > > > > >> >For GetOffsetShell report below: > > > > >> > > > > > >> >[kafka@dn-01 bin]$ ./kafka-run-class.sh > kafka.tools.GetOffsetShell > > > > >> >--broker-list dn-01:9092 --time -1 --topic kafka-test > > > > >> >kafka-test:0:12529261 > > > > >> > > > > > >> > > > > > >> > > > > > >> > > > > > >> >@Jinxing > > > > >> > > > > > >> >Can
Re: Re: Re: Re: Re: Kafka lost data issue
Thanks Gwen for your excellent slides I will test it again based on your suggestions. Best regards Hawin On Thu, Nov 12, 2015 at 6:35 PM, Gwen Shapirawrote: > Hi, > > First, here's a handy slide-deck on avoiding data loss in Kafka: > > http://www.slideshare.net/gwenshap/kafka-reliability-when-it-absolutely-positively-has-to-be-there > > Note configuration parameters like the number of retries. > > Also, it looks like you are sending data to Kafka asynchronously, but you > don't have a callback - so if Send fails, you have no way of updating the > count, logging or anything else. I recommend taking a look at the callback > API for sending data and improving your test to at least record send > failures. > > Gwen > > > On Thu, Nov 12, 2015 at 11:10 AM, Hawin Jiang > wrote: > > > Hi Pradeep > > > > Here is my configuration > > > > # Producer Basics > # > > > > # list of brokers used for bootstrapping knowledge about the rest of the > > cluster > > # format: host1:port1,host2:port2 ... > > metadata.broker.list=localhost:9092 > > > > # name of the partitioner class for partitioning events; default > partition > > spreads data randomly > > #partitioner.class= > > > > # specifies whether the messages are sent asynchronously (async) or > > synchronously (sync) > > producer.type=sync > > > > # specify the compression codec for all data generated: none, gzip, > snappy, > > lz4. > > # the old config values work as well: 0, 1, 2, 3 for none, gzip, snappy, > > lz4, respectively > > compression.codec=none > > > > # message encoder > > serializer.class=kafka.serializer.DefaultEncoder > > > > # allow topic level compression > > #compressed.topics= > > > > # Async Producer > # > > # maximum time, in milliseconds, for buffering data on the producer queue > > #queue.buffering.max.ms= > > > > # the maximum size of the blocking queue for buffering on the producer > > #queue.buffering.max.messages= > > > > # Timeout for event enqueue: > > # 0: events will be enqueued immediately or dropped if the queue is full > > # -ve: enqueue will block indefinitely if the queue is full > > # +ve: enqueue will block up to this many milliseconds if the queue is > full > > #queue.enqueue.timeout.ms= > > > > # the number of messages batched at the producer > > #batch.num.messages= > > > > > > > > @Jinxing > > > > I have not found the kafka 0.8.3.0 on > > http://mvnrepository.com/artifact/org.apache.kafka/kafka_2.10. > > The latest release is 0.8.2.2. > > if we flush producer all the times, I think it will impact our > > performance. > > I just want to make sure how many messages in producer, then can be found > > it in consumer as well. > > We can not lost so many messages in our system. > > > > > > > > Best regards > > Hawin > > > > > > On Thu, Nov 12, 2015 at 7:02 AM, jinxing wrote: > > > > > i have 3 brokers; > > > the ack configuration is -1(all), meaning a message is sent > successfully > > > only after getting every broker's ack; > > > is this a bug? > > > > > > > > > > > > > > > > > > > > > > > > At 2015-11-12 21:08:49, "Pradeep Gollakota" > > wrote: > > > >What is your producer configuration? Specifically, how many acks are > you > > > >requesting from Kafka? > > > > > > > >On Thu, Nov 12, 2015 at 2:03 AM, jinxing wrote: > > > > > > > >> in kafka_0.8.3.0: > > > >> kafkaProducer = new KafkaProducer<>(properties, new > > > ByteArraySerializer(), > > > >> new ByteArraySerializer()); > > > >> kafkaProducer.flush(); > > > >> you can call the flush after sending every few messages; > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> At 2015-11-12 17:36:24, "Hawin Jiang" > wrote: > > > >> >Hi Prabhjot > > > >> > > > > >> >The messages are "Thread1_kafka_1" and "Thread2_kafka_1". Something > > > like > > > >> >that. > > > >> > > > > >> >For GetOffsetShell report below: > > > >> > > > > >> >[kafka@dn-01 bin]$ ./kafka-run-class.sh kafka.tools.GetOffsetShell > > > >> >--broker-list dn-01:9092 --time -1 --topic kafka-test > > > >> >kafka-test:0:12529261 > > > >> > > > > >> > > > > >> > > > > >> > > > > >> >@Jinxing > > > >> > > > > >> >Can you share your flush example to me? How to avoid lost my > > messages? > > > >> >Thanks. > > > >> > > > > >> > > > > >> > > > > >> >Best regards > > > >> >Hawin > > > >> > > > > >> > > > > >> > > > > >> >On Thu, Nov 12, 2015 at 1:00 AM, jinxing > > wrote: > > > >> > > > > >> >> there is a flush api of the producer, you can call this to > prevent > > > >> >> messages lost; > > > >> >> > > > >> >> > > > >> >> maybe it can help; > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> > > > >> >> At 2015-11-12 16:43:54, "Hawin Jiang" > > wrote: > > > >> >>
Re: Re: Re: Re: Re: Kafka lost data issue
Hi, First, here's a handy slide-deck on avoiding data loss in Kafka: http://www.slideshare.net/gwenshap/kafka-reliability-when-it-absolutely-positively-has-to-be-there Note configuration parameters like the number of retries. Also, it looks like you are sending data to Kafka asynchronously, but you don't have a callback - so if Send fails, you have no way of updating the count, logging or anything else. I recommend taking a look at the callback API for sending data and improving your test to at least record send failures. Gwen On Thu, Nov 12, 2015 at 11:10 AM, Hawin Jiangwrote: > Hi Pradeep > > Here is my configuration > > # Producer Basics # > > # list of brokers used for bootstrapping knowledge about the rest of the > cluster > # format: host1:port1,host2:port2 ... > metadata.broker.list=localhost:9092 > > # name of the partitioner class for partitioning events; default partition > spreads data randomly > #partitioner.class= > > # specifies whether the messages are sent asynchronously (async) or > synchronously (sync) > producer.type=sync > > # specify the compression codec for all data generated: none, gzip, snappy, > lz4. > # the old config values work as well: 0, 1, 2, 3 for none, gzip, snappy, > lz4, respectively > compression.codec=none > > # message encoder > serializer.class=kafka.serializer.DefaultEncoder > > # allow topic level compression > #compressed.topics= > > # Async Producer # > # maximum time, in milliseconds, for buffering data on the producer queue > #queue.buffering.max.ms= > > # the maximum size of the blocking queue for buffering on the producer > #queue.buffering.max.messages= > > # Timeout for event enqueue: > # 0: events will be enqueued immediately or dropped if the queue is full > # -ve: enqueue will block indefinitely if the queue is full > # +ve: enqueue will block up to this many milliseconds if the queue is full > #queue.enqueue.timeout.ms= > > # the number of messages batched at the producer > #batch.num.messages= > > > > @Jinxing > > I have not found the kafka 0.8.3.0 on > http://mvnrepository.com/artifact/org.apache.kafka/kafka_2.10. > The latest release is 0.8.2.2. > if we flush producer all the times, I think it will impact our > performance. > I just want to make sure how many messages in producer, then can be found > it in consumer as well. > We can not lost so many messages in our system. > > > > Best regards > Hawin > > > On Thu, Nov 12, 2015 at 7:02 AM, jinxing wrote: > > > i have 3 brokers; > > the ack configuration is -1(all), meaning a message is sent successfully > > only after getting every broker's ack; > > is this a bug? > > > > > > > > > > > > > > > > At 2015-11-12 21:08:49, "Pradeep Gollakota" > wrote: > > >What is your producer configuration? Specifically, how many acks are you > > >requesting from Kafka? > > > > > >On Thu, Nov 12, 2015 at 2:03 AM, jinxing wrote: > > > > > >> in kafka_0.8.3.0: > > >> kafkaProducer = new KafkaProducer<>(properties, new > > ByteArraySerializer(), > > >> new ByteArraySerializer()); > > >> kafkaProducer.flush(); > > >> you can call the flush after sending every few messages; > > >> > > >> > > >> > > >> > > >> > > >> > > >> > > >> At 2015-11-12 17:36:24, "Hawin Jiang" wrote: > > >> >Hi Prabhjot > > >> > > > >> >The messages are "Thread1_kafka_1" and "Thread2_kafka_1". Something > > like > > >> >that. > > >> > > > >> >For GetOffsetShell report below: > > >> > > > >> >[kafka@dn-01 bin]$ ./kafka-run-class.sh kafka.tools.GetOffsetShell > > >> >--broker-list dn-01:9092 --time -1 --topic kafka-test > > >> >kafka-test:0:12529261 > > >> > > > >> > > > >> > > > >> > > > >> >@Jinxing > > >> > > > >> >Can you share your flush example to me? How to avoid lost my > messages? > > >> >Thanks. > > >> > > > >> > > > >> > > > >> >Best regards > > >> >Hawin > > >> > > > >> > > > >> > > > >> >On Thu, Nov 12, 2015 at 1:00 AM, jinxing > wrote: > > >> > > > >> >> there is a flush api of the producer, you can call this to prevent > > >> >> messages lost; > > >> >> > > >> >> > > >> >> maybe it can help; > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> > > >> >> At 2015-11-12 16:43:54, "Hawin Jiang" > wrote: > > >> >> >Hi Jinxing > > >> >> > > > >> >> >I don't think we can resolve this issue by increasing producers. > > if I > > >> >> >increased more producers, it should lost more messages. > > >> >> > > > >> >> >I just test two producers. > > >> >> >Thread Producer 1 has 83064 messages in producer side and 82273 > > >> messages > > >> >> in > > >> >> >consumer side > > >> >> >Thread Producer 2 has 89844 messages in producer side and 88892 > > >> messages > > >> >> in > > >> >> >consumer side. > > >> >> > > > >> >> >Thanks. > > >> >> > >
Re: Re: Re: Re: Re: Kafka lost data issue
Hi Pradeep Here is my configuration # Producer Basics # # list of brokers used for bootstrapping knowledge about the rest of the cluster # format: host1:port1,host2:port2 ... metadata.broker.list=localhost:9092 # name of the partitioner class for partitioning events; default partition spreads data randomly #partitioner.class= # specifies whether the messages are sent asynchronously (async) or synchronously (sync) producer.type=sync # specify the compression codec for all data generated: none, gzip, snappy, lz4. # the old config values work as well: 0, 1, 2, 3 for none, gzip, snappy, lz4, respectively compression.codec=none # message encoder serializer.class=kafka.serializer.DefaultEncoder # allow topic level compression #compressed.topics= # Async Producer # # maximum time, in milliseconds, for buffering data on the producer queue #queue.buffering.max.ms= # the maximum size of the blocking queue for buffering on the producer #queue.buffering.max.messages= # Timeout for event enqueue: # 0: events will be enqueued immediately or dropped if the queue is full # -ve: enqueue will block indefinitely if the queue is full # +ve: enqueue will block up to this many milliseconds if the queue is full #queue.enqueue.timeout.ms= # the number of messages batched at the producer #batch.num.messages= @Jinxing I have not found the kafka 0.8.3.0 on http://mvnrepository.com/artifact/org.apache.kafka/kafka_2.10. The latest release is 0.8.2.2. if we flush producer all the times, I think it will impact our performance. I just want to make sure how many messages in producer, then can be found it in consumer as well. We can not lost so many messages in our system. Best regards Hawin On Thu, Nov 12, 2015 at 7:02 AM, jinxingwrote: > i have 3 brokers; > the ack configuration is -1(all), meaning a message is sent successfully > only after getting every broker's ack; > is this a bug? > > > > > > > > At 2015-11-12 21:08:49, "Pradeep Gollakota" wrote: > >What is your producer configuration? Specifically, how many acks are you > >requesting from Kafka? > > > >On Thu, Nov 12, 2015 at 2:03 AM, jinxing wrote: > > > >> in kafka_0.8.3.0: > >> kafkaProducer = new KafkaProducer<>(properties, new > ByteArraySerializer(), > >> new ByteArraySerializer()); > >> kafkaProducer.flush(); > >> you can call the flush after sending every few messages; > >> > >> > >> > >> > >> > >> > >> > >> At 2015-11-12 17:36:24, "Hawin Jiang" wrote: > >> >Hi Prabhjot > >> > > >> >The messages are "Thread1_kafka_1" and "Thread2_kafka_1". Something > like > >> >that. > >> > > >> >For GetOffsetShell report below: > >> > > >> >[kafka@dn-01 bin]$ ./kafka-run-class.sh kafka.tools.GetOffsetShell > >> >--broker-list dn-01:9092 --time -1 --topic kafka-test > >> >kafka-test:0:12529261 > >> > > >> > > >> > > >> > > >> >@Jinxing > >> > > >> >Can you share your flush example to me? How to avoid lost my messages? > >> >Thanks. > >> > > >> > > >> > > >> >Best regards > >> >Hawin > >> > > >> > > >> > > >> >On Thu, Nov 12, 2015 at 1:00 AM, jinxing wrote: > >> > > >> >> there is a flush api of the producer, you can call this to prevent > >> >> messages lost; > >> >> > >> >> > >> >> maybe it can help; > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> > >> >> At 2015-11-12 16:43:54, "Hawin Jiang" wrote: > >> >> >Hi Jinxing > >> >> > > >> >> >I don't think we can resolve this issue by increasing producers. > if I > >> >> >increased more producers, it should lost more messages. > >> >> > > >> >> >I just test two producers. > >> >> >Thread Producer 1 has 83064 messages in producer side and 82273 > >> messages > >> >> in > >> >> >consumer side > >> >> >Thread Producer 2 has 89844 messages in producer side and 88892 > >> messages > >> >> in > >> >> >consumer side. > >> >> > > >> >> >Thanks. > >> >> > > >> >> > > >> >> > > >> >> >Best regards > >> >> >Hawin > >> >> > > >> >> > > >> >> >On Thu, Nov 12, 2015 at 12:24 AM, jinxing > wrote: > >> >> > > >> >> >> maybe there some changes in 0.9.0.0; > >> >> >> > >> >> >> > >> >> >> but still you can try increase producer sending rate, and see if > >> there > >> >> are > >> >> >> message lost but no exception; > >> >> >> > >> >> >> > >> >> >> note that, to increase the producer sending rate, you must have > >> enough > >> >> >> producer 'power'; > >> >> >> > >> >> >> > >> >> >> in my case, I have 50 producer sending message at the same time > : ) > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> > >> >> >> At 2015-11-12 16:16:23, "Hawin Jiang" > wrote: > >> >> >> >Hi Jinxing > >> >> >> > > >> >> >> >I am using kafka_2.10-0.9.0.0-SNAPSHOT. I have downloaded source > >> code > >> >> and > >> >>