mysql之如何从MySQL导入数据到HDFS并通过外键关系拆分/分区/分发数据
我是 HDFS 和 Spark 的新手。我有一些特定于区域(可能是国家或国家的一部分)和时间函数的模拟的输入数据。
假设我有以下表格:
region:
id, name
-
population:
id, region_id, year_2020, year_2021, .... year_2050
-
sun_hours:
id, region_id, year_2020, year_2021, .... year_2050
(实际情况更复杂,嵌套实体和外键关系更多)。
我想将所有数据从 MySQL 导入到 HDFS 并按 region_id 对其进行分区。
理想情况下,我集群的每个节点都负责一个区域,这样我就可以轻松地并行处理这些区域。如果我想考虑更多区域,我可以通过添加更多节点来扩展模拟。 (我的模拟的一个基本假设是区域之间不相互作用)。
我希望在模拟过程中,数据不需要在节点之间传递,因为一个特定区域所需的所有数据都已经位于一个特定节点上。如果某些数据在拆分/分发过程中重复,对我来说是可以的。我预计单个区域的模拟要求很高,因此单个节点可能不想并行计算多个区域。
我找到了一个sqoop命令来导入几个表到hdfs:
sqoop import-all-tables --connect jdbc:mysql://db.foo.com/corp
https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_literal_sqoop_import_all_tables_literal
但是,我找不到指定数据应该如何分区和分布的方法。该过程应考虑一些“主要实体”(= 区域)。
我完全可以使用 sqoop 这样做吗?如果是,能否提供一个示例命令?
如果没有,是否有其他工具可用于我的目的?
如果我需要自己做,你会推荐给
a) 首先导入所有数据,然后重新组织或
b) 首先重组数据并将其写入例如区域特定的文本文件,然后将其导入 HDFS?
即使我设法重组(分层的)MySQL 数据,我如何确保所有相关数据都可以在单个节点上找到并且不会分散在整个集群中?
与其他工作:hdfs、spark 或其他一些大数据工具是否具有将相关内容放在一起的功能?可以说我有一些包含人口的 RDD 和一些包含日照时间的 RDD。 区域 1 的人口和日照时数应位于节点 x... 区域 2 的人口和日照时数应位于节点 y 上,依此类推。
(为了减少出错,这很好,我想需要...在多个节点上复制数据。我只想确保在没有节点问题的模拟期间,节点之间的流量是尽可能低。)
编辑
我刚刚找到了 GeoSpark,上面写着
GeoSpark spatial partitioning method can significantly speed up the join query. Three spatial partitioning methods are available: KDB-Tree, Quad-Tree and R-Tree. Two SpatialRDD must be partitioned by the same way.
If you first partition SpatialRDD A, then you must use the partitioner of A to partition B.
objectRDD.spatialPartitioning(GridType.KDBTREE) queryWindowRDD.spatialPartitioning(objectRDD.getPartitioner)
https://datasystemslab.github.io/GeoSpark/tutorial/rdd/
所以也许我应该尝试将我的 MySQL 数据库转换为与 GeoSpark 兼容的格式(“可以从 CSV、TSV、WKT、WKB、Shapefile、GeoJSON 和 NetCDF/HDF 格式加载”)。
相关文章:
请您参考如下方法:
sqoop(不是 Spark)更适用于表格。它可以使用 View ,但据说对于复杂的 View ,结果甚至可能不可靠。所以,那条大道是封闭的。
您将需要将 spark.read JDBC 连接与 mySQL 中的一个 View 结合使用,该 View 使用 region_id 作为分发的键 - 为了您的并行性 - 使用在“驱动”表上定义的 numPartitions 方法。与其他表的连接需要依赖mySQL引擎。
我不知道您的处理过程,但似乎很难强制执行 1 对 1 region_id 分区方法。此外,同一节点上可能存在 1 个以上的分区 - 但独立。
您可以独立获取所有表,然后加入,但会出现混洗,因为无法保证所有单独的 READ 的结果最终都在同一个节点上。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



