Spark Streaming 输出数据清洗结果到Mysql

本文介绍了一个基于Flume收集数据,通过Kafka作为消息中间件,利用Spark Streaming进行实时数据处理,并最终将处理结果写入MySQL的实时数据处理流程。该流程实现了从数据采集到数据清洗、再到数据存储的一站式解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flume+Kafka+Spark Streaming + Mysql

package util;

import java.awt.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka.KafkaUtils;
import kafka.serializer.StringDecoder;
import scala.Tuple2;

public class DataClean {
    public static void main(String[] args) throws InterruptedException {

        SparkSession spark = SparkSession.builder().master("local").appName("dataClean").getOrCreate();
        //用SparkSession创建Spark Context
        JavaSparkContext conf = new JavaSparkContext(spark.sparkContext());

        JavaStreamingContext ssc = new JavaStreamingContext(conf, Durations.seconds(2));
        Map<String, String> kafkaParams = new HashMap<String, String>();
        kafkaParams.put("bootstrap.servers", "vm04:9092,vm05:9092,vm06:9092");
        Set<String> topics = new HashSet<String>();
        topics.add("test_m_brokers");
        JavaPairDStream<String, String> lines = KafkaUtils.createDirectStream(ssc, String.class, String.class,
                StringDecoder.class, StringDecoder.class, kafkaParams, topics);
        JavaDStream<String> words = lines.map(new Function<Tuple2<String, String>, String>() {
            public String call(Tuple2<String, String> tuple) throws Exception {
                String[] strs = tuple._2.split(",");
                String ids =  strs[9].split("/")[3];
                String tmp = "";
                tmp += strs[1] + "\t" + strs[9] + "\t" + ids + "\t" + strs[11];
                return tmp;
            }
        });
         //words.print();

        words.foreachRDD(rdd -> {
            String url = "jdbc:mysql://vm04:3306/echarts";
            Properties connectionProperties = new Properties();
            connectionProperties.put("user", "root");
            connectionProperties.put("password", "xxxxx");
            connectionProperties.put("driver", "com.mysql.jdbc.Driver");
            JavaRDD<Row> ip = rdd.map(new Function<String, Row>() {
                public Row call(String line) throws Exception {
                    String[] tmps = line.split("\t");
                    return RowFactory.create(String.valueOf(tmps[0]),String.valueOf(tmps[1]),
                            String.valueOf(tmps[2]),String.valueOf(tmps[3]));
                }
            });
            ArrayList<StructField> fields = new ArrayList<StructField>();
            fields.add(DataTypes.createStructField("ip", DataTypes.StringType, true));
            fields.add(DataTypes.createStructField("video", DataTypes.StringType, true));
            fields.add(DataTypes.createStructField("videoid", DataTypes.StringType, true));
            fields.add(DataTypes.createStructField("device", DataTypes.StringType, true));

            StructType type = DataTypes.createStructType(fields);
            Dataset<Row> ipDF = spark.createDataFrame(ip, type);
            ipDF.write().mode("append").jdbc(url, "echarts", connectionProperties);
            //spark.close();
        });
        ssc.start();
        ssc.awaitTermination();

    }
}
学习SparkMySQL中提取增量数据并存储到Hive中,可以按照以下几个步骤来进行: 1. **安装与配置**: - 安装Apache Spark、Scala(如果Spark依赖)、Python(PySpark),以及MySQL和Hadoop(包括Hive)。 - 配置环境变量,比如`SPARK_HOME`、`JAVA_HOME`等,并确保所有工具都能相互找到。 2. **设置连接库**: - 对于Python,你可以使用`pymysql`库连接MySQL,对于Scala则有`jdbc`库。 3. **创建DataFrame**: - 使用Spark SQL的`read.format("jdbc")`函数读取MySQL数据,指定URL、用户名、密码以及SQL查询(通常是一个SELECT * FROM table WHERE ...命令,用于选择增量数据)。 ```python from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder.appName("mysql_to_hive").getOrCreate() # 连接MySQL df_mysql = spark.read.format("jdbc").options( url="jdbc:mysql://localhost:port/db_name", driver="com.mysql.jdbc.Driver", username="username", password="password", query="SELECT * FROM table WHERE modified_date > last_synced_date" ).load() ``` 4. **处理数据**: - 数据可能存在脏数据,如空值或非结构化,需要根据需求进行清洗和转换。 5. **写入Hive**: - 将DataFrame保存到Hive表中,这会直接更新Hive表,而不是生成一个新的分区,除非你明确地指定创建新分区。 ```python df_mysql.write \ .format("parquet") # 或者"orc", "csv"等格式,取决于Hive支持的存储格式 .mode("append") # 表示追加模式,仅写增量数据 .saveAsTable("target_table") ``` 6. **测试与优化**: - 验证数据是否正确加载到Hive,检查日志和性能指标。 - 如果数据量大,考虑分批处理或使用Spark Streaming做实时流式处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值