[英]Spark Streaming: How to efficiently save foreachRDD data into Mysql Database?
[英]Spark Streaming Saving data to MySQL with foreachRDD() in Scala
Spark Streaming 使用 Scala 中的foreachRDD()
数据保存到 MySQL
请有人给我一个关于使用 Scala 中的foreachRDD()
将 Spark Streaming 保存到 MySQL DB 的功能示例。 我有以下代码,但它不起作用。 我只需要一个简单的例子,而不是sintaxis或理论。
谢谢!
package examples
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark._
import org.apache.spark.storage.StorageLevel
import org.apache.spark.streaming.{Seconds, StreamingContext}
import StreamingContext._
import org.apache.hadoop.io.Text
import org.apache.hadoop.io.LongWritable
import org.apache.hadoop.mapred.SequenceFileOutputFormat
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext
import java.util.Properties
import org.apache.spark.sql.SaveMode
object StreamingToMysql {
def main(args: Array[String]) {
val sparkConf = new SparkConf().setAppName("NetworkWordCount").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val sqlContext = new SQLContext(sc)
val hiveCtx= new HiveContext(sc)
import hiveCtx.implicits._
val ssc = new StreamingContext(sc, Seconds(1))
val lines = ssc.socketTextStream("localhost", 9999)
ssc.checkpoint("hdfs://localhost:54310/user/hduser/Streaming/logs")
val rdd = sc.parallelize(List(1))
val df = rdd.toDF()
val split = lines.map(line => line.split(",") )
val input = split.map(x => x(0))
input.foreachRDD { rdd =>
if (rdd.take (1).size == 1) {
rdd.foreachPartition { iterator =>
iterator.foreach {
val connectionProperties = new Properties()
connectionProperties.put("user", "root")
connectionProperties.put("password", "admin123")
iterator.write.mode("append")
.jdbc("jdbc:mysql://192.168.100.8:3306/hadoopguide", "topics", connectionProperties)
}
}
}
}
val connectionProperties = new Properties()
connectionProperties.put("user", "root")
connectionProperties.put("password", "admin123")
df.write.mode("append")
.jdbc("jdbc:mysql://192.168.100.8:3306/hadoopguide", "topics", connectionProperties)
println("Done")
ssc.start()
ssc.awaitTermination()
}
}
要将数据从 Spark Streaming 写入外部系统,您可以使用高级数据帧 API 或低级 RDD。 在上面的代码中,这两种方法是混合的并且可以工作。
假设您知道 Spark Streaming 中传入数据的结构,您可以从每个 RDD 中创建一个 Dataframe 并使用 Dataframe API 来保存它:
首先,为数据创建一个架构:
case class MyStructure(field: Type,....)
然后,将架构应用于传入流:
val structuredData = dstream.map(record => MyStructure(record.field1, ... record.fieldn))
现在使用foreachRDD
将foreachRDD
中的每个 RDD 转换为 Dataframe 并使用 DF API 保存它:
// JDBC writer configuration
val connectionProperties = new Properties()
connectionProperties.put("user", "root")
connectionProperties.put("password", "*****")
structuredData.foreachRDD { rdd =>
val df = rdd.toDF() // create a dataframe from the schema RDD
df.write.mode("append")
.jdbc("jdbc:mysql://192.168.100.8:3306/hadoopguide", "topics", connectionProperties)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.