Есть ли способ экспортировать результаты из Pig непосредственно в базу данных, такую как mysql?Способ экспорта результатов из Pig в базу данных
ответ
Принимая во внимание, что сказал orangeoctopus (остерегайтесь DDOS ...), вы имели дело с DBStorage?
data = LOAD '...' AS (...);
...
STORE data INTO DBStorage('com.mysql.jdbc.Driver', 'dbc:mysql://host/db', 'INSERT ...');
Основная проблема, которую я вижу, заключается в том, что каждый редуктор эффективно вставляется в базу данных примерно в одно и то же время.
Если вы не думаете, что это будет проблемой, я предлагаю вам написать custom Storage method, который использует JDBC (или что-то подобное) для непосредственного вставки в базу данных и ничего не записывающего в HDFS.
Если вы боитесь совершить DDOS-атаку в своей собственной базе данных, возможно, сбор данных на HDFS и выполнение отдельной массовой загрузки в mysql будет лучше.
В настоящее время я экспериментирую со встроенным приложением свиней, которое загружает результаты в mysql через PigServer.OpenIterator и соединение JDBC. В тестах он очень хорошо работал, но я еще не пробовал его в масштабе. Это похоже на уже предложенный пользовательский метод хранения, но выполняется из одной точки, поэтому не происходит случайной атаки DDOS. Вы фактически в конечном итоге оплачиваете стоимость сетевой передачи дважды (кластер -> промежуточная машина, промежуточная машина -> сервер БД), если вы не запускаете загрузку с сервера БД (я лично предпочитаю запускать ничего, кроме самого БД из БД сервер), но это ничем не отличается от опции «написать файл и загрузить его».
Sqoop может быть хорошим способом пойти, но это трудно установить-вверх (ИМХО), как и все эти связанные Hadoop проекты ...
DBStorage Свиньи является (как минимум для хранения).
Не забудьте зарегистрировать PiggyBank и драйвер MySQL:
-- Register Piggy bank
REGISTER /opt/cmr/pig/pig-0.10.0/lib/piggybank.jar;
-- Register MySQL driver
REGISTER /opt/cmr/mysql/drivers/mysql-connector-java-5.1.15-bin.jar
Вот пример вызова:
-- Store a relation into a SQL table
STORE relation INTO 'unused' USING org.apache.pig.piggybank.storage.DBStorage('com.mysql.jdbc.Driver', 'jdbc:mysql://<mysqlserver>/<database>', '<login>', '<password>', 'REPLACE INTO <table> (<column1>, <column2>) VALUES (?, ?)');
Кажется, что нет никакого пути вокруг написания UDF, который использует JDBC. .благодаря! – Christoph