向hawq插入流数据
Insert streaming data to hawq
如何将流式数据插入到hawq中,并对在线数据进行查询。
我测试了 jdbc 插入,但性能很差。
之后我测试了用 flume 将数据写入 hdfs 并在 hawq 中创建了外部 table,但是 hawq 在 flume 关闭之前无法读取数据文件。问题是,如果我设置 flume 文件滚动非常低(1 分钟),几天后文件数量增加,这对 hdfs 不利。
第三种解决方案是hbase,但是因为我的大部分查询都是对很多数据的聚合,所以hbase不是一个好的解决方案(hbase适合获取单个数据)。
那么有这些限制,用hawq在线查询流式数据有什么好的解决方案吗?
如果您的源数据不在 hdfs 上,您可以尝试 gpdfist/named 使用 gpfdist external table 或 web external table 使用其他 linux 脚本将管道作为缓冲区.另一个解决方案是 spring xd gpfdist 模块。 http://docs.spring.io/spring-xd/docs/1.3.1.RELEASE/reference/html/#gpfdist
外部 Table 的另一个选项是使用 TRANSFORM 选项。这是 External Table 引用 gpfdist URL 并且 gpfdist 为您执行程序以获取数据的地方。这是一种拉技术而不是推技术。
详情如下:
External Table "TRANSFORM" Option
并且由于您提到了 JDBC,我编写了一个利用 gpfdist 的程序,该程序执行 Java 程序以通过 JDBC 获取数据。它适用于 Greenplum 和 HAWQ 以及任何 JDBC 来源。
既然你提到了 Flume,我将提供一些使用类似工具的替代方法 springxd。
你可以有一个 Kafka 主题,你可以在其中放置流式消息和 springxd 接收器作业,它可以写入 HAWQ。例如;
例如;如果你有一些流加载文件从 FTP 到 KAFKA 和 spring java 工作从 kafka 到 hawq。
作业部署 hawqbinjob --properties "module.hawqjob.count=2"
stream create --name ftpdocs --definition "ftp --host=me.local --remoteDir=/Users/me/DEV/FTP -- username=me --password=********** --localDir=/Users/me/DEV/data/binary --fixedDelay=0 | log
stream create --name file2kafka --definition "file --dir=/Users/me/DEV/data/binary --pattern=* --mode=ref --preventDuplicates=true --fixedDelay=1 | transform --expression=payload.getAbsolutePath() --outputType=text/plain | kafka --topic=mybin1 --brokerList=kafka1.localdomain:6667" --deploy
stream create --name --definition "kafka --zkconnect= kafka1.localdomain:2181 --topic=mybin1 | byte2string > queue:job:hawqbinjob" --deploy
这是获得并行度的一种方式,不限于 hdfs 文件打开问题。您可以通过多种方式扩展此模式,因为大多数流数据都是小型数据集。希望对您有所帮助。
如何将流式数据插入到hawq中,并对在线数据进行查询。
我测试了 jdbc 插入,但性能很差。
之后我测试了用 flume 将数据写入 hdfs 并在 hawq 中创建了外部 table,但是 hawq 在 flume 关闭之前无法读取数据文件。问题是,如果我设置 flume 文件滚动非常低(1 分钟),几天后文件数量增加,这对 hdfs 不利。
第三种解决方案是hbase,但是因为我的大部分查询都是对很多数据的聚合,所以hbase不是一个好的解决方案(hbase适合获取单个数据)。
那么有这些限制,用hawq在线查询流式数据有什么好的解决方案吗?
如果您的源数据不在 hdfs 上,您可以尝试 gpdfist/named 使用 gpfdist external table 或 web external table 使用其他 linux 脚本将管道作为缓冲区.另一个解决方案是 spring xd gpfdist 模块。 http://docs.spring.io/spring-xd/docs/1.3.1.RELEASE/reference/html/#gpfdist
外部 Table 的另一个选项是使用 TRANSFORM 选项。这是 External Table 引用 gpfdist URL 并且 gpfdist 为您执行程序以获取数据的地方。这是一种拉技术而不是推技术。
详情如下: External Table "TRANSFORM" Option
并且由于您提到了 JDBC,我编写了一个利用 gpfdist 的程序,该程序执行 Java 程序以通过 JDBC 获取数据。它适用于 Greenplum 和 HAWQ 以及任何 JDBC 来源。
既然你提到了 Flume,我将提供一些使用类似工具的替代方法 springxd。
你可以有一个 Kafka 主题,你可以在其中放置流式消息和 springxd 接收器作业,它可以写入 HAWQ。例如;
例如;如果你有一些流加载文件从 FTP 到 KAFKA 和 spring java 工作从 kafka 到 hawq。
作业部署 hawqbinjob --properties "module.hawqjob.count=2"
stream create --name ftpdocs --definition "ftp --host=me.local --remoteDir=/Users/me/DEV/FTP -- username=me --password=********** --localDir=/Users/me/DEV/data/binary --fixedDelay=0 | log
stream create --name file2kafka --definition "file --dir=/Users/me/DEV/data/binary --pattern=* --mode=ref --preventDuplicates=true --fixedDelay=1 | transform --expression=payload.getAbsolutePath() --outputType=text/plain | kafka --topic=mybin1 --brokerList=kafka1.localdomain:6667" --deploy
stream create --name --definition "kafka --zkconnect= kafka1.localdomain:2181 --topic=mybin1 | byte2string > queue:job:hawqbinjob" --deploy
这是获得并行度的一种方式,不限于 hdfs 文件打开问题。您可以通过多种方式扩展此模式,因为大多数流数据都是小型数据集。希望对您有所帮助。