Spark
大数据概述
什么是大数据
+ 关于大数据的定义,不同行业有不同的声音
+ 专业咨询公司IDC对大数据特征的定义:4V
+ 数据量(Volume)
+ 速度(Velocity)
+ 多样性,复杂性(Variety)
+ 基于高度分析的新价值(Value)
大数据带来的技术变革
+ 计算瓶颈
+ 存储瓶颈(分布式存储)
+ 数据库瓶颈(关系型数据库:MySQL/Oracle;非关系型数据库:Hbase/Redis)
大数据公司现存的模式
+ 手握大数据,但是没有利用好(电信行业)
+ 没有数据,但是知道如何帮助有数据的人利用它(IBM)
+ 既有数据,又有大数据思维(谷歌/亚马逊)
Hadoop
Hadoop的由来
+ 是一个虚构的名词
+ Hadoop项目作者的孩子给一个棕黄色的大象样子的填充玩具的命名
什么是Hadoop
+ 一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力告诉运算和存储
+ Distributed File System(HDFS)
+ YARN
+ MapReduce
狭义Hadoop vs 广义Hadoop
+ 狭义Hadoop:是一个适合大数据分布式存储、分布式计算和资源调度平台
+ 广义Hadoop:指的是Hadoop生态系统,Hadoop生态系统是一个很庞大的概念,Hadoop是其中最重要最基础的一个部分;生态系统中的每一个子系统之解决某一个特定的问题域(甚至可能很窄),不搞统一型的一个全能系统,而是小而精的多个小系统
+ Hadoop生态系统
+ HDFS:分布式存储系统
+ HBase:
+ YARN:
+ Hive:
+ R:
+ Mahout:(停止维护)
+ Pig:
+ Oozie:
+ Zookeeper:
+ Flume:
+ Sqoop:
为什么很多公司选择Hadoop作为大数据平台的解决方案?
+ 源码开源
+ 社区活跃,参与者很多
+ 涉及到分布式存储和计算的方方面面
+ Flume进行数据采集,Spark/MR/Hive等进行数据处理,HDFS/HBase进行数据存储
+ 已得到企业界的验证
分布式文件系统HDFS
+ Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS
+ 源自于Google的GFS论文
+ 发表于2003年,HDFS是GFS的克隆版
HDFS的设计目标
+ 非常巨大的分布式文件系统
+ 运行在普通廉价的硬件上
+ 易扩展、为用户提供性能不错的文件存储服务
HDFS架构
+ 主从架构:一个 Master 带 N个Slaves
+ NameNode:Master(NN)
+ dataNode:Slaves(DN)
+ 一个文件会被拆分成多个Block(块)
+ 通过BlockSize控制(default:128M)
+ namenode
+ 负责客户端请求的响应
+ 负责元数据(文件的名称、副本系统、Block存放的DN)的管理
+ datanode
+ 存储用户的文件对应的数据块(Block)
+ 要定期向NN发送心跳信息,汇报本身及其所有的Block信息,健康信息
A typical deployment has a dedicated machine that run only the NameNode software, Each of the other machines in the cluster runs one instance of the DataNode software.
The architecture does not preclude running multiple DataNodes on the same machine but in a real deployment that is rarely the case.
+ 建议:NN和DN是部署在不同的节点上
HDFS副本机制
HDFS supports a traditional hierarchical file organization. A user or an application can create directories and store file inside these directories. The file system namespace hierarchy is similar to most other existing file systems; one can create and remove files, move a file from one directory to another, or rename a file.
All blocks in a file except the last block are the same size.
# 除了最后一个block,其他的block大小都应该是相同的
+ replication factor : 副本因子|副本系数
HDFS环境搭建
+ 1、下载:http://archive.cloudera.com/cdh5/cdh/5/
+ 版本:hadoop-2.6.0-cdh5.7.0
+ software:存放的是所有的安装软件包
+ app:存放的是所有软件的安装目录
+ data:存放的是所有使用测试数据目录
+ source:存放的是软件源码目录:Spark/Zeppelin
+ 2、安装JDK
+ 下载 -> 解压 -> 配置环境变量
+ 配置到系统环境环境变量(~/.bash_profile)
+ /home/spark/app/jdk1.8.0_181
+ export JAVA_HOME=/home/spark/app/jdk1.8.0_181
+ export PATH=$JAVA_HOME/bin:$PATH
+ 3、机器参数设置
+ hostname:hadoop
+ 修改机器名:/etc/sysconfig/network
+ NETWORKING:yes
+ HOSTNAME:hadoop
+ 设置ip和hostname的映射关系:/etc/hosts
+ 192.168.248.143 hadoop
+ 设置SSH免密码登陆(本步骤可以省略,但是后面重启hadoop进程时是需要手工输入密码才行)
+ ssh-keygen -t rsa
+ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
+ 4、hadoop配置文件设置
+ 文件路径:/home/spark/app/hadoop-2.6.0-cdh5.7.0/etc/hadoop
# hadoop-env.sh
export JAVA_HOME=/home/spark/app/jdk1.8.0_181
# core-site.xml
< property>
< name> fs.defaultFS</ name>
< value> hdfs://hadoop:8020</ value>
</ property>
< property>
< name> hadoop.tmp.dir</ name>
< value> /home/spark/app/tmp</ value>
</ property>
# hdfs-site.xml
# 配置文件系统副本系数
< property>
< name> dfs.replication</ name>
< value> 1</ value>
</ property>
+ 5、格式化HDFS
+ 注意:这一步操作,只是在第一次时执行,每次如果都格式化的话,那么HDFS上的数据就会被清空
+ 目录:/home/spark/app/hadoop-2.6.0-cdh5.7.0/bin
+ hdfs namenode -format
+ 6、启动|停止HDFS
+ 目录:/home/spark/app/hadoop-2.6.0-cdh5.7.0/sbin
+ ./start-dfs.sh
+ ./stop-dfs.sh
+ 验证:hadoop:50070
+ 7、配置环境变量
+ export HADOOP_HOME=/home/spark/app/hadoop-2.6.0-cdh5.7.0
+ export PATH=$HADOOP_HOME/bin:$PATH
HDFS shell常用命令的使用
+ ls
+ mkdir
+ put
+ get
+ rm
HDFS优点
+ 高容错
+ 适合批处理
+ 适合大数据处理
+ 可构建在廉价机器上
HDFS缺点
+ 低延迟的数据访问
+ 小文件存储
分布式计算框架MapReduce
什么是MapReduce
+ 源自于Google的MapReduce论文
+ 发表于2004年12月,Hadoop MapReduce是Google MapReduce的克隆版
MapReduce特点
+ 易于编程
+ 良好的扩展性
+ 高容错性
+ 海量数据的离线处理
MapReduce不擅长的场景
+ 实时计算
+ 流式计算
+ DAG计算:A->B->C:存在依赖关系
MapReduce编程模型
+ input
+ map & reduce => Splitting -> Mapping -> Shuffling -> Reducing -> Result
+ output
资源调度框架YARN
+ YARN产生背景
+ MapReduce1.x存在的问题
+ 资源利用率&运维成本
+ 催生了YARN的诞生
YARN架构
+ 1 RM(ResourceManager) + N NM(NodeManager)
+ ResourcrManager的职责:(一个集群active状态的RM只有一个,负责整个集群的资源管理和调度)
+ 1、处理客户端的请求(启动/杀死)
+ 2、启动/监控ApplicationMaster(一个作业对应一个AM)
+ 3、监控NM
+ 4、系统的资源分配和调度
+ NodeManager的职责:(整个集群中有N个,负责单个节点的资源管理和使用以及task的运行情况)
+ 定期向RM汇报本节点的资源使用请求和各个Container的运行状态
+ 接受并处理RM的Container的启动/停止的各种命令
+ 单个节点的资源管理和任务管理
+ ApplicationMaster的职责:每个应用/作业对应一个,负责应用程序的管理
+ 数据切分
+ 为应用程序向RM申请资源(container),并分配给内部任务
+ 与NM通信以启动/停止task,task是运行在Container中的
+ task的监控和容错
+ Container的职责:(对任务运行情况的描述)
+ cpu,memory,环境变量等
+ YARN执行流程:
+ 1、用户向YARN提交作业
+ 2、RM为该作业分配第一个Container(AM)
+ 3、RM会与对应的NM通信,要求NM在这个Container上启动应用程序的AM
+ 4、AM首先向RM注册,然后AM将各个任务申请资源,并监控运行情况
+ 5、AM采用轮询的方式通过RPC协议向RM申请和领取资源
+ 6、AM申请到资源以后,便和相应的NM通信,要求NM启动任务
+ 7、NM启动我们作业对应的task
YARN环境搭建
+ 使用版本:hadoop-2.6.0-cdh5.7.0
+ 修改配置文件
# yarn-site.xml
< property>
< name> yarn.nodemanager.aux-services</ name>
< value> mapreduce_shuffle</ value>
</ property>
# mapred-site.xml
< property>
< name> mapreduce.framework.name</ name>
< value> yarn</ value>
</ property>
+ 启动|停止YARN
+ 路径:/home/spark/app/hadoop-2.6.0-cdh5.7.0/sbin
+ ./start-yarn.sh
+ ./stop-yarn.sh
+ 验证:hadoop:8088
+ 提交mr作业到yarn上运行:wc
+ 路径:/home/spark/app/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar wordcount /input/wc/hello.txt /output/wc/hello.txt
大数据数据仓库Hive
Hive产生背景
+ MapReduce编程的不便性
+ HDFS上的文件缺少Schema
Hive是什么
+ 由Facebook开源,最初用于解决海量结构化的日志数据统计问题
+ 构建在Hadoop之上的数据仓库
+ Hive定义了一种类SQL的查询语言:HQL(类似于SQL但不完全相同)
+ 通常用于进行离线数据处理(采用MapReduce)
+ 底层支持多种不同的执行引擎(MapReduce/Spark/TeZ)
+ Hive on MapReduce
+ Hive on Spark
+ Hive on TeZ
+ 支持多种不同的压缩格式(GZIP/LZO/Snappy/BZIP2...)、存储格式(TextFile/SequenceFile/RCFile/ORC/Parquet...)以及自定义函数(UDF(user-defined function))
为什么使用Hive
+ 简单、容易上手(提供了类似于SQL查询语言HQL)
+ 为超大数据集设计的计算/存储扩展能力(MR计算,HDFS存储)
+ 统一的元数据管理(可与Presto(京东)/Impala(基于内存)/SparkSQL等共享数据)
Hive发展历程
+ 08/2007 - Journey Start from Facebook
+ 08/2013 - Hive 0.11.0 as Stinger Phase 1 - ORC, HiveServer2
+ 10/2013 - Hive 0.12.0 as Stinger Phase 2 - ORC improvement
+ 04/2014 - Hive 0.13.0 as Stinger Phase 3 - vectorized query engine and TeZ
+ 11/2014 - Hive 0.14.0 as Stinger.next Phase 1 - Cost-based optimizer
+ 01/2015 - Hive 1.0.0
+ 03/2015 - Hive 1.1.0
+ 05/2015 - Hive 1.2.0
+ 02/2016 - Hive 2.0.0
+ 06/2016 - Hive 2.1.0
Hive体系架构
+ Command-line shell / Thrift/JDBC
+ Driver/SQL Parser/Query Optimizer/Physical Plan/SerDes,UDFs/Execution
+ MapReduce
+ HDFS,HBase
+ Metastore
+ RDBMS(MySQL)
Hive部署架构
+ 测试环境
+ MySQL <-> Hive <-> Derby
+ 生产环境
+ Standby MySQL <-> Active MySQL <-> Hive -> Hadoop Cluster
+ Hadoop Cluster: RM / NN / DN|NM
Hive环境搭建
+ 下载 hive-1.1.0-cdh5.7.0.tar.gz
+ 配置环境变量
+ export HIVE_HOME=/home/spark/app/hive-1.1.0-cdh5.7.0
+ export PATH=$HIVE_HOME/bin:$PATH
+ 事先安装一个MySQL,yum install xxx
+ 启动mysql服务
+ service mysqld restart
# hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
< configuration>
< property>
< name> javax.jdo.option.ConnectionURL</ name>
< value> jdbc:mysql://localhost:3306/sparksql?createDatabaseIfNotExist=true</ value>
</ property>
< property>
< name> javax.jdo.option.ConnectionDriverName</ name>
< value> com.mysql.jdbc.Driver</ value>
</ property>
< property>
< name> javax.jdo.option.ConnectionUserName</ name>
< value> root</ value>
</ property>
< property>
< name> javax.jdo.option.ConnectionPassword</ name>
< value> root</ value>
</ property>
</ configuration>
+ 拷贝mysql驱动到$HIVE_HOME/lib
+ 启动Hive
+ 路径:/home/spark/app/hive-1.1.0-cdh5.7.0/bin
+ ./hive
Hive基本使用
create table hive_wordcount( context string) ;
use sparksql;
show tables ;
select * from TBLS;
select * from COLUMNS_V2;
load data local inpath '/home/spark/data/hello.txt' into table hive_wordcount;
select word, count ( 1 ) from hive_wordcount lateral view explode( split( context, ' ' ) ) wc as word group by word;
create table emp(
empno int ,
ename string,
job string,
mgr int ,
hiredate string,
sal double ,
comm double ,
deptno int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
create table dept(
deptno int ,
dname string,
location string
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;
load data local inpath '/home/spark/data/emp.txt' into table emp;
load data local inpath '/home/spark/data/dept.txt' into table dept;
select deptno, count ( 1 ) from emp group by deptno;
Spark及生态圈概述
+ Spark产生背景
+ Spark概述及特点
+ Spark发展历史
+ Spark Survey
+ Spark对比Hadoop
+ Spark和Hadoop的协作性
+ Spark开发语言
+ Spark运行模式
Spark产生背景
+ MapReduce局限性
+ 代码繁琐
+ 只能够支持map和reduce方法
+ 执行效率底下
+ 不适合迭代多次、交互式、流式的处理
+ 框架的多样化:学习成本、运维成本
+ 批处理(离线处理):MapReduce,Hive,Pig
+ 流式处理(实时):Storm,JStorm
+ 交互式计算:Impala
+
Spark概述及特点
+ Speed(速度)
+ Ease of Use(易用)
+ Generality(通用)
+ Runs Everywhere(运行在任何地方)
Spark发展历史
+ 2010 - start
+ 2013 - Databricks started & donated to ASF
+ 2014 - Spark 1.0 & libraries(SQL/ML/Graphx)
+ 2015 - DataFrames | Tungsten | ML Pipelines
+ 2016 - Spark 2.0
Spark Survey
+ 场景
+ Business Intellugence
+ Data Warehousing
+ Recommendation Systems
+ Log Processing
+ User Facing Services
+ Fraud Detection & Security Systems
+ Other
+ 调查
+ Performance
+ Ease of programming
+ Ease of deployment
+ Advanced analytics
+ Real-time streaming
Spark对比Hadoop
+ Hadoop
+ HDFS
+ YARN & MR
+ HIVE
+ R
+ MAHOUNT
+ PIG
+ OOZIE
+ HBASE
+ ZOOKEEPER
+ FLUME
+ SQOOP
+ Spark:BDAS(Berkeley Data Analytics Stack)
+ Supported Release(支持的版本)
+ Mesos : Cluster resource manager, multi-tenancy
+ Tachyon : Distributed Memory-Centric Storange System
+ Spark : Fast memory-optimized execution engine(Python/java/Scala APIs)
+ Spark Streaming : Stream processing
+ Graphx : Graph computation
+ MLlib : User-friendly machine learning
+ SparkSQL : SQL API
+ Related External Project(相关的外部项目)
+ HDFS,S3,GlusterFS(Related External Project)
+ Hive
+ Storm
+ MPI
+ In Development(正在开发)
+ BlinkDB
+ Hadoop生态圈对比Spark BDAS
Use Case Other Spark Batch Processing Hadoop`s MapReduce(Java,Pig,Hive) Spark RDDs(java/scala/python) SQL querying Hadoop:Hive Spark SQL Stream Processing / Real Time Processing Storm / Kafka Spark Streaming Machine Learning Mahout Spark ML Lib Real Time lookups NoSQL(Hbase,Cassandra…etc) No Spark component. But Spark can query data in NoSQL stores
+ Hadoop对比Spark
Hadoop Spark Distributed Storage + Distributed Compute Distributed Compute Only MapReduce Framework Generalized Computation Usually data on disk(HDFS) On disk / in memory No ideal for iterative work Great at Iterative workloads (machine learning …etc) Batch process - Upto 2x-10x faster for data on disk - Upto 100x faster for data in memory Compact code (Java/Python/Scala Supported)
+ MapReduce对比Spark
Spark实战环境搭建
+ Spark源码编译
+ Spark环境搭建
+ Spark简单使用
Spark源码编译
+ 前置要求
+ Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+.
+ Note that support for Java 7 is deprecated as of Spark 2.0.0 and may be removed in Spark 2.2.0.
+ 设置maven内存参数
+ export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
+ maven编译命令(两种方式)
+ mvn -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0 -DskipTests clean package
+ ./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Pyarn -Phadoop-2.6 -Phive -Phive-thriftserver -Dhadoop.version=2.6.0-cdh5.7.0
+ 编译出现的问题:
+ cdh版本找不到
< repository>
< id> cloudera</ id>
< url> https://repository.cloudera.com/artifactory/cloudera-repos/</ url>
</ repository>
+ 如果编译的Scala版本是2.10
+ ./dev/change-scala-version.sh 2.10
+ 依赖已存在本地中,导致编译失败
+ 去仓库把 xxx.lastUpdated文件全部删除,重新执行即可
+ 在编译命令后面添加参数 -U
+ 如果在编译过程中,你看到的一场信息不是太明显/看不太懂
+ 在编译命令后面添加参数 -X,就能看到更详细的异常信息
Spark环境搭建
local模式
+ 解压编译好的源码
+ tar -zxvf spark-2.1.0-bin-2.6.0-cdh5.7.0.tar.gz -C ~/app/
+ 将解压好的文件目录配置到环境变量中
+ export SPARK_HOME=/home/spark/app/spark-2.1.0-bin-2.6.0-cdh5.7.0
+ export PATH=$SPARK_HOME/bin:$PATH
+ 启动local模式
+ 启动目录:/home/spark/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/bin
+ spark-shell --master local[n] (n-代表启动几个线程)
+ 退出Spark-shell
+ :quit
Standalone模式
+ Spark Standalone模式的架构和Hadoop HDFS/YARN很类似
+ 1 master + n worker
+ 配置
+ 目录:/home/spark/app/spark-2.1.0-bin-2.6.0-cdh5.7.0/conf
+ cp spark-env.sh.template spark-env.sh
+ vim spark-env.sh
+ SPARK_MASTER_HOST=hadoop
+ SPARK_WORKER_CORES=2
+ SPARK_WORKER_MEMORY=1g
+ SPARK_WORKER_INSTANCES=1 (1个instances)
+ 如果启用了slaves,在你使用start-all.sh,会在hadoop主节点上启动master进程,在slaves文件配置的所有hostname的机器上启动worker进程
+ 注意:
+ 1、当你spark-env.sh设置的和上面一样,但是你的虚拟机的配置不够时,你使用start-all.sh时,可以启动spark-shell,并且此时spark状态为RUNNING,并在控制台执行spark-shell --master spark://hadoop:7077,你是可以进去spark界面,但是你执行任务时,会强制退出
+ 2、当你spark-env.sh设置和你虚拟机上的配置一样时,你使用start-all.sh时,可以启动spark-shell,并在控制台执行spark-shell --master spark://hadoop:7077,你依旧可以进去spark界面,但是你的spark此时状态为waitting,也就是说你启动的spark-shell并没有得到执行任务的资源,这时你就需要在启动spark-shell --master spark://hadoop:7077 --total-executor-cores 1 --executor-memory 512m
Spark简单使用
+ 使用Spark完成workcount统计
+ val textFile = sc.textFile(args(0))
+ val wordcount = textFile.flatMap(line=>line.split(" ")).map((word=>(word,1))).reduceByKey(_+_)
var file = spark.sparkContext.textFile("file:///home/spark/data/wc.txt")
var wordcount = file.flatMap(line => line.split(",")).map((word => (word, 1))).reduceByKey(_+_)
wordcount.collect