Spark(五)--Structured Streaming(四) - Source - HDFS

目录

4. 从 HDFS 中读取数据

4.1 案例结构介绍

4.1.1 场景介绍

4.1.2 案例介绍

4.1.3 实现步骤

4.1.4 难点和易错点

4.1.5 总结

4.2 产生小文件并推送到 HDFS

4.3 流式计算统计 HDFS 上的小文件

4.4 运行和流程总结

4.4.1 运行 Python 程序

4.4.2 运行 Spark 程序

4.5 总结


4. 从 HDFS 中读取数据

4.1 案例结构介绍

4.1.1 场景介绍

在数据处理的时候, 经常会遇到这样的场景

有时候也会遇到这样的场景

以上两种场景有两个共同的特点

  • 会产生大量小文件在 HDFS 上

  • 数据需要处理

通过本章节的学习, 便能够更深刻的理解这种结构, 具有使用 Structured Streaming 整合 HDFS, 从其中读取数据的能力

本节内容:

  1. 案例结构

  2. 产生小文件并推送到 HDFS

  3. 流式计算统计 HDFS 上的小文件

  4. 运行和总结

4.1.2 案例介绍

  1. 编写 Python 小程序, 在某个目录生成大量小文件

    • Python 是解释型语言, 其程序可以直接使用命令运行无需编译, 所以适合编写快速使用的程序, 很多时候也使用 Python 代替 Shell

    • 使用 Python 程序创建新的文件, 并且固定的生成一段 JSON 文本写入文件

    • 在真实的环境中, 数据也是一样的不断产生并且被放入 HDFS 中, 但是在真实场景下, 可能是 Flume 把小文件不断上传到 HDFS 中, 也可能是 Sqoop 增量更新不断在某个目录中上传小文件

  2. 使用 Structured Streaming 汇总数据

    • HDFS 中的数据是不断的产生的, 所以也是流式的数据

    • 数据集是 JSON 格式, 要有解析 JSON 的能力

    • 因为数据是重复的, 要对全局的流数据进行汇总和去重, 其实真实场景下的数据清洗大部分情况下也是要去重的

  3. 使用控制台展示数据

    • 最终的数据结果以表的形式呈现

    • 使用控制台展示数据意味着不需要在修改展示数据的代码, 将 Sink 部分的内容放在下一个大章节去说明

    • 真实的工作中, 可能数据是要落地到 MySQLHBaseHDFS 这样的存储系统中

4.1.3 实现步骤

  • Step 1: 编写 Python 脚本不断的产生数据

    1. 使用 Python 创建字符串保存文件中要保存的数据

    2. 创建文件并写入文件内容

    3. 使用 Python 调用系统 HDFS 命令上传文件

  • Step 2: 编写 Structured Streaming 程序处理数据

    1. 创建 SparkSession

    2. 使用 SparkSession 的 readStream 读取数据源

    3. 使用 Dataset 操作数据, 只需要去重

    4. 使用 Dataset 的 writeStream 设置 Sink 将数据展示在控制台中

  • Step 3: 部署程序, 验证结果

    1. 上传脚本到服务器中, 使用 python 命令运行脚本

    2. 开启流计算应用, 读取 HDFS 中对应目录的数据

    3. 查看运行结果

4.1.4 难点和易错点

  1. 在读取 HDFS 的文件时, Source 不仅对接数据源, 也负责反序列化数据源中传过来的数据

    • Source 可以从不同的数据源中读取数据, 如 KafkaHDFS

    • 数据源可能会传过来不同的数据格式, 如 JSONParquet

  2. 读取 HDFS 文件的这个 Source 叫做 FileStreamSource

    从命名就可以看出来这个 Source 不仅支持 HDFS, 还支持本地文件读取, 亚马逊云, 阿里云 等文件系统的读取, 例如: file://s3://oss://

  3. 基于流的 Dataset 操作和基于静态数据集的 Dataset 操作是一致的

4.1.5 总结

整个案例运行的逻辑是

  1. Python 程序产生数据到 HDFS 中

  2. Structured Streaming 从 HDFS 中获取数据

  3. Structured Streaming 处理数据

  4. 将数据展示在控制台

整个案例的编写步骤

  1. Python 程序

  2. Structured Streaming 程序

  3. 运行

4.2 产生小文件并推送到 HDFS

通过python脚本,生成小文件文本,并上传至HDFS中

python脚本的编写

import os

for index in range(100):
    content = """
    {"name":"Michael"}
    {"name":"Andy", "age":30}
    {"name":"Justin", "age":19}
    """

    file_name = "/export/dataset/text{0}.json".format(index)

    with open(file_name, "w") as file:  
        file.write(content)

    os.system("/export/servers/hadoop/bin/hdfs dfs -mkdir -p /dataset/dataset/")
    os.system("/export/servers/hadoop/bin/hdfs dfs -put {0} /dataset/dataset/".format(file_name))

注意:创建文件, 使用这样的写法是因为 with 是一种 Python 的特殊语法, 如果使用 with 去创建文件的话, 使用结束后会自动关闭流

4.3 流式计算统计 HDFS 上的小文件

使用 Structured Streaming 读取 HDFS 中的文件, 并以 JSON 的形式解析

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.streaming.OutputMode
import org.apache.spark.sql.types.StructType

object HDFSSource {
  def main(args: Array[String]): Unit = {
    //1.创建SparkSession
    val spark = SparkSession.builder()
      .appName("hdfs_source")
      .master("local[6]")
      .getOrCreate()
    //2.数据读取
    val schema = new StructType()
      .add("name","string")
      .add("age","integer")
    val source = spark.readStream
      .schema(schema)
      .json("hdfs://node01:8020/dataset/dataset")
    //3.输出结果
    source.writeStream
      .outputMode(OutputMode.Append())
      .format("console")
      .start()
      .awaitTermination()
  }
}

总结:

以流的形式读取某个 HDFS 目录的代码为

val source = spark
  .readStream         
  .schema(userSchema) 
  .json("hdfs://node01:8020/dataset/dataset") 
  • 指明读取的是一个流式的 Dataset
  • 指定读取到的数据的 Schema
  • 指定目录位置, 以及数据格式

4.4 运行和流程总结

4.4.1 运行 Python 程序

  1. 上传 Python 源码文件到服务器中

  2. 运行 Python 脚本

# 进入 Python 文件被上传的位置
cd ~

# 创建放置生成文件的目录
mkdir -p /export/dataset

# 运行程序
python gen_files.py

 

4.4.2 运行 Spark 程序

  1. 使用 Maven 打包

    20190716000942

  2. 上传至服务器

  3. 运行 Spark 程序

# 进入保存 Jar 包的文件夹
cd ~

# 运行流程序
spark-submit --class cn.itcast.structured.HDFSSource ./original-streaming-0.0.1.jar

4.5 总结

  1. Python 生成文件到 HDFS, 这一步在真实环境下, 可能是由 Flume 和 Sqoop 收集并上传至 HDFS

  2. Structured Streaming 从 HDFS 中读取数据并处理

  3. Structured Streaming 讲结果表展示在控制台

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值