Spark2.4.4+Hadoop2.9快速搭建(Spark快速入门)

Spark概述

官网:http://spark.apache.org
官方文档:http://spark.apache.org/docs/latest/

Apache Spark是一个 快如闪电的 统一 分析引擎(并没有提供数据存储的方案)

快如闪电(相比于传统的大数据处理方案MapReduce):
  • Spark将一个复杂的计算任务Job拆分为多个细粒度的Stage,每一个Stage都可以分布式并行计算;对于MapReduce初代的计算引擎,它将任务拆分了粗粒度的MapTask和ReduceTask,对于特别复杂的计算任务,我们需要将多个MapReduce Job串联起来
  • Spark内存式的计算引擎;对于MapReduce基于磁盘的计算引擎
  • Spark中间计算结果支持缓存的,极大提高计算效率,这种缓存可以应用于结果复用和故障恢复;对于MapReduce中间结果需要溢写在磁盘
统一(提供了大数据处理的所有主流方案):
  • 批处理(Batch Processing): Spark RDD,代替了Hadoop MapReduce
  • 流处理(Streams Processing):Spark Streaming和Spark Structured Streaming,代替了Kafka Streams、Storm
  • 交互式查询(SQL):Spark SQL,代替了Hive
  • 机器学习(Machine Learning): Spark MLLib,代替了Mahout
  • 图形计算(Graph):Spark Graphx,基于图形存储的NoSQL数据库的计算支持(Neo4J)
  • Spark生态库: 解决其它大数据处理问题
Spark的特点:
  • 高效:实现高性能的批和流计算支持,使用了非常先进的DAG Scheduler(有向无环图调度器)是一种查询优化和物理执行引擎
  • 易用:提供了超过80个高阶函数简化了分布式并行应用的开发,并且支持多种编程语言(Java、Python、Scala、R)
  • 通用:集成了多种数据处理方案,如SQL、Batch、Streaming、ML、Graph
  • 运行环境:支持多种资源管理调度系统如YARN、Apache Mesos、K8S、Standalone等

Spark伪分布式集群环境搭建

准备工作

  • CentOS7.2以上的虚拟机
  • JDK8.0以上
  • hadoop-2.9.2.tar.gz(hadoop的安装包 这里使用2.9)
  • spark-2.4.4-bin-without-hadoop.tgz (Spark的安装包 这里使用当前最新的2.4.4)
初始化CentOS 7
网络:
# 1. 双网卡配置,添加网卡硬件,网络连接设置为NAT模式
# 2. 修改网卡的配置文件,ens33网卡(内网通信,静态地址,远程连接用) 
# 3. ens37网卡(外围通信,动态地址,联网用)
vi /etc/sysconfig/network-scripts/ifcfg-ens33
#远程用的网卡把如下配置加入就行了
BOOTPROTO=static
IPADDR=IP比如(192.168.197.201)
NETMASK=网络掩码如(255.255.255.0
关闭防火墙
systemctl disable firewalld
设置主机名
vi /etc/hosts
配置主机名和IP映射(host)
vi /etc/hosts
配置SSH免密登录
ssh-keygen -t rsa 
#让后三下回车
ssh-copy-id 本机HsotName/IP

# 验证免密登录
ssh IP/HostName
# 无需密码即可连接表示已完成
安装JDK1.8+
rpm -ivh jdk-8u171-linux-x64.rpm
# 这里是rpm一键安装
安装配置 Hadoop HDFS
# 解压
tar -zxf hadoop-2.9.2.tar.gz -C /usr
# 配置core-site
vi /usr/hadoop-2.9.2/etc/hadoop/core-site.xml
# 内容:
<!--nn访问入口-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://HostName:9000</value>
</property>
<!--hdfs工作基础目录-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/hadoop-2.9.2/hadoop-${user.name}</value>
</property>
# 配置hdfs-site
vi /usr/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
# 内容:
<!--block副本因子-->
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>
<!--配置Sencondary namenode所在物理主机-->
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>SparkOnStandalone:50090</value>
</property>
<!--设置datanode最大文件操作数-->
<property>
        <name>dfs.datanode.max.xcievers</name>
        <value>4096</value>
</property>
<!--设置datanode并行处理能力-->
<property>
        <name>dfs.datanode.handler.count</name>
        <value>6</value>
</property>
<!--关闭HDFS权限检查-->
<property>
          <name>dfs.permissions</name>
          <value>false</value>
</property>

# 配置主从位置
vi /usr/hadoop-2.9.2/etc/hadoop/slaves
# 内容:
本机的IP/HostName
环境变量配置
cd ~
vi .bashrc
# 内容
HADOOP_HOME=/usr/hadoop-2.9.2
JAVA_HOME=/usr/java/latest
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
CLASSPATH=.
export HADOOP_HOME
export JAVA_HOME
export PATH
export CLASSPATH

# 刷新配置
source .bashrc
初始化NameNode
hdfs namenode -format
启动HDFS
start-dfs.sh
# jps 可以查看当前的jvm进程
# 访问webUI确认启动成功 :http://IP:50070

安装Spark2.4.4

# 解压
tar -zxf spark-2.4.4-bin-without-hadoop.tgz -C /usr
cd /usr/
# 文件名太长不好操作建议更名
mv spark-2.4.4-bin-without-hadoop/ spark-2.4.4 
配置
# 在Spark的conf目录中

# 复制配置文件模板
cp slaves.template slaves
cp spark-env.sh.template spark-env.sh
cp spark-defaults.conf.template spark-defaults.conf

# 配置
vi spark-env.sh
# 添加如下配置

# worker服务实例 伪集群所以设置一个
SPARK_WORKER_INSTANCES=1
# master的主机地址 本机IP即可
SPARK_MASTER_HOST=HostName/IP
# 端口
SPARK_MASTER_PORT=7077
# 核心
SPARK_WORKER_CORES=4
# 内存
SPARK_WORKER_MEMORY=2g
LD_LIBRARY_PATH=/usr/hadoop-2.9.2/lib/native
SPARK_DIST_CLASSPATH=$(hadoop classpath)
export SPARK_MASTER_HOST
export SPARK_MASTER_PORT
export SPARK_WORKER_CORES
export SPARK_WORKER_MEMORY
export LD_LIBRARY_PATH
export SPARK_DIST_CLASSPATH
export SPARK_WORKER_INSTANCES
# 配置主从
vi slaves
# 将其localhost删除改为自己的HostName/IP

启动Spark Standalone模式集群(伪分布式)

Standalone:类似Hadoop Yarn,是spark自己实现的一个资源调度框架

# 在spark根目录执行 (记得先把hdfs也启动了)
sbin/start-all.sh
# 可以用jps验证

jps
17216 Master # Spark的Master
11266 NameNode
17347 Worker # Spark的Worker
11416 DataNode
11611 SecondaryNameNode
17612 Jps

# 或者访问webUI
http://IP:8080

Spark快速入门应用开发

第一种方式:Shell终端:

编写一些简单的Spark应用,主要用于测试

bin/spark-shell # --help 可以查看可选参数
--master # spark应用运行环境地址
--total-executor-cores # 当前任务所占用计算服务的核心数量    
--executor-cores # 每一个计算服务所占用的核心数量

案例:

bin/spark-shell --master spark://HostName:7077 --total-executor-cores 2

执行后可以看到一个 scala > (也就是我们熟悉的scala命令行窗口)

  • Spark context available as ‘sc’:应用上下文对象,包装了spark应用运行所需的环境信息; 别名SparkContext = sc
  • Spark session available as ‘spark’.: Spark SQL中关键对象,别名SparkSession = spark
编写Spark小Demo WordCount
# 1. 准备数据源,上传到HDFS
# 如data.txt 上传到HDFS中

# 2. 开发Spark应用 (sc的Spark-Shell的内置对象是SparkContext的实例)
sc.textFile("hdfs://HostName:9000/data.txt") 
    .flatMap(_.split("\\s"))
	.map((_,1))
	.groupBy(_._1)
	.map(t2 => (t2._1,t2._2.size))
	.sortBy(_._1,false)
	.saveAsTextFile("hdfs://HostName:9000/result2")
 
# 查看结果 如果对hdfs命令不熟悉的可以在hdfs的webui中在线查看文件内容可下载 
hdfs dfs -cat /result/*
(Very,1)
(To,1)
(Spark,2)
(Simple,1)
(Hello,2)
(Hadoop,2)
(Good,1)
第二种方式:IDE开发 打jar包 提交运行

生产环境惯用方法

导入开发依赖 (依赖可能比较到建议使用较好的网络连接)

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.4.4</version>
</dependency>

开发应用

object SparkWordCountApplication {
  def main(args: Array[String]): Unit = {
    //1. 初始化SC
    val conf = new SparkConf
        // AppName 随意设置
        .setAppName("wordcount")
        //SparkMaster的主机地址
        .setMaster("spark://IP:7077")
    val sc = new SparkContext(conf)

    //2. 通过sc构建数据源  rdd类似于scala集合
    sc.textFile("hdfs://IP:9000/data.txt")
    //3. 数据处理
      .flatMap((line: String) => line.split("\\s"))
      .map((word: String) => (word, 1L))
      .groupByKey()
      .map((t2: (String, Iterable[Long])) => (t2._1, t2._2.size))
      .sortBy((t2: (String, Int)) => t2._2,false)
      //输出到HDFS
      .saveAsTextFile("hdfs://SP:9000/result3")

    //4. 释放资源
    sc.stop()
  }
}

将应用打为计算jar包(注意有坑)

先Build!!!(直接package的话jar包中没有class文件)
在这里插入图片描述
再package
在这里插入图片描述
将计算jar包上传到虚拟机中

提交运行Spark程序
bin/spark-submit
# SparkMaster的地址
--master spark://SparkOnStandalone:7077 
# 程序主类(main)
--class com.netzhuo.SparkWordCountApplication 
# 所需的核心数
--total-executor-cores 2  
# jar包地址
/tmp/spark-wordcount-1.0-SNAPSHOT.jar
本地模拟运行方式

准备工作

# 1. windows计算机的hosts文件中配置虚拟机Ip的映射
# 路径:C:\Windows\System32\drivers\etc
IP HostName

修改Spark应用的配置代码

val conf = new SparkConf()
    conf.setAppName("wordcount")
    conf.setMaster("local[3]")  // local 本地  [*] 核心数量=*:CPU核心数量
Spark快速入门:基本工作原理简述

在这里插入图片描述

主要角色说明

  • 集群管理器(ClusterManager): 在Standalone集群中是Master负责整个分布式集群的资源管理和调度
  • 计算节点(ComputerNode):在Standalone集群中是Worker负责提供节点计算资源(CPU、网络、IO、磁盘等)和Task的真正处理
  • 驱动程序(Driver JVM进程)****:负责初始化SparkContext,将Spark Job拆分为多个Stage,每一个Stage包含了一个支持分布式并且计算TaskSet(Task的集合),最终将每一个Stage任务集提交到计算节点运行
  • 核心(Cores)能够同时运行的最大线程数量,超过Cores数量外的线程会等待执行;
  • 并行度(parallel)任务的并行度和TaskSet中的Task数量是相同的Task最终会由计算容器(Executor)中的线程进行处理计算
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值