使用 java 代码将数据从 postgresql 迁移到 hdfs
Migrating data from postgresql to hdfs using a java code
我是 Hadoop 新手,任务是使用 java 代码将结构化数据迁移到 HDFS。我知道 Sqoop 可以完成同样的任务,但这不是我的任务。
谁能解释一下这样做的可能方法。
我确实尝试过。我所做的是使用 jdbc 驱动程序从 psql 服务器复制数据,然后将其以 csv 格式存储在 HDFS 中。这是解决此问题的正确方法吗?
我了解到 Hadoop 有自己的数据类型来存储结构化数据。你能解释一下这是怎么发生的吗?
谢谢。
Sqoop 是一个简单的工具,可以执行以下操作。
1) 连接到 RDBMS (postgresql) 并获取 table 的元数据并创建 table 的 pojo(a Java Class)。
2) 使用 java class 通过 mapreduce 程序导入和导出。
如果您需要编写纯 java 代码(您需要控制并行度以提高性能)
执行以下操作:
1) 创建一个 Java Class 使用 Java JDBC 连接到 RDBMS
2) 创建一个 Java Class 接受输入字符串(从结果集中获取)并将 HDFS 服务写入文件。
否则这样做。
使用 DBInputFormat 创建一个 MapReduce,将 TextOutputFormat 的输入分割数作为输出目录传递到 HDFS。
如有任何与 hadoop 和 spark 相关的问题,请访问 https://bigdatatamer.blogspot.com/。
谢谢
Sainagaraju Vaduka
你最好使用 Sqoop。因为如果您自己构建它,您最终可能会做 Sqoop 正在做的事情。
无论哪种方式,从概念上讲,您都需要一个具有自定义输入格式的自定义映射器,能够从源中读取分区数据。在这种情况下,需要对数据进行分区的 table 列才能利用并行性。分区源 table 将是理想的。
DBInputFormat 没有优化对源数据库的调用。完整的数据集被 InputFormat 分割成配置数量的分割。
每个映射器都将执行相同的查询并仅加载与拆分对应的数据部分。这将导致每个映射器发出相同的查询以及数据集的排序,以便它可以选择它的数据部分。
这个 class 似乎没有利用分区源 table。您可以扩展它以更有效地处理分区的 table。
Hadoop 具有 AVRO、ORC 和 Parquet 等结构化文件格式。
如果您的数据不需要以分栏格式存储(主要用于 OLAP 用例,其中只需要选择大量列中的几列),请使用 AVRO。
您尝试做的方法不是一个好方法,因为您将在开发代码、测试等方面浪费大量时间,而是使用 sqoop 将数据从任何 RDBMS 导入到配置单元。我们想到的第一个工具就是Sqoop(SQL to Hadoop).
最先进的技术是使用 (pull ETL) sqoop 作为常规批处理从 RDBM 获取数据。但是,这种做法既 消耗资源 RDBMS(通常是 sqoop 运行 具有多个 jdbc 连接的多线程),并且 需要长时间 (通常你 运行 在 RDBMS 上顺序获取),并导致 数据损坏 (实时 RDBMS 在这个长的 sqoop 进程 "always in late").
然后存在一些替代范例(push ETL)并且正在成熟。背后的想法是构建监听 RDBMS 的变更数据捕获流。 An example project is debezium。然后,您可以构建一个实时 ETL,同步 RDBMS 和 Hadoop 或其他地方的数据仓库。
我是 Hadoop 新手,任务是使用 java 代码将结构化数据迁移到 HDFS。我知道 Sqoop 可以完成同样的任务,但这不是我的任务。
谁能解释一下这样做的可能方法。
我确实尝试过。我所做的是使用 jdbc 驱动程序从 psql 服务器复制数据,然后将其以 csv 格式存储在 HDFS 中。这是解决此问题的正确方法吗?
我了解到 Hadoop 有自己的数据类型来存储结构化数据。你能解释一下这是怎么发生的吗?
谢谢。
Sqoop 是一个简单的工具,可以执行以下操作。
1) 连接到 RDBMS (postgresql) 并获取 table 的元数据并创建 table 的 pojo(a Java Class)。 2) 使用 java class 通过 mapreduce 程序导入和导出。
如果您需要编写纯 java 代码(您需要控制并行度以提高性能)
执行以下操作:
1) 创建一个 Java Class 使用 Java JDBC 连接到 RDBMS 2) 创建一个 Java Class 接受输入字符串(从结果集中获取)并将 HDFS 服务写入文件。
否则这样做。
使用 DBInputFormat 创建一个 MapReduce,将 TextOutputFormat 的输入分割数作为输出目录传递到 HDFS。
如有任何与 hadoop 和 spark 相关的问题,请访问 https://bigdatatamer.blogspot.com/。
谢谢 Sainagaraju Vaduka
你最好使用 Sqoop。因为如果您自己构建它,您最终可能会做 Sqoop 正在做的事情。
无论哪种方式,从概念上讲,您都需要一个具有自定义输入格式的自定义映射器,能够从源中读取分区数据。在这种情况下,需要对数据进行分区的 table 列才能利用并行性。分区源 table 将是理想的。
DBInputFormat 没有优化对源数据库的调用。完整的数据集被 InputFormat 分割成配置数量的分割。 每个映射器都将执行相同的查询并仅加载与拆分对应的数据部分。这将导致每个映射器发出相同的查询以及数据集的排序,以便它可以选择它的数据部分。
这个 class 似乎没有利用分区源 table。您可以扩展它以更有效地处理分区的 table。
Hadoop 具有 AVRO、ORC 和 Parquet 等结构化文件格式。
如果您的数据不需要以分栏格式存储(主要用于 OLAP 用例,其中只需要选择大量列中的几列),请使用 AVRO。
您尝试做的方法不是一个好方法,因为您将在开发代码、测试等方面浪费大量时间,而是使用 sqoop 将数据从任何 RDBMS 导入到配置单元。我们想到的第一个工具就是Sqoop(SQL to Hadoop).
最先进的技术是使用 (pull ETL) sqoop 作为常规批处理从 RDBM 获取数据。但是,这种做法既 消耗资源 RDBMS(通常是 sqoop 运行 具有多个 jdbc 连接的多线程),并且 需要长时间 (通常你 运行 在 RDBMS 上顺序获取),并导致 数据损坏 (实时 RDBMS 在这个长的 sqoop 进程 "always in late").
然后存在一些替代范例(push ETL)并且正在成熟。背后的想法是构建监听 RDBMS 的变更数据捕获流。 An example project is debezium。然后,您可以构建一个实时 ETL,同步 RDBMS 和 Hadoop 或其他地方的数据仓库。