HDFS 从一个Hadoop集群阅读并写入另一个Hadoop卡斯特

bogh5gae  于 2022-12-09  发布在  HDFS
关注(0)|答案(2)|浏览(333)

我正在运行一个Spark作业,需要从HDFS表中读取数据,该表位于Hadoop Cluster-1中。现在,我希望将 Dataframe 聚合到另一个Hadoop Cluster-2中的表中。最好的方法是什么?
1.我正在考虑下面的办法:在将数据写入目标表之前,使用addResource读取hdfs-site.xml和core-site.xml。然后将所有配置值复制到Map〈String,String〉中。然后将这些配置值设置到我的dataset.sparkSession.sparkContext.hadoopConfiguration()中。
这是实现我的目标的好方法吗?

6vl6ewon

6vl6ewon1#

如果您想从cluster 1读取配置单元表作为 Dataframe ,并在转换 Dataframe 后将其作为配置单元表写入cluster 2,您可以尝试以下方法。
1.确保hiveserver 2正在两个群集上运行运行服务器命令为
配置单元--服务配置单元rever 2
配置单元-服务元存储
1.请确保配置单元正确配置了用户名/密码。您可以将用户名/密码都标记为空,但会收到一个错误,您可以通过引用此link来解决此问题。
1.现在从cluster 1读取hive表作为spark Dataframe ,并在转换后将其写入cluster 2的hive表。

// spark-scala code

val sourceJdbcMap = Map(
 "url"->"jdbc:hive2://<source_host>:<port>", //default port is 10000
 "driver"->"org.apache.hive.jdbc.HiveDriver",
 "user"->"<username>",
 "password"->"<password>",
 "dbtable"->"<source_table>")

val targetJdbcMap = Map(
 "url"->"jdbc:hive2://<target_host>:<port>", //default port is 10000
 "driver"->"org.apache.hive.jdbc.HiveDriver",
 "user"->"<username>",
 "password"->"<password>",
 "dbtable"->"<target_table>")

val sourceDF = spark.read.format("jdbc").options(sourceJdbcMap).load()

val transformedDF = //transformation goes here...

transformedDF.write.options(targetJdbcMap).format("jdbc").save()
idfiyjo8

idfiyjo82#

我能够使用Spark从一个启用HA的Hadoop集群hdfs位置进行读取,并通过以下步骤写入另一个启用HA的Hadoop集群hdfs位置:

**1)**检查两个服务器中的KDC是属于相同领域还是不同领域。如果相同,则跳过此步骤,否则在两个KDC之间设置跨领域验证。可能的方法如下:https://community.cloudera.com/t5/Community-Articles/Setup-cross-realm-trust-between-two-MIT-KDC/ta-p/247026
方案1:这是一个重复的读写操作
**2)**按照中提到的步骤编辑源集群的hdfs-site.xml:https://docs.cloudera.com/HDPDocuments/HDP2/HDP-2.6.4/bk_administration/content/distcp_between_ha_clusters.html
**3)**在应用程序启动时在spark conf中添加以下属性:spark.kerberos.access.hadoopFileSystems=hdfs://targetCluster-01.xyz.com:8020基本上,该值应该是 * 活动名称节点 * 的InetSocketAddress。
**4)**在您的程式码中,给予目的hdfs位置的绝对路径。例如:df.write.mode(SaveMode.Append).save("hdfs://targetCluster-01.xyz.com/usr/tmp/targetFolder")
注意:在步骤4中,您还可以提供类似hdfs://targetCluster/usr/tmp/targetFolder的逻辑路径,因为我们已经在hdfs-site.xml中添加了目标namservice。
方案2:这是一个临时请求,您只需执行一次读写操作

跳过上述步骤#2。
按照步骤3和步骤4进行操作。

PS:作业的用户应有权访问这两个集群,以便执行此操作。

相关问题