回顾
1.基础语言:Java
2.大数据生态圈hadoop三大组件: HDFS MapReduce Yarn
HDFS : 用来存储数据
MapReduce : 用来计算数据
YARN: 进行资源调度
zookeeper : 分布式管理
3.Hive 使用的是类似SQL语言的HiveQL语言—>HQL语言
4.HBASE数据存储海量数据,NoSQL -->Not Only Sql ,列式存储
5.Flume采集日志
6.sqoop:数据导出
7.实时并发的计算框架------spark
40-50G Mysql会崩
spark也是基于hadoop
spark的开发语言:Java,scala,Python ------>主要是 scala ,python
spark的框架体系
HDFS的优缺点:
优点:
高可靠,高效性,高容错性,高扩展性
缺点:
不适合大量小文件存储
不支持多用户写入即任意修改文件
不适合低延迟数据访问
为什么选用HDFS?—即说优缺点
ps:hadoop2.x之后提供YARN,进行资源调度
MR是一个离线计算的框架,也就是对以往存储的数据进行分析
spark是一个实时的计算框架,可以对数据进行实时的分析处理
spark简介
spark: 快如闪电的处理引擎
spark是基于内存计算的大数据并行计算框架
Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。目前,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLlib等子项目,Spark生态系统已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、SparkStreaming、GraphX、MLlib等子项目,Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。Spark得到了众多大数据公司的支持,这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务;阿里利用GraphX构建了大规模的图计算和图挖掘系统,实现了很多生产系统的推荐算法;腾讯Spark集群达到8000台的规模,是当前已知的世界上最大的Spark集群。
为什么学 spark
中间结果输出:基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存和容错
处于任务管道承接,考虑到一些查询到MapReduce任务时,往往会产生多个Stage
产生stage–job,而串联这些任务依赖于HDFS存储系统,每一个Stage输出 一个结果
Spark是MR的替代方案,兼容HDFS Hive并且融到Hadoop生态圈,以弥补MR的不足
spark的特点
1.快 —是hadoop的100一百倍
比如运行时长
spark :0.9s hadoop : 110s
2.易用 -----支持Java,Scala,Python,R
3.通用性
spark提供了一些通用的解决方案,spark可以进行批处理,交互式查询,实时流处理,机器学习和图计算,
4.兼容性好:
spark 可以完美的融合其他开源产品
比如:可以完美融合 hadoop生态圈和yarn进行融合
Mesos: 作为资源管理和spark融合
还可以支持其他的hadoop组件
spark 安装包
spark提供了另外两种下载方式:
archive.apache.org/dist
github.com/apache/spark
spark的运行模式
Local :多用于本地测试,可以在eclipse或IDEA中进行程序书写,
StandLone :是spark自带的资源调度,它完全支持分布式
YARN:hadoop生态圈的资源框架,spark也可以基于yarn来进行计算
Meso:资源调度框架
Spark集群安装
基本设置:时间同步,免密,关闭防火墙,安装JDK,集群已经安装完Hadoop
1.上传安装包到hadoop1
2.将文件解压到指定的目录
tar -zxvf spark-1.6.3-bin-hadoop2.6.tgz -C /opt/software/
3.跳转到安装路径下的conf
cd /opt/software/spark-1.6.3/con进行配置
3.1 修改env文件
mv spark-env.sh.template spark-env.sh
vi spark-env.sh
在文件末尾添加
1)Java 的安装路径
2)SPARK_MASTER_IP = hadoop1
3)SPARK_MASTER_PORT = 7077
3.2 修改slaves.template 文件添加从节点
mv slaves.template slaves
内容:
hadoop2
hadoop3
hadoop4
4.分发配置好的内容到其他节点
scp -r ./spark-1.6.3 root@hadoop2:$PWD
scp -r ./spark-1.6.3 root@hadoop3:$PWD
scp -r ./spark-1.6.3 root@hadoop4:$PWD
5.配置全局变量:
vi /etc/profile
export SPARK_HOME=/opt/software/spark-1.6.3
需要在引用路径的最后添加 $SPARK_HOME/bin:
保存退出
source /etc/profile
spark启动集群
进入到安装目录找sbin目录进入 /opt/software/spark-1.6.3
启动 ./start-all.sh
spark提供webUI界面
和tomcat的端口是一样的
内部通信端口 : 7077
spark高可用
Master节点存在单点故障,要解决此问题,需要科技助zookeeper,并且至少启动两个Master节点来实现高可靠,配置方式比较简单:
Spark集群规划:
hadoop1,hadoop4是Master;
hadoop2 ,hadoop3 ,hadoop4是worker
安装配置zk集群
停止spark所有服务,修改配置文件spark-env.sh,在该配置文件中,删除SPARK_MASTER_IP,并添加如下配置:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -
Dspark.deploy.zookeeper.url=hadoop2,hadoop3,hadoop4 -Dspark.deploy.zookeeper.dir=/spark"
分发到hadoop2,hadoop3,hadoop4节点下
1.在hadoop1节点上修改slaves配置文件内容指定worker节点
ps:若是修改了slaves节点那么配置文件也分发
2.先启动zookeeper集群
3.在hadoop1上执行上执行sbin/start-all.sh脚本,然后在hadoop4上执行sbin/start-master.sh
启动第二个master
ps:在我们学习的过程中,使用这阿姨那个的单节点可以跑程序,在开发环境 下使用高可用就行
Spark的程序执行
若是运行spark任务,需要进入到bin目录下(bin是安装spark目录下的)
计算π例子
./spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop1:7077 /opt/software/spark-1.6.3/lib/spark-examples-1.6.3-hadoop2.6.0.jar 100
可以在webUI界面对任务进行一个监控任务
可以在webUI界面对任务进行查看
在启动任务的时候最先并没有指定资源分配,而是有多少资源就使用多少资源,在跑任务的时候是可以进行资源指定,
指定内存和核心数
–executor-memory 内存大小
–total–executor-cores 核心
在提交任务的时候使用上面这些设置
./spark-submit \
–class org.apache.spark.examples.SparkPi
–master spark://hadoop1:7077
–executormemory 512m
–total-executor-cores 2 /opt/software/spark-1.6.3/lib/spark-examples-1.6.3-hadoop2.6.0.jar 100
SparkShell
spark-shell是spark自带的交互式shell程序
通过shell可以进行交互式编程,可以在shell书写scala语言的scala语言的spark程序
spark-shell一般是用来进行spark程序测试或联系使用
spark-shell属于spark的特殊应用程序
spark-shell启动有两种方式:local模式和cluster模式
spark-shell直接启动就是本地模式
相当于在本机启动一个sparkSubmit进行,没有与集群建立联系,进程中是有submit,但是不回被提交到 集群
Cluster模式(集群模式)
spark-shell --master spark://hadoop1:7077
–executor-memory 512m --total-executor-cores 1
spark-shell是spark自带的交互式shell程序
通过shell可以进行交互式编程,可以在shell书写Scala语言的spark程序
spark-shell属于Spark的特殊程序:
spark-shell启动有两种方式:local模式和cluster模式
spark-shell直接启动就是本地local模式:
相当于在本机启动一个SparkSubmit进行,没有与集群建立关系,进行中是有Submit,但是不回被提交到集群
Cluster模式(集群模式)
spark-shell --master spark://hadoop1:7077 --executor -memory 512m --tootal-executor-cores 1
在使用sparkshell的 时候默认就已经创建好了两个变量
Sparkcontext 变量名是sc
SQLcontext 变量名是sqlContext
所以在shell中直接使用两个变量
sc.textFile(“hdfs://hadoop1:8020/word.txt”).flatMap(.split(" ")).map((,1)).reduceByKey(+).saveAsTextFile(“hdfs://hadoop1:8020/out”)
通过IDEA创建Spark项目
ps:不再是单纯的Scala项目,所以需要创建Maven项目
maven配置: 使用jar包和打包方式
spark配置:
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.10.6</scala.version>
<spark.version>1.6.3</spark.version>
<hadoop.version>2.6.4</hadoop.version>
<scala.compat.version>2.10</scala.compat.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<!--<testSourceDirectory>src/test/scala</testSourceDirectory>-->
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-make:transitive</arg>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass></mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
本地运行(spark实现单词统计)
1.在创建conf对象要设置setMaster(“local”)
读取数据
1.直接在工程读取
sc.textFile(“相对路径或者绝对路径”)
2.从HDFS上获取数据(集群开启)
端口号是内部通信端口号: 8020 / 9000
sc.textFile(“hdfs://集群:端口/文件名”)
写出数据
直接打印在控制台上或者直接存储到本地
sorted.saveAsFile(“out”) 本地存储路径
打印数据
println(sorted.collect.toBuffer)
sorted.foreach(x => println(x))
sorted.foreach(println)
即在本地运行的代码是:
sc.textFile("/root/word.txt").flatMap(.split(" ")).map((,1)).reduceByKey( _+ _).saveAsTextFile("/root/out1")