我是hadoop的新手,并且被赋予了使用java代码将结构化数据迁移到hdfs的任务。我知道sqoop也可以实现这一点,但这不是我的任务。有人能解释一下可能的方法吗。我确实试过这么做。我所做的是使用jdbc驱动程序从psql服务器复制数据,然后将其以csv格式存储在hdfs中。这样做对吗?我听说hadoop有自己的数据类型来存储结构化数据。你能解释一下这是怎么发生的吗。谢谢您。
chhkpiq41#
sqoop是一个执行以下操作的简单工具。1) 连接到rdbms(postgresql)并获取表的元数据并创建表的pojo(java类)。2) 使用java类通过mapreduce程序导入和导出。如果您需要编写纯java代码(需要控制并行性以获得性能)执行以下操作:1) 创建一个使用javajdbc连接到rdbms的java类2)创建一个接受输入字符串(从resultset获取)并将hdfs服务写入文件的java类。换一种方式。使用dbinputformat创建mapreduce将textoputformat作为输出目录的输入分割数传递给hdfs。请访问https://bigdatatamer.blogspot.com/ 任何与hadoop和spark相关的问题。谢谢sainagaraju vaduka
xv8emn3q2#
最先进的技术是使用(pull-etl)sqoop作为常规的批处理过程从rdbms获取数据。但是,这种方法既消耗rdbms的资源(通常sqoop使用多个jdbc连接运行多个线程),又需要很长时间(通常在rdbms上运行顺序获取),而且会导致数据损坏(当这个长的sqoop进程“总是很晚”时,会更新活动的rdbms)。然后一些替代的范例存在(push-etl)并且正在成熟。背后的想法是构建监听rdbms的变更数据捕获流。debezium就是一个例子。然后可以构建一个实时etl,在hadoop或其他地方同步rdbms和数据仓库。
vybvopom3#
最好使用sqoop。因为如果您自己构建sqoop的话,您最终可能会完全按照sqoop所做的去做。无论哪种方式,从概念上讲,您都需要一个具有自定义输入格式的自定义Map器,该Map器能够从源中读取分区数据。在这种情况下,需要对数据进行分区的表列利用并行性。分区源表是理想的。dbinputformat不会优化对源数据库的调用。完整的数据集被inputformat分割成配置的分割数。每个Map器将执行相同的查询,并只加载与split对应的数据部分。这将导致每个Map器发出相同的查询,并对数据集进行排序,以便它可以选择其数据部分。这个类似乎没有利用分区源表。您可以扩展它以更有效地处理分区表。hadoop从avro、orc和parquet等结构化文件格式开始。如果您的数据不需要以列格式存储(主要用于olap用例,在这种情况下,只需要选择几列大型列集),那么可以使用avro。
bsxbgnwa4#
您尝试的方法并不好,因为您将在开发代码、测试等方面浪费大量时间,而使用sqoop将数据从任何rdbms导入hive。我们想到的第一个工具是sqoop(sql到hadoop)。
4条答案
按热度按时间chhkpiq41#
sqoop是一个执行以下操作的简单工具。
1) 连接到rdbms(postgresql)并获取表的元数据并创建表的pojo(java类)。2) 使用java类通过mapreduce程序导入和导出。
如果您需要编写纯java代码(需要控制并行性以获得性能)
执行以下操作:
1) 创建一个使用javajdbc连接到rdbms的java类2)创建一个接受输入字符串(从resultset获取)并将hdfs服务写入文件的java类。
换一种方式。
使用dbinputformat创建mapreduce将textoputformat作为输出目录的输入分割数传递给hdfs。
请访问https://bigdatatamer.blogspot.com/ 任何与hadoop和spark相关的问题。
谢谢sainagaraju vaduka
xv8emn3q2#
最先进的技术是使用(pull-etl)sqoop作为常规的批处理过程从rdbms获取数据。但是,这种方法既消耗rdbms的资源(通常sqoop使用多个jdbc连接运行多个线程),又需要很长时间(通常在rdbms上运行顺序获取),而且会导致数据损坏(当这个长的sqoop进程“总是很晚”时,会更新活动的rdbms)。
然后一些替代的范例存在(push-etl)并且正在成熟。背后的想法是构建监听rdbms的变更数据捕获流。debezium就是一个例子。然后可以构建一个实时etl,在hadoop或其他地方同步rdbms和数据仓库。
vybvopom3#
最好使用sqoop。因为如果您自己构建sqoop的话,您最终可能会完全按照sqoop所做的去做。
无论哪种方式,从概念上讲,您都需要一个具有自定义输入格式的自定义Map器,该Map器能够从源中读取分区数据。在这种情况下,需要对数据进行分区的表列利用并行性。分区源表是理想的。
dbinputformat不会优化对源数据库的调用。完整的数据集被inputformat分割成配置的分割数。每个Map器将执行相同的查询,并只加载与split对应的数据部分。这将导致每个Map器发出相同的查询,并对数据集进行排序,以便它可以选择其数据部分。
这个类似乎没有利用分区源表。您可以扩展它以更有效地处理分区表。
hadoop从avro、orc和parquet等结构化文件格式开始。
如果您的数据不需要以列格式存储(主要用于olap用例,在这种情况下,只需要选择几列大型列集),那么可以使用avro。
bsxbgnwa4#
您尝试的方法并不好,因为您将在开发代码、测试等方面浪费大量时间,而使用sqoop将数据从任何rdbms导入hive。我们想到的第一个工具是sqoop(sql到hadoop)。