2016-01-11 1 views
0

Это мой запрос, если текущие данные ID присутствует или отсутствует в базе данных CassandraПочему моя вставка данных в мою базу данных cassandra так медленно?

row = session.execute("SELECT * FROM articles where id = %s", [id]) 

Устранены сообщения в Кафки, то определить, существует ли или нет это сообщение в базе данных Cassandra, если он не существует, то он должен выполнить операцию вставки, если она существует, ее не следует вставлять в данные.

messages = consumer.get_messages(count=25) 

    if len(messages) == 0: 
     print 'IDLE' 
     sleep(1) 
     continue 

    for message in messages: 
     try: 
      message = json.loads(message.message.value) 
      data = message['data'] 
      if data: 
       for article in data: 
        source = article['source'] 
        id = article['id'] 
        title = article['title'] 
        thumbnail = article['thumbnail'] 
        #url = article['url'] 
        text = article['text'] 
        print article['created_at'],type(article['created_at']) 
        created_at = parse(article['created_at']) 
        last_crawled = article['last_crawled'] 
        channel = article['channel']#userid 
        category = article['category'] 
        #scheduled_for = created_at.replace(minute=created_at.minute + 5, second=0, microsecond=0) 
        scheduled_for=(datetime.utcnow() + timedelta(minutes=5)).replace(second=0, microsecond=0) 
        row = session.execute("SELECT * FROM articles where id = %s", [id]) 
        if len(list(row))==0: 
        #id parse base62 
         ids = [id[0:2],id[2:9],id[9:16]] 
         idstr='' 
         for argv in ids: 
          num = int(argv) 
          idstr=idstr+encode(num) 
         url='http://weibo.com/%s/%s?type=comment' % (channel,idstr) 
         session.execute("INSERT INTO articles(source, id, title,thumbnail, url, text, created_at, last_crawled,channel,category) VALUES (%s,%s, %s, %s, %s, %s, %s, %s, %s, %s)", (source, id, title,thumbnail, url, text, created_at, scheduled_for,channel,category)) 
         session.execute("INSERT INTO schedules(source,type,scheduled_for,id) VALUES (%s, %s, %s,%s) USING TTL 86400", (source,'article', scheduled_for, id)) 
         log.info('%s %s %s %s %s %s %s %s %s %s' % (source, id, title,thumbnail, url, text, created_at, scheduled_for,channel,category)) 


     except Exception, e: 
      log.exception(e) 
      #log.info('error %s %s' % (message['url'],body)) 
      print e 
      continue 

Edit:

У меня есть один идентификатор, который имеет только один уникальную строку таблицы, которые я хочу быть. Как только я добавляю разные расписания для уникального идентификатора, моя система выходит из строя. Добавьте это, если len (list (row)) == 0: это правильная мысль, но после этого моя система очень медленная.

Это мое описание таблицы:

DROP TABLE IF EXISTS schedules; 

CREATE TABLE schedules (
source text, 
type text, 
scheduled_for timestamp, 
id text, 
PRIMARY KEY (source, type, scheduled_for, id) 
); 

Это scheduled_for изменчива. Вот также конкретный пример

Hao article 2016-01-12 02:09:00+0800 3930462206848285 
Hao article 2016-01-12 03:09:00+0801 3930462206848285 
Hao article 2016-01-12 04:09:00+0802 3930462206848285 
Hao article 2016-01-12 05:09:00+0803 3930462206848285 

Спасибо за ваши ответы!

+0

Учитывая, что операции записи дешевы в то время как операции чтения не может быть, я думаю, что вид оптимизации вы пытаетесь сделать не имеет смысла. – Ralf

+0

@ Ralf Хорошо, так что бы предложило вместо этого? Спасибо за ваш ответ! – peter

+1

Просто вставьте запись еще раз? Или, по крайней мере, не выбирайте * из таблицы, а только идентификатор. Таким образом, вы сохраняете некоторую пропускную способность сети. (Я думаю, что Cassandra все еще загружает всю строку, может быть, кто-то может прокомментировать это.) В зависимости от вашего приложения выбор каждой строки перед вставкой имеет addtl. недостаток разбавления кэшей Cassandra, снижая производительность чтения для ваших пользователей. – Ralf

ответ

0

Почему бы вам не использовать insert if not exists?

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/insert_r.html

+1

Обратите внимание, что 'IF NOT EXISTS' также поставляется с штрафом за производительность. – Ralf

+1

Я полностью согласен, это типичный случай «читать перед записью», но, по крайней мере, это проще с точки зрения приложения и, возможно, более оптимизировано. –

+0

Я думаю, что это хуже, чем просто читать, прежде чем писать. Для IF NOT EXIST для работы Cassandra должна обеспечивать [согласованность по кластеру] (https://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_tunable_consistency_c.html). Если вы настроили кластер для возможной согласованности, вы потеряете все преимущества этой настройки. Но я предполагаю, что NOT NOT EXISTS не испортит содержимое кеша. – Ralf

Смежные вопросы