我对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,并按区域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数据,我如何确保所有相关的数据都可以在一个节点上找到,并且不会在整个集群中分散?
与其他Works:hdfs、spark或其他一些大数据工具是否具有将相关内容保存在一起的功能?假设我有一些包含人口的rdd和一些包含太阳时数的rdd。区域1的人口和日照时数应位于节点x上。。。区域2的人口和日照时数应该在节点y上,依此类推。
(为了不容易出错,这是很好的,我想需要。。。在多个节点上复制数据。我只想确保在没有节点问题的模拟过程中,节点之间的通信量尽可能低。)
编辑
我刚找到geospark哪个州
geospark空间划分方法可以显著提高连接查询的速度。有三种空间划分方法:kdb树、四叉树和r树。两个空间RDD必须以相同的方式进行分区。
如果您首先对spatialrdd a进行分区,那么必须使用a的分区器来对b进行分区。
objectrdd.SpatialParting(gridtype.kdbtree)queryindowRdd.SpatialParting(objectrdd.getpartitioner)
https://datasystemslab.github.io/geospark/tutorial/rdd/
所以也许我应该尝试将mysql数据库转换成与geospark兼容的格式(“可以从csv、tsv、wkt、wkb、shapefiles、geojson和netcdf/hdf格式加载”)。
相关文章:
https://sparkdatasourceapi.blogspot.com/2016/10/patitioning-in-spark-writing-custom.html
spark-是否可以控制分区到节点的位置?
如何控制rdd分区的首选位置?
在apachespark中,是否可以为无序rdd或共组rdd指定分区的首选位置?
强制分区必须存储在特定的执行器上
如何对数据进行物理分区以避免sparksql连接中的混乱
1条答案
按热度按时间pxq42qpu1#
sqoop(不是spark)更适合于表。它可以使用视图,但有人指出,对于复杂视图,结果甚至可能不可靠。所以,那条路是封闭的。
您将需要使用spark.read jdbc连接,在mysql中使用region\u id作为密钥进行分发(为了您的并行性),使用在“driving”表上定义的numpartitions方法。与其他表的连接需要依赖mysql引擎。
我不知道您的处理过程,但似乎很难强制执行1对1区域id到分区的方法。此外,同一个节点上可能存在多个分区,但它们是独立的。
您可以独立地获取所有表,然后进行联接,但会出现无序处理,因为无法保证所有单个读取的结果都会在同一个节点上结束。