Spark Streaming 读取HDFS数据
首先开启相关服务,如spark、hadoop(hdfs,yarn),根据需求考虑开启hive服务。
1. 创建maven工程并导包
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.1</version> <!-- 请替换为具体的 Spark 版本号,例如 3.1.3 -->
</dependency>
<!-- Spark SQL -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.1.1</version> <!-- 请替换为具体的 Spark 版本号 -->
</dependency>
<!-- 如果您需要连接 Hive,请添加以下依赖 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.12</artifactId>
<version>3.1.1</version> <!-- 请替换为具体的 Spark 版本号 -->
</dependency>
<!-- MySQL JDBC 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version> <!-- 不建议使用最新版本 -->
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.12</artifactId>
<version>3.1.1</version><!-- 请替换为具体的 Spark 版本号 -->
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.4</version><!-- 请替换为具体的 Hadop 版本号 -->
</dependency>
</dependencies>
2. 导入相关文件
导入你的core-site.xml、hdfs-site.xml、hive-site.xml到resources文件夹中,并且需要设置resources文件夹为资源根目录。(此处 log4j.properties 为日志输出文件,可以自行百度获取)
3. 在hdfs 中创建一个文件夹,用于存储数据文件
方法1 在linux中使用命令
#1、hdfs 命令
hdfs dfs -mkdir -p /input/data
#2、hadoop命令
hadoop fs -mkdir -p /input/data
方法2 在HDFS网页中创建文件夹
4. 运行Spark Streaming 文件
package chapter6
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
import org.apache.spark.streaming.dstream.DStream
object AdClickCountTop3 {
def main(args: Array[String]): Unit = {
// 第一步:配置Spark
val conf = new SparkConf().setAppName("AdClickCountTop3").setMaster("local[2]")
val ssc = new StreamingContext(conf, Seconds(10))
// 第五步:创建一个与HDFS目录连接的DStream
val adsLogStream = ssc.textFileStream("hdfs://hadoop102:8020/input/data/ads")
// 第六步:将每条记录映射为((省份ID, 广告ID), 1)元组
val adClicks = adsLogStream.map { record =>
val fields = record.split(" ")
((fields(1), fields(4)), 1) // 假设字段顺序为时间戳、省份ID、城市ID、用户ID、广告ID
}
// 第七步:按键聚合点击次数
val aggregatedClicks = adClicks.reduceByKey(_ + _)
// 第八步:重新排列元组为(省份ID, (广告ID, 总数))
val clicksByProvince = aggregatedClicks.map {
case ((provinceID, adID), sum) => (provinceID, (adID, sum))
}
// 第九步:按省份ID分组
val groupedByProvince = clicksByProvince.groupByKey()
// 第十步:对每个组内的点击次数进行排序并取前三名
val topAdsByProvince: DStream[(String, List[(String, Int)])] = groupedByProvince.mapValues { ads =>
ads.toList.sortBy(-_._2).take(3) // 按点击次数降序排序并取前三名
}
// 打印结果
topAdsByProvince.print()
// 启动计算
ssc.start()
ssc.awaitTermination()
}
}
5 上传数据到HDFS文件夹
同3一样,方法类似
方法1 在linux中使用命令
#相对路径(需要先进入存放数据文件的目录)
hdfs dfs -mkdir -p local_file.txt /input/data/
#绝对路径
hdfs dfs -mkdir -p /data/local_file.txt /input/data/
方法2 在HDFS网页中上传