【问题标题】:Unable to write to S3 using S3 sink using StreamExecutionEnvironment - Apache Flink 1.1.4无法使用 StreamExecutionEnvironment 使用 S3 接收器写入 S3 - Apache Flink 1.1.4
【发布时间】:2017-01-04 21:14:19
【问题描述】:

我创建了一个简单的 Apache Flink 项目,该项目将从 Kafka 主题读取数据并将该数据写入 S3 存储桶。我在运行项目时没有收到任何错误,它成功地从 Kafka 主题读取了每条消息,但没有任何内容写入我的 S3 存储桶。没有错误,因此很难尝试调试正在发生的事情。下面是我的项目和我的配置。这仅在我使用 StreamExecutionEnviornment 时发生。如果我尝试使用常规批处理 ExecutionEnviornment 只生产到 S3,它就可以工作。

S3 测试 Java 程序

public class S3Test {

public static void main(String[] args) throws Exception {
    // parse input arguments
    final ParameterTool parameterTool = ParameterTool.fromPropertiesFile(args[0]);

    if(parameterTool.getNumberOfParameters() < 4) {
        System.out.println("Missing parameters!\nUsage: Kafka --topic <topic> " +
                "--bootstrap.servers <kafka brokers> --zookeeper.connect <zk quorum> --group.id <some id>");
        return;
    }

    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.getConfig().disableSysoutLogging();
    env.getConfig().setRestartStrategy(RestartStrategies.fixedDelayRestart(4, 10000));
    env.enableCheckpointing(5000); // create a checkpoint every 5 seconds
    env.getConfig().setGlobalJobParameters(parameterTool); //make parameters available in the web interface

    DataStream<String> messageStream = env
            .addSource(new FlinkKafkaConsumer09<String>(
                    parameterTool.getRequired("kafka.topic"),
                    new SimpleStringSchema(),
                    parameterTool.getProperties()));


    // write kafka stream to standard out.
    //messageStream.print();
    String id = UUID.randomUUID().toString();
    messageStream.writeAsText("s3://flink-data/" + id + ".txt").setParallelism(1);

    env.execute("Write to S3 Example");
}
}

pom.xml

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.10</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.10</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka-0.9_2.10</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk</artifactId>
        <version>1.7.4</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-aws</artifactId>
        <version>2.7.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.2.5</version>
    </dependency>

    <!-- Apache Kafka Dependencies -->
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.10</artifactId>
        <version>0.9.0.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

</dependencies>

core-site.xml(Hadoop 配置)

<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

<property>
   <name>fs.s3.impl</name>
   <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>

<!-- Comma separated list of local directories used to buffer
 large results prior to transmitting them to S3. -->
<property>
  <name>fs.s3a.buffer.dir</name>
  <value>/tmp</value>
</property>

<!-- set your AWS ID using key defined in org.apache.hadoop.fs.s3a.Constants -->
<property>
    <name>fs.s3a.access.key</name>
    <value>***************</value>
</property>

<!-- set your AWS access key -->
<property>
    <name>fs.s3a.secret.key</name>
    <value>****************</value>
</property>

</configuration>

【问题讨论】:

    标签: amazon-web-services hadoop amazon-s3 aws-sdk apache-flink


    【解决方案1】:

    通过 Flink 从 Kafka 主题持久化到 S3 需要使用 RollingSink。 RollingSink 使用 Bucketer 来指定要保存零件文件的目录的名称。 DateTime 是默认的 Bucketer,但您也可以创建自定义的。每当达到最大批量大小时,零件文件将被保存并关闭,然后将创建一个新的零件文件。下面的代码有效:

    public class TestRollingSink {
    
        public static void main(String[] args){
            Map<String, String> configs = ConfigUtils.loadConfigs("/Users/path/to/config.yaml");
    
        final ParameterTool parameterTool = ParameterTool.fromMap(configs);
    
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    
        env.getConfig().disableSysoutLogging();
        env.getConfig().setGlobalJobParameters(parameterTool);
        env.socketTextStream("localhost", 9092);
    
        DataStream<String> parsed = env
                .addSource(new FlinkKafkaConsumer09<String>(
                        parameterTool.getRequired("kafka.topic"),
                        new SimpleStringSchema(),
                        parameterTool.getProperties()));
    
        env.enableCheckpointing(2000, CheckpointingMode.AT_LEAST_ONCE);
    
        RollingSink<String> sink = new RollingSink<String>("s3://flink-test/"+"TEST");
        sink.setBucketer(new DateTimeBucketer("yyyy-MM-dd--HHmm"));
        sink.setWriter(new StringWriter<String>());
        sink.setBatchSize(200);
        sink.setPendingPrefix("file-");
        sink.setPendingSuffix(".txt");
        parsed.print();
        parsed.addSink(sink).setParallelism(1);
    
        try {
            env.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    }

    【讨论】:

      【解决方案2】:

      IAM 权限 - 确保您要写入 S3 存储桶的角色。

      【讨论】:

        【解决方案3】:

        帮助您获取一些调试信息的一种简单方法是为应该接收 kafka 数据的 s3 存储桶打开日志记录。这将为您提供更多信息,以帮助您从 s3 角度确定错误来源:

        http://docs.aws.amazon.com/AmazonS3/latest/UG/ManagingBucketLogging.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-01
          • 2020-09-20
          • 2014-10-05
          • 1970-01-01
          相关资源
          最近更新 更多