如何从postgres数据库获取hadoop序列文件?

l0oc07j2  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(348)

我需要从postgres数据库到acumulo数据库获取数据。我们希望使用序列文件来运行map/reduce作业来实现这一点,但不确定如何启动。由于内部技术原因,我们需要避免sqoop。
如果没有sqoop,这可能吗?再说一次,我真的不知道从哪里开始。我是否编写了一个java类来将所有记录(数百万条)读入jdbc并以某种方式输出到hdfs序列文件?
谢谢你的意见!
p、 我应该提到使用分隔文件是我们现在面临的问题。有些字段是包含分隔符的长字符字段,因此无法正确解析。字段中甚至可能有一个选项卡。我们想从postgres直接转到hdfs而不需要解析。

qncylg1j

qncylg1j1#

可以将数据库中的数据导出为csv或制表符分隔、管道分隔或ctrl-a(unicode 0x0001)分隔的文件。然后,您可以将这些文件复制到hdfs中,并运行一个非常简单的mapreduce作业,甚至可能只包含一个Map器,并配置为读取所使用的文件格式并输出序列文件。
这将允许在hadoop集群的服务器之间分配创建序列文件的负载。
而且,这很可能不是一次性交易。您必须定期将postgres数据库中的数据加载到hdfs中。它们使您能够调整mapreduce作业以合并新数据。

dddzy1tm

dddzy1tm2#

您可以使用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序列化数据。

jrcvhitl

jrcvhitl3#

有http://sqoop.apache.org/ 你要怎么做就怎么做。

相关问题