官网:http://spark.apache.org
官方文档:http://spark.apache.org/docs/latest/
Apache Spark是一个 快如闪电的 统一 分析引擎(并没有提供数据存储的方案)
准备工作
# 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
vi /etc/hosts
ssh-keygen -t rsa
#让后三下回车
ssh-copy-id 本机HsotName/IP
# 验证免密登录
ssh IP/HostName
# 无需密码即可连接表示已完成
rpm -ivh jdk-8u171-linux-x64.rpm
# 这里是rpm一键安装
# 解压
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
hdfs namenode -format
start-dfs.sh
# jps 可以查看当前的jvm进程
# 访问webUI确认启动成功 :http://IP:50070
# 解压
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
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应用,主要用于测试
bin/spark-shell # --help 可以查看可选参数
--master # spark应用运行环境地址
--total-executor-cores # 当前任务所占用计算服务的核心数量
--executor-cores # 每一个计算服务所占用的核心数量
案例:
bin/spark-shell --master spark://HostName:7077 --total-executor-cores 2
执行后可以看到一个 scala > (也就是我们熟悉的scala命令行窗口)
SparkContext = sc
SparkSession = spark
# 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)
生产环境惯用方法
导入开发依赖 (依赖可能比较到建议使用较好的网络连接)
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-core_2.11artifactId>
<version>2.4.4version>
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()
}
}
先Build!!!(直接package的话jar包中没有class文件)
再package
将计算jar包上传到虚拟机中
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核心数量