2013-09-03 3 views
1

Мне нужно получить данные из базы данных Postgres в базу данных Accumulo. Мы надеемся использовать файлы последовательности для запуска работы с картой/сокращением, но не знаем, как начать. По внутренним техническим причинам нам нужно избегать Sqoop.Как добраться из базы данных Postgres до файла последовательности Hadoop?

Возможно ли это без Sqoop? Опять же, я действительно не знаю, с чего начать. Я пишу класс java для чтения всех записей (миллионов) в JDBC и каким-то образом выводит их в файл последовательности HDFS?

Спасибо за любой ввод!

P.S. - Я должен был упомянуть, что использование файла с разделителями - проблема, с которой мы сталкиваемся сейчас. Некоторые из наших являются длинными символьными полями, которые содержат разделитель, и поэтому не анализируются правильно. Поле может содержать даже вкладку. Мы хотели перейти из Postgres прямо в HDFS без синтаксического анализа.

ответ

0

Вы можете экспортировать данные из своей базы данных в виде файлов с разделителями CSV или разделителями с разделителями-разделителями или с разделителями-ограничителями, или с Ctrl-A (Unicode 0x0001). Затем вы можете скопировать эти файлы в HDFS и запустить очень простое задание MapReduce, возможно, даже состоящее только из Mapper и настроенное для чтения формата файла, который вы использовали, и для вывода файлов последовательности.

Это позволит распределить нагрузку для создания файлов последовательности между серверами кластера Hadoop.

Также, скорее всего, это будет не одноразовая сделка. Вам придется загружать данные из базы данных Postgres в HDFS на регулярной основе. Они могли бы настроить ваше задание MapReduce для объединения новых данных.

+0

Я должен был упомянуть, что использование разделительного файла - проблема, с которой мы имеем сейчас. Некоторые из наших являются длинными символьными полями, которые содержат разделитель, и поэтому не анализируются правильно. Поле может содержать даже вкладку. Мы хотели перейти из Postgres прямо в HDFS без синтаксического анализа. – user1660256

+0

@ user1660256: Кажется, вы просто пинали банку по дороге. Как вы планируете обрабатывать данные при загрузке в HDFS? В какой-то момент вам придется разбираться. – Olaf

+0

Я не уверен, что понимаю вас. Как только он находится в файле последовательности, данные будут в парах ключ/значение, и мы будем загружать значение как это без какого-либо анализа, не заботясь о том, были ли разделители в значении или нет. – user1660256

1

Вы можете сериализовать свои данные с помощью Avro, хотя это будет не очень быстро (особенно при использовании python, как в примере), а затем загрузить это в hdfs.

Если у вас есть базы данных Foo:

postgres=# \c foo 
You are now connected to database "foo" as user "user". 
foo=# 

foo=# \d bar 
           Table "public.bar" 
Column |   Type   |      Modifiers      
--------+-------------------------+--------------------------------------------------- 
key | integer     | not null default nextval('bar_key_seq'::regclass) 
value | character varying(1024) | not null 

Вы можете создать Avro схему, как показано ниже:

{"namespace": "foo.avro", 
"type": "record", 
"name": "bar", 
"fields": [ 
    {"name": "id", "type": "int"}, 
    {"name": "value", "type": "string"} 
] 
} 

А затем сериализовать строки данных по строкам:

import psycopg2 
import avro.schema 
from avro.datafile import DataFileReader, DataFileWriter 
from avro.io import DatumReader, DatumWriter 

schema = avro.schema.parse(open("foo.avsc").read()) 
writer = DataFileWriter(open("foo.avro", "w"), DatumWriter(), schema) 

c = psycopg2.connect(user='user', password='s3cr3t', database='foo') 
cur = c.cursor() 
cur.execute('SELECT * FROM bar') 

for row in cur.fetchall(): 
    writer.append({"id": row[0], "value": row[1]}) 

writer.close() 
cur.close() 
c.close() 

В качестве альтернативы вы может использовать сериализацию ваших данных с помощью простого json.

+0

Это то, что я хотел бы сделать, но я надеюсь, что для этого уже есть инструмент для экспорта из PostgreSQL в Avro и импорта файлов Avro в PostgreSQL. –

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