Каков наилучший способ переноса данных из BigTable / GAE Datastore в RDBMS? - PullRequest
1 голос
/ 11 октября 2011

Теперь, когда Google объявил о доступности облачного хранилища SQL для механизма приложений, каков будет лучший способ переноса существующих данных из BigTable / GAE Datastore в MySQL?

Чтобы ответить на прекрасные вопросы, поднятые Петром:

  • В моем конкретном сценарии я держал свою модель данных очень реляционной.
  • Я согласен отключить мой сайт на несколько часов для перехода или, по крайней мере, предупредить людей, что любые изменения, внесенные в течение следующих нескольких часов, будут потеряны из-за обслуживания базы данных и т. Д.
  • Мой набор данных не очень большой - на главной панели моего приложения указано 0,67 ГБ, а на странице статистики хранилища данных указано, что это больше 200 МБ.
  • Я использую Python.
  • Я не пользуюсь хранилищем блобов (хотя я думаю, что это отдельный вопрос по сравнению с переносом чистого хранилища данных - можно использовать перенос хранилища данных в MySql при сохранении хранилища блобов).
  • Я бы согласился заплатить разумную сумму (скажем, менее 100 долларов).
  • Я считаю, что мое приложение Master / Slave - оно было создано во время предварительного просмотра App Engine. Кажется, я не могу найти простой способ проверить это.

Похоже, что массовый загрузчик должен быть в состоянии использовать для загрузки данных в текстовый формат, который затем может быть загружен с помощью mysqlimport, но у меня нет опыта работы с любой из этих технологий. Кроме того, похоже, что Cloud SQL поддерживает только импорт mysqldumps, поэтому мне нужно было бы установить MqSQL локально, mysqlimport данных, затем выгрузить их, затем импортировать дамп?

Пример кода моей текущей модели, если он требуется:

class OilPatternCategory(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty()
    name = db.StringProperty(required=True)
    default = db.BooleanProperty(default=False)

class OilPattern(db.Model):
    version = db.IntegerProperty(default=2)
    user = db.UserProperty()
    name = db.StringProperty(required=True)
    length = db.IntegerProperty()
    description = db.TextProperty()
    sport = db.BooleanProperty(default=False)
    default = db.BooleanProperty(default=False)
    retired = db.BooleanProperty(default=False)
    category = db.CategoryProperty()

class League(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty(required=True)
    name = db.StringProperty(required=True)
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()

class Tournament(db.Model):
    version = db.IntegerProperty(default=1)
    user = db.UserProperty(required=True)
    name = db.StringProperty(required=True)
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()

class Series(db.Model):
    version = db.IntegerProperty(default=3)
    created = db.DateTimeProperty(auto_now_add=True)
    user = db.UserProperty(required=True)
    date = db.DateProperty()
    name = db.StringProperty()
    center = db.ReferenceProperty(Center)
    pattern = db.ReferenceProperty(OilPattern)
    league = db.ReferenceProperty(League)
    tournament = db.ReferenceProperty(Tournament)
    public = db.BooleanProperty(default=True)
    notes = db.TextProperty()
    allow_comments = db.BooleanProperty(default=True)
    complete = db.BooleanProperty(default=False)
    score = db.IntegerProperty(default=0)

class Game(db.Model):
    version = db.IntegerProperty(default=5)
    user = db.UserProperty(required=True)
    series = db.ReferenceProperty(Series)
    score = db.IntegerProperty()
    game_number = db.IntegerProperty()
    pair = db.StringProperty()
    notes = db.TextProperty()
    entry_mode = db.StringProperty(choices=entry_modes, default=default_entry_mode)

1 Ответ

1 голос
/ 18 июня 2013

Рассматривали ли вы использование фреймворка Map Reduce? Вы можете написать мапперы, которые хранят сущности хранилища данных в CloudSQL. Не забудьте добавить столбец для ключа хранилища данных, это может поможет вам избежать дублирования строк или выявления пропущенных строк.

Возможно, вы посмотрите на https://github.com/hudora/gaetk_replication для вдохновения на функции картографа.

...