Flink read data from hdfs

本文介绍如何使用Apache Flink从HDFS中读取数据,包括DataStreamSource实时读取和DataSet批处理两种方式。通过具体代码示例,展示了如何配置参数实现递归读取文件,并将数据写入本地文件系统。

DataStreamSource 读取hdfs

package com.umetrip.umeflink.connector.hdfs;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Arrays;
import java.util.List;


public class UmeHdfsSource {
 
    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env1 = StreamExecutionEnvironment.getExecutionEnvironment();
        DataStreamSource<String> stringDataStreamSource = env1.readTextFile("hdfs://10.5.xxx.xxx:8020/test/seamless/2019-06-25/part-0-0.txt");
        // stringDataStreamSource.print();
        stringDataStreamSource.writeAsText("/Users/xxxx/testdata/").setParallelism(1);
        env1.execute();
    }
}

DataSet 批处理

package com.umetrip.umeflink.connector.hdfs;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.Arrays;
import java.util.List;


public class UmeHdfsSource {
 
    public static void main(String[] args) throws Exception {


       ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
        // create a configuration object
        Configuration parameters = new Configuration();
        // set the recursive enumeration parameter
        parameters.setBoolean("recursive.file.enumeration", true);
        // read text file from a HDFS running at nnHost:nnPort
        // DataSet<String> hdfsLines = env.readTextFile("hdfs://10.5.xxx.xxx:8020/TestData");
        // 如果本地读取HA HDFS,需要把core-site.xml,hdfs-site.xml放到resources目录下,路径为hdfs://namespace/xx/xx
        //DataSet<String> hdfsLines = env.readTextFile("hdfs://10.5.xxx.xx:8020/test/seamless/2019-06-25");
        DataSet<String> hdfsLines = env.readTextFile("hdfs://10.5.xxx.xxx:8020/test/seamless/2019-06-25").withParameters(parameters).withParameters(parameters);
        hdfsLines.print();

 
}
       <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-hadoop-compatibility_2.11</artifactId>
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-java</artifactId>
            <version>1.8.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients_2.12</artifactId>
            <!--<scope>provided</scope>-->
            <version>1.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java_2.12</artifactId>
            <version>1.8.0</version>
            <!--<scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-filesystem_2.12</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-hadoop-fs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-shaded-hadoop2</artifactId>
        </dependency>
Flink 是一款强大的分布式流处理框架,同时也支持批量数据处理任务。如果需要通过 Java 编写的 Flink 程序从 HDFS 文件系统读取文件内容并进行计算操作,通常可以按照以下步骤完成: ### 步骤1:引入必要的依赖项 首先,在项目的 `pom.xml` 文件中添加对 Apache Flink 和 Hadoop 的 Maven 依赖。 ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-core</artifactId> <version>{FLINK_VERSION}</version> </dependency> <!-- 引入HDFS的支持 --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>{HADOOP_VERSION}</version> </dependency> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>{FLINK_VERSION}</version> </dependency> ``` ### 步骤2:编写代码来加载数据 接下来就是使用 Flink API 来创建作业,并指定源为 HDFS 上的数据文件路径。例如可以从文本文件、CSV 或其他结构化/非结构化的输入格式读取数据。 #### 示例代码 - 使用 TextInputFormat 类型: 假设我们要读取纯文本文件中的行作为字符串记录,则可以直接利用内置的 `TextInputFormat` 格式。 ```java import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.core.fs.Path; import org.apache.flink.formats.csv.CsvReaderDataSource; import org.apache.flink.util.Collector; public class ReadFromHDFS { public static void main(String[] args) throws Exception { // 创建批处理环境 final ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 指定HDFS上存储有原始数据的位置 (注意替换为实际URI) String hdfsFilePath = "hdfs://namenode:8020/path/to/input/file"; // 加载来自给定路径下的所有符合条件的文件作为一个DataSet<String>. DataSet<String> textData = env.readTextFile(hdfsFilePath); // 对每一条读出的内容做简单的预处理(比如切割单词) DataSet<Tuple2<String,Integer>> counts = textData.flatMap(new Tokenizer()); // 输出统计结果到标准输出或其他位置... counts.print(); } /** * 实现一个自定义FlatMap函数用于拆分句子成词频元组. */ public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String value, Collector<Tuple2<String, Integer>> out) { // 将每一行转换为小写形式再按空格分割词语数组 String[] tokens = value.toLowerCase().split("\\W+"); for (String token : tokens) { if (token.length() > 0){ out.collect(Tuple2.of(token, 1)); } } } } } ``` 在这个例子中我们简单地实现了把一行文本打散成一个个词汇然后计数的功能。当然也可以针对更复杂的业务需求调整逻辑。 --- **注意事项** - 需要确保运行该应用程序时,能够访问正确的 Namenode 地址以及端口号等配置信息。 - 如果涉及 Kerberos 认证机制保护的集群,则还应额外提供 keytab 文件及其用户主体名称等相关设置才能正常连接成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值