• 实战 | 将Apache Hudi数据集写入阿里云OSS


    1. 引入

    云上对象存储的廉价让不少公司将其作为主要的存储方案,而Hudi作为数据湖解决方案,支持对象存储也是必不可少。之前AWS EMR已经内置集成Hudi,也意味着可以在S3上无缝使用Hudi。当然国内用户可能更多使用阿里云OSS作为云上存储方案,那么如果用户想基于OSS构建数据湖,那么Hudi是否支持呢?随着Hudi社区主分支已经合并了支持OSS的PR,现在只需要基于master分支build版本即可,或者等待下一个版本释出便可直接使用,经过简单的配置便可将数据写入OSS。

    2. 配置

    2.1 pom依赖

    需要额外添加的主要pom依赖如下

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-aliyun</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.8.1</version>
    </dependency>
    

    2.2 core-site.xml配置

    若需访问OSS,需要修改core-site.xml,关键配置如下

        <property>
            <name>fs.defaultFS</name>
            <value>oss://bucketname/</value>
        </property>
    
        <property>
          <name>fs.oss.endpoint</name>
          <value>oss-endpoint-address</value>
          <description>Aliyun OSS endpoint to connect to.</description>
        </property>
    
        <property>
          <name>fs.oss.accessKeyId</name>
          <value>oss_key</value>
          <description>Aliyun access key ID</description>
        </property>
    
        <property>
          <name>fs.oss.accessKeySecret</name>
          <value>oss-secret</value>
          <description>Aliyun access key secret</description>
        </property>
    
        <property>
          <name>fs.oss.impl</name>
          <value>org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem</value>
        </property>
    

    3. 源码

    示例源码如下

    import org.apache.hudi.QuickstartUtils.*;
    import org.apache.spark.api.java.JavaSparkContext;
    import org.apache.spark.sql.Dataset;
    import org.apache.spark.sql.Row;
    import org.apache.spark.sql.SparkSession;
    
    import java.io.IOException;
    import java.util.List;
    
    import static org.apache.hudi.QuickstartUtils.convertToStringList;
    import static org.apache.hudi.QuickstartUtils.getQuickstartWriteConfigs;
    import static org.apache.hudi.config.HoodieWriteConfig.TABLE_NAME;
    import static org.apache.spark.sql.SaveMode.Overwrite;
    
    public class OssHudiDemo {
        public static void main(String[] args) throws IOException {
            SparkSession spark = SparkSession.builder().appName("Hoodie Datasource test")
                    .master("local[2]")
                    .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
                    .config("spark.io.compression.codec", "snappy")
                    .config("spark.sql.hive.convertMetastoreParquet", "false")
                    .getOrCreate();
            JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
    
            String tableName = "hudi_trips_cow";
            String basePath = "/tmp/hudi_trips_cow";
            DataGenerator dataGen = new DataGenerator();
    
            List<String> inserts = convertToStringList(dataGen.generateInserts(10));
            Dataset<Row> df = spark.read().json(jsc.parallelize(inserts, 2));
            df.write().format("org.apache.hudi").
                    options(getQuickstartWriteConfigs()).
                    option(TABLE_NAME, tableName).
                    mode(Overwrite).
                    save(basePath);
    
            Dataset<Row> roViewDF = spark.read().format("org.apache.hudi").load(basePath + "/*/*/*");
            roViewDF.registerTempTable("hudi_ro_table");
            spark.sql("select *  from  hudi_ro_table").show(false);
            spark.stop();
    
        }
    }
    

    即先写入OSS,下图可以看到OSS的Bucket中已经成功写入了数据,然后再通过spark查询写入的结果。

    部分查询结果如下

    |20200421205942     |20200421205942_2_10 |6fd496f8-ebee-4f67-8f86-783ff3fed3ab|asia/india/chennai                  |1f71bed9-833b-4fca-8b4b-4cd014bdf88a-0_2-22-30_20200421205942.parquet|0.40613510977307   |0.5644092139040959 |driver-213|0.798706304941517  |0.02698359227182834|17.851135255091155|asia/india/chennai                  |rider-213|0.0|6fd496f8-ebee-4f67-8f86-783ff3fed3ab|
    
    

    所有源代码已经上传至https://github.com/leesf/oss-hudi-demo

    4. 最后

    本篇文章很简单,只用作展示如何通过Hudi将数据写入OSS。当数据写入OSS后,便可打通阿里云上几乎所有产品,这使得基于阿里云技术栈进行数据湖分析将变得非常简单,比如使用DLA(Data Lake Analytics),对标AWS的Athena,对Hudi数据集进行分析查询,一体化的流程会让分析变得异常简单。

  • 相关阅读:
    skywalking请求头传输协议
    一篇文章带你搞懂SkyWalking调用链追踪框架
    zuihou-admin-cloud很经典的一个微服务开发平台,能够详细的看里面的视频https://www.kancloud.cn/zuihou/zuihou-admin-cloud/1411215
    skywalking权限验证功能
    哔哩哔哩中Openshift红帽培训
    ElasticSearch中文社区视频教程地址
    浅谈一些有趣的区间问题
    浅谈区间最小点覆盖
    洛谷 P1325 雷达安装
    CF12B Correct Solution?
  • 原文地址:https://www.cnblogs.com/leesf456/p/12773101.html
Copyright © 2020-2023  润新知