Spark跨集群读取HDFS文件

        大家平时可能都是在本集群上读取本地的HDFS文件,那如果我有两套集群呢?这个时候该如何读取另外一套集群上面的HDFS文件呢?废话不多说,直接上代码,如果代码有关于一些nameservices等这些信息不知道去哪里看的人,可以翻翻我之前的博客,或者私信我。

public static void main(String[] args) {

        SparkConf conf = new SparkConf().setAppName("bigdata-spark-etl-task")
                .setMaster("local[*]");
        
        SparkSession sparkSession = SparkSession.builder()
                .config(conf)
                .getOrCreate();
        
        Map<String, String> nameNodeMap = new HashMap<>();

        nameNodeMap.put("namenode33", "incubator-dc-006:8020");
        nameNodeMap.put("namenode35", "incubator-dc-007:8020");

        hdfsReader(sparkSession, "test-ns1", nameNodeMap, "hdfs://test-ns1/dw/public/test/ads_mkt_td_user_ds");
}


static Dataset<Row> hdfsReader(SparkSession sparkSession, String nameServices, Map<String, String> nameNodeMap, String hdfsDir) {

        SparkContext sparkContext = sparkSession.sparkContext();
        sparkContext.hadoopConfiguration().set("fs.defaultFs", "hdfs://" + nameServices);
        sparkContext.hadoopConfiguration().set("dfs.nameservices", nameServices);

        List<String> nameNodesLists = new ArrayList<>();

        StringBuilder haNameNodes = new StringBuilder();
        int i = 0;
        for (Map.Entry<String, String> nameNodes : nameNodeMap.entrySet()) {
            nameNodesLists.add(nameNodes.getKey());
            if (i == 0) {
                haNameNodes = new StringBuilder(nameNodes.getKey());
            } else {
                haNameNodes.append(",").append(nameNodes.getKey());
            }
            i++;
        }

        sparkContext.hadoopConfiguration().set("dfs.ha.namenodes." + nameServices, haNameNodes.toString());

        for (String nameNodesList : nameNodesLists) {
            sparkContext.hadoopConfiguration().set("dfs.namenode.rpc-address." + nameServices + "." + nameNodesList, nameNodeMap.get(nameNodesList));
        }

        sparkContext.hadoopConfiguration().set("dfs.ha.automatic-failover.enabled." + nameServices, "true");
        sparkContext.hadoopConfiguration().set("dfs.client.failover.proxy.provider." + nameServices, "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
        sparkSession.read().load(hdfsDir).show();
        return sparkSession.read().load(hdfsDir);
    }
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark可以通过以下方式读取本地和HDFS文件: 1. 读取本地文件: ```scala val localFile = spark.read.textFile("file:///path/to/local/file") ``` 2. 读取HDFS文件: ```scala val hdfsFile = spark.read.textFile("hdfs://namenode:port/path/to/hdfs/file") ``` 其中,`namenode`是HDFS的名称节点,`port`是HDFS的端口号,`path/to/hdfs/file`是HDFS文件的路径。 需要注意的是,如果要读取HDFS文件,需要确保Spark集群可以访问HDFS,并且需要在Spark配置文件中设置HDFS的相关参数。 ### 回答2: Spark是一个开源的分布式计算框架,支持从本地和远程存储中读取数据进行处理。本地文件可以通过指定文件路径直接读取,而Hadoop分布式文件系统(HDFS)上的文件需要使用Spark的Hadoop文件系统API进行读取。 首先,要读取本地文件,可以使用Spark的textFile API,该API可以从本地文件系统中读取文本文件。以下是读取本地文件的示例代码: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext object LocalFileReader { def main(args: Array[String]) { val conf = new SparkConf().setAppName("LocalFileReader").setMaster("local[*]") val sc = new SparkContext(conf) val textFile = sc.textFile("file:///path/to/localfile.txt") // 对textFile进行处理 ... sc.stop() } } ``` 其中,`file:///`表示本地文件路径,`path/to/localfile.txt`为本地文件的路径。SparkConf中的`setMaster("local[*]")`表示应用程序运行在本地模式下,使用所有可用的CPU核。如果本地文件是二进制格式或非文本格式,应使用相应的API读取。 其次,要读取HDFS文件,可以使用Spark的Hadoop文件系统API,通过设置`fs.defaultFS`属性指定HDFS的访问地址。以下是读取HDFS文件的示例代码: ```scala import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.hadoop.fs.{FileSystem, Path} object HDFSFileReader { def main(args: Array[String]) { val conf = new SparkConf().setAppName("HDFSFileReader") val sc = new SparkContext(conf) val hdfs = FileSystem.get(sc.hadoopConfiguration) val path = new Path("hdfs://namenode:port/path/to/hdfsfile.txt") val textFile = sc.textFile(path.toString) // 对textFile进行处理 ... sc.stop() } } ``` 其中,`namenode`和`port`为HDFS的名称节点和端口号,`path/to/hdfsfile.txt`为HDFS文件路径。SparkConf不需要设置`setMaster`属性,因为Spark将根据Hadoop配置自动进行集群管理。 无论是从本地还是HDFS读取文件,均可以使用Spark的强大的分布式计算功能进行并行处理和分析。 ### 回答3: Spark 是一个基于内存的分布式计算框架,常用于大数据计算和处理。Spark 可以读取本地文件HDFS 文件,下面我们就分别介绍一下。 首先是读取本地文件Spark 可以直接读取本地文件系统中的文件,方法如下: ```scala val sc = new SparkContext("local", "app") val textFile = sc.textFile("file:///path/to/local/file.txt") ``` 其中,`file:///path/to/local/file.txt` 中的 `file:///` 表示文件协议,`/path/to/local/file.txt` 是文件的路径。可以在 `textFile` 的参数中指定所读取文件类型,例如: ```scala val textFile = sc.textFile("file:///path/to/local/file.txt", 4) ``` 其中 `4` 表示分片数量,Spark文件拆分为 4 个部分进行读取和处理。 然后是读取 HDFS 文件Spark 同样可以读取 HDFS 文件,方法如下: ```scala val sc = new SparkContext("local", "app") val textFile = sc.textFile("hdfs://namenode:8020/path/to/hdfs/file.txt") ``` 其中 `hdfs://namenode:8020` 中的 `hdfs://` 表示 HDFS 协议,`namenode:8020` 表示 HDFS 在集群中的地址,`/path/to/hdfs/file.txt` 是要读取文件HDFS 中的路径。同样可以在 `textFile` 的参数中指定分片数量: ```scala val textFile = sc.textFile("hdfs://namenode:8020/path/to/hdfs/file.txt", 4) ``` 以上就是 Spark 读取本地和 HDFS 文件的方法。需要注意的是,Spark 针对文件读取和处理会自动进行分片,减少计算的时间和资源消耗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值