2012-06-10 1 views
15

Имейте тип хранилища GAE с несколькими 100 000 единиц объектов в них. Хотите сделать несколько связанных запросов (включая подсчет запросов). Большой запрос кажется богом, подходящим для этого.Google App Engine: использование большого запроса в хранилище данных?

Есть ли в настоящее время простой способ запроса живого хранилища данных AppEngine с помощью Big Query?

ответ

17

Вы не можете запускать BigQuery непосредственно на объектах DataStore, но вы можете написать Piper Pipeline, который читает сущности из DataStore, записывает их в CSV в Google Cloud Storage и затем глотает их в BigQuery - вы даже можете автоматизировать процесс. Вот пример использования Mapper API классы для только DataStore в CSV шаг:

import re 
import time 
from datetime import datetime 
import urllib 
import httplib2 
import pickle 

from google.appengine.ext import blobstore 
from google.appengine.ext import db 
from google.appengine.ext import webapp 

from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext.webapp import blobstore_handlers 
from google.appengine.ext.webapp import util 
from google.appengine.ext.webapp import template 

from mapreduce.lib import files 
from google.appengine.api import taskqueue 
from google.appengine.api import users 

from mapreduce import base_handler 
from mapreduce import mapreduce_pipeline 
from mapreduce import operation as op 

from apiclient.discovery import build 
from google.appengine.api import memcache 
from oauth2client.appengine import AppAssertionCredentials 


#Number of shards to use in the Mapper pipeline 
SHARDS = 20 

# Name of the project's Google Cloud Storage Bucket 
GS_BUCKET = 'your bucket' 

# DataStore Model 
class YourEntity(db.Expando): 
    field1 = db.StringProperty() # etc, etc 

ENTITY_KIND = 'main.YourEntity' 


class MapReduceStart(webapp.RequestHandler): 
    """Handler that provides link for user to start MapReduce pipeline. 
    """ 
    def get(self): 
    pipeline = IteratorPipeline(ENTITY_KIND) 
    pipeline.start() 
    path = pipeline.base_path + "/status?root=" + pipeline.pipeline_id 
    logging.info('Redirecting to: %s' % path) 
    self.redirect(path) 


class IteratorPipeline(base_handler.PipelineBase): 
    """ A pipeline that iterates through datastore 
    """ 
    def run(self, entity_type): 
    output = yield mapreduce_pipeline.MapperPipeline(
     "DataStore_to_Google_Storage_Pipeline", 
     "main.datastore_map", 
     "mapreduce.input_readers.DatastoreInputReader", 
     output_writer_spec="mapreduce.output_writers.FileOutputWriter", 
     params={ 
      "input_reader":{ 
       "entity_kind": entity_type, 
       }, 
      "output_writer":{ 
       "filesystem": "gs", 
       "gs_bucket_name": GS_BUCKET, 
       "output_sharding":"none", 
       } 
      }, 
      shards=SHARDS) 


def datastore_map(entity_type): 
    props = GetPropsFor(entity_type) 
    data = db.to_dict(entity_type) 
    result = ','.join(['"%s"' % str(data.get(k)) for k in props]) 
    yield('%s\n' % result) 


def GetPropsFor(entity_or_kind): 
    if (isinstance(entity_or_kind, basestring)): 
    kind = entity_or_kind 
    else: 
    kind = entity_or_kind.kind() 
    cls = globals().get(kind) 
    return cls.properties() 


application = webapp.WSGIApplication(
            [('/start', MapReduceStart)], 
            debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

Если добавить это в конце своего класса IteratorPipeline: yield CloudStorageToBigQuery(output), вы можете трубы в результате CSV указатель_на_файл в глотания трубу BigQuery. .. как это:

class CloudStorageToBigQuery(base_handler.PipelineBase): 
    """A Pipeline that kicks off a BigQuery ingestion job. 
    """ 
    def run(self, output): 

# BigQuery API Settings 
SCOPE = 'https://www.googleapis.com/auth/bigquery' 
PROJECT_ID = 'Some_ProjectXXXX' 
DATASET_ID = 'Some_DATASET' 

# Create a new API service for interacting with BigQuery 
credentials = AppAssertionCredentials(scope=SCOPE) 
http = credentials.authorize(httplib2.Http()) 
bigquery_service = build("bigquery", "v2", http=http) 

jobs = bigquery_service.jobs() 
table_name = 'datastore_dump_%s' % datetime.utcnow().strftime(
    '%m%d%Y_%H%M%S') 
files = [str(f.replace('/gs/', 'gs://')) for f in output] 
result = jobs.insert(projectId=PROJECT_ID, 
        body=build_job_data(table_name,files)).execute() 
logging.info(result) 

def build_job_data(table_name, files): 
    return {"projectId": PROJECT_ID, 
      "configuration":{ 
       "load": { 
        "sourceUris": files, 
        "schema":{ 
         # put your schema here 
         "fields": fields 
         }, 
        "destinationTable":{ 
         "projectId": PROJECT_ID, 
         "datasetId": DATASET_ID, 
         "tableId": table_name, 
         }, 
        } 
       } 
      } 
2

Нет, BigQuery - это другой продукт, которому нужны данные для загрузки на него. Он не может работать над хранилищем данных. Вы можете использовать GQL для запроса хранилища данных.

3

Для BigQuery вам нужно экспортировать эти Kind в CSV или структуру записей с разделителями, загрузиться в BigQuery и вы можете запросить. Нет никакого объекта, который я знаю, который позволяет запрашивать реальное хранилище данных GAE.

Biquery - это аналитический механизм запросов, который означает, что вы не можете изменить запись. Никакое обновление или удаление не разрешено, вы можете добавлять только.

5

Мы делаем Доверенные программы Tester для перехода от Datastore к BigQuery в двух простых операций:

  1. резервного копирования т он DATASTORE используя функциональные возможности резервного копирования DATASTORE для Admin
  2. резервного копирования Импорт непосредственно в BigQuery

Он автоматически заботится о схеме для вас.

Более подробную информацию (применить): https://docs.google.com/a/google.com/spreadsheet/viewform?formkey=dHdpeXlmRlZCNWlYSE9BcE5jc2NYOUE6MQ

+0

Так что случилось с этим? Любое обновление судьбы TTP? – gae123

+0

Да, это было какое-то время – ZiglioUK

+0

Также заинтересовался – Omri

6

С новым (с сентября 2013 года) streaming inserts api вы можете импортировать записи из вашего приложения в BigQuery.

Данные доступны в BigQuery сразу, поэтому это должно удовлетворять вашим требованиям.

Хотя этот вопрос теперь староват, это может быть простым решением для тех, кто наткнуться на этот вопрос

На данный момент, хотя получение этой программы для работы с локальным сервер DEV пятнистый в лучшем случае.

1

Начиная с 2016 года, это возможно сейчас! Вы должны сделать следующее:

  1. Создайте новый ковш в хранилище Google
  2. Резервные субъекты, эксплуатирующие с помощью администратора базы данных на console.developers.google.com У меня есть полный учебник
  3. Head для BigQuery Web UI , и импортировать файлы, сгенерированные на шаге 1.

См. this post для получения полного примера этого рабочего процесса!