提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
Hadoop的实时数据通过Spark Streaming读取kafka,需要先了解下Spark,要了解Spark需要搭建Spark环境
提示:以下是本篇文章正文内容,下面案例可供参考
一、Spark是什么?
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。(具体网上查看)
二、使用步骤
1.环境准备
说明 | 软件 |
---|---|
操作系统 | Windows 10 |
虚拟机 | VMware 15.5 |
Linux系统 | Centos 7 64位 |
Zookeeper | zookeeper-3.4.10 |
Hadoop | hadoop-3.3.1 |
HBase | Hbase2.4.4 |
Hive | Hive3.1.2 |
Kafka | kafka_2.12-3.0.0 |
Spark | spark-3.1.3 |
Scala | scala-2.12.10 |
开发工具 | IntelliJ IDEA 2020.1 |
2.集群规划
IP | HostName | Software | Process |
---|---|---|---|
192.168.74.88 | hadoop01 | hadoop,zookeeper,hbase,hive,mysql,kafka,spark,scala | DataNode,NodeManager,QuorumPeerMain,JournalNode,NameNode,DFSZKFailoverController,ResourceManager,HMaster,HRegionServer,RunJar,RunJar,kafka,Master,Worker |
192.168.74.89 | hadoop02 | hadoop,zookeeper,kafka,spark,scala | DataNode,NodeManager,QuorumPeerMain,JournalNode,NameNode,DFSZKFailoverController,HRegionServer,kafka,Worker |
192.168.74.90 | hadoop03 | hadoop,zookeeper,hbase,hvie,kafka,spark,scala | DataNode,NodeManager,QuorumPeerMain,JournalNode,ResourceManager,HMaster,HRegionServer,RunJar,kafka,Master,Worker |
3.Spark HA部署安装
代码如下(示例):
# 创建一个新目录root
mkdir -p /data/spark
mkdir -p /data/scala
chown hadoop:hadoop /data/spark
chown hadoop:hadoop /data/scala
su hadoop
cd /data/spark
tar -zxvf spark-3.1.3-bin-hadoop3.2.tgz
# 重命名一下文件夹
mv spark-3.1.3-bin-hadoop3.2 app
cd /data/scala
tar -zxvf scala-2.12.10.tgz
# 重命名一下文件夹
mv scala-2.12.10 app
cd /data/spark/app/conf
cp spark-env.sh.template spark-env.sh
vim /data/spark/app/conf/spark-env.sh
gedit /data/spark/app/conf/spark-env.sh
-------------------------
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre
#指定masster节点的webui端口
export SPARK_MASTER_WEBUI_PORT=8081
export SPARK_WORKER_WEBUI_PORT=8086
#每个worker从节点能够支配的内存数
export SPARK_WORKER_MEMORY=512M
#允许Spark应用程序在计算机上使用的核心总数(默认值:所有可用核心)
export SPARK_WORKER_CORES=1
#每个worker从节点的实例(可选配置)
export SPARK_WORKER_INSTANCES=1
#指向包含Hadoop集群的(客户端)配置文件的目录,运行在Yarn上配置此项
export SCALA_HOME=/data/scala/app
export HADOOP_HOME=/data/hadoop/app
export HADOOP_CONF_DIR=/data/hadoop/app/etc/hadoop
#指定整个集群状态是通过zookeeper来维护的,包括集群恢复
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=hadoop01:2181,hadoop02:2181,hadoop03:2181
-Dspark.deploy.zookeeper.dir=/data/spark/sparkmaster"
---------------------------------------------
mkdir -p /data/spark/sparkmaster
# 将spark-defaults.conf.template 改为 spark-defaults.conf
cp spark-defaults.conf.template spark-defaults.conf
vim /data/spark/app/conf/spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://nn/spark-logs
vim /data/spark/app/sbin/spark-config.sh
vim spark-config.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.322.b06-1.el7_9.x86_64/jre
# cp workers.template workers
vim /data/spark/app/conf/workers
gedit /data/spark/app/conf/workers
hadoop01
hadoop02
hadoop03
# 系统环境变量
vim ~/.bashrc
gedit ~/.bashrc
export SPARK_HOME=/data/spark/app/
export PATH=$PATH:$SPARK_HOME/bin
export SCALA_HOME=/data/scala/app/
export PATH=$PATH:$SCALA_HOME/bin
source ~/.bashrc
# 分发spark文件
scp -r /data/spark/app hadoop@hadoop02:/data/spark
scp -r /data/scala/app hadoop@hadoop02:/data/scala
scp -r /data/spark/app hadoop@hadoop03:/data/spark
scp -r /data/scala/app hadoop@hadoop03:/data/scala
启动Spark HA
hadoop01: cd /data/spark/app/sbin/
hadoop01: ./start-all.sh
hadoop01: ./stop-all.sh
hadoop03: cd /data/spark/app/sbin/
hadoop03: ./start-master.sh
hadoop03: ./stop-master.sh
浏览器查看 Spark 的 Web UI
http://192.168.74.88:8081(ALIVE)
http://192.168.74.90:808(STANDBY)
4.# 测试 Spark 集群
代码如下(示例):
spark-shell --master spark://hadoop01:7077 --executor-memory 512m -total-executor-cores 3
val textFile = sc.textFile("hdfs://ns/input/datas");
textFile.count
val wordsRDD = textFile.flatMap(_.split(" "));
val pairRDD = wordsRDD.map((_,1));
val wordCountRDD = pairRDD.reduceByKey(_ + _);
wordCountRDD.foreach(wordCount=>println(wordCount._1+"--"+wordCount._2));
wordCountRDD.saveAsTextFile("hdfs://ns/output/wordCount/java/JavaWordCount");
总结
Spark 使用java 代码执行没成功,不知道为什么:
java.lang.ClassCastException: cannot assign instance of java.lang.invoke.SerializedLambda to field org.apache.spark.rdd.MapPartitionsRDD.f of type scala.Function3 in instance of org.apache.spark.rdd.MapPartitionsRDD