提交 80e06d84 编写于 作者: kingreatwill's avatar kingreatwill

大数据。

上级 6d64c9ff
## Hadoop痛点
一个产品的出现肯定是为了解决用户的痛点,在大数据领域,我们这些使用Hadoop、Hive、Hbase等的开发者来说就是其用户。如果使用原生的ApacheHadoop,在工作中我总结出了如下痛点(部分):
1、集群规模很庞大时搭建Hadoop集群复杂度越来越高,工作量很大
2、规模很大的集群下升级Hadoop版本很费时费力
3、需要自己保证版本兼容,比如升级Hadoop版本后需要自己保证与Hive、Hbase等的兼容
4、安全性很低
## Hadoop发行版本引入
有了上述原生Hadoop不足,Apache官方和一些第三方就发布了一些Hadoop发行版本来解决此类问题。一些有名的发行版本列举如下:
• Apache Hadoop
• Cloudera’s Distribution Including Apache Hadoop(CDH)
• Hortonworks Data Platform (HDP)
• MapR
• EMR
\ No newline at end of file
......@@ -52,6 +52,8 @@ tar xzf flink-*.tgz
cd flink-1.9.1
./bin/start-cluster.sh # Start Flink
# http://localhost:8081
```
......
<!--toc-->
[TOC]
# Hadoop 非正式介绍
![](img/spark-a.jpg)
![](img/spark-b.jpg)
![](img/spark-c.jpg)
![](img/spark-d-3.0.jpg)
ETL(Extract-Transform-Load)用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程、数据清洗(Data cleaning)
## Delta Lake
https://delta.io/
https://github.com/delta-io/delta
## mlflow
https://www.mlflow.org/
https://github.com/mlflow/mlflow/
## 分布式计算引擎
### MapReduce
MapReduce 模型的诞生是大数据处理从无到有的飞跃。但随着技术的进步,对大数据处理的需求也变得越来越复杂,MapReduce 的问题也日渐凸显。通常,我们将 MapReduce 的输入和输出数据保留在 HDFS 上,很多时候,复杂的 ETL、数据清洗等工作无法用一次 MapReduce 完成,所以需要将多个 MapReduce 过程连接起来:
![](img/map-reduce.jpeg)
这种方式下,每次中间结果都要写入 HDFS 落盘保存,代价很大(HDFS 的每份数据都需要冗余若干份拷贝)。另外,由于本质上是多次 MapReduce 任务,调度也比较麻烦,实时性无从谈起。
### Spark
生态及运行原理
![](img/spark-a1.png)
> 集群模式还支持:Standalone独立集群和K8S
#### Spark 特点
- **运行速度快:** Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算。官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
- **适用场景广泛:** 大数据分析统计,实时数据处理,图计算及机器学习
- **易用性:** 编写简单,支持80种以上的高级算子,支持多种语言,数据源丰富,可部署在多种集群中
- **容错性高:** Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data和Logging The Updates,用户可以控制采用哪种方式来实现容错。
#### Spark的适用场景
- 复杂的批量处理(Batch Data Processing),偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
- 基于历史数据的交互式查询(Interactive Query),通常的时间在数十秒到数十分钟之间
- 基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间
#### Spark 与 RDD 模型
针对上面的问题,如果能把中间结果保存在内存里,岂不是快的多?之所以不能这么做,最大的障碍是:分布式系统必须能容忍一定的故障,所谓 fault-tolerance(错误容忍)。如果只是放在内存中,一旦某个计算节点宕机,其他节点无法恢复出丢失的数据,只能重启整个计算任务,这对于动辄成百上千节点的集群来说是不可接受的。
一般来说,想做到 fault-tolerance 只有两个方案:要么存储到外部(例如 HDFS),要么拷贝到多个副本。Spark 大胆地提出了第三种——重算一遍。但是之所以能做到这一点,是依赖于一个额外的假设:所有计算过程都是确定性的(deterministic)。Spark 借鉴了函数式编程思想,提出了 RDD(Resilient Distributed Datasets),译作“弹性分布式数据集”。
![](img/spark-rdd.jpeg)
RDD 是一个只读的、分区的(partitioned)数据集合。RDD 要么来源于不可变的外部文件(例如 HDFS 上的文件),要么由确定的算子由其他 RDD 计算得到。RDD 通过算子连接构成有向无环图(DAG),上图演示了一个简单的例子,其中节点对应 RDD,边对应算子。
回到刚刚的问题,RDD 如何做到 fault-tolerance?很简单,RDD 中的每个分区都能被确定性的计算出来,所以一旦某个分区丢失了,另一个计算节点可以从它的前继节点出发、用同样的计算过程重算一次,即可得到完全一样的 RDD 分区。这个过程可以递归的进行下去。
![](img/spark-rdd-2.jpeg)
RDD 作为数据,在多种算子间变换,构成对执行计划 DAG 的描述。最后,一旦遇到类似 collect()这样的输出命令,执行计划会被发往 Spark 集群、开始计算。
算子分成两类:
- map()、filter()、join() 等算子称为 Transformation,它们输入一个或多个 RDD,输出一个 RDD。
- collect()、count()、save() 等算子称为 Action,它们通常是将数据收集起来返回;
```python
lines = spark.read.text("filename").rdd.map(lambda r: r[0])
counts = lines.flatMap(lambda x: x.split(' ')) \
.map(lambda x: (x, 1)) \
.reduceByKey(add)
output = counts.collect()
for (word, count) in output:
print("%s: %i" % (word, count))
```
#### Spark SQL
Spark 诞生后,大幅简化了 MapReduce 编程模型,但人们并不满足于此。于是诞生了声明式接口:Spark SQL。我们知道,与命令式(imperative)编程相对的是声明式(declarative)编程,前者需要告诉程序怎样得到我需要的结果,后者则是告诉程序我需要的结果是什么。举例而言:你想知道,各个部门 `<dept_id, dept_name>`中性别为女 'female'的员工分别有多少?
命令式编程中:
```
employees = db.getAllEmployees()
countByDept = dict() // 统计各部门女生人数 (dept_id -> count)
for employee in employees:
if (employee.gender == 'female')
countByDept[employee.dept_id] += 1
results = list() // 加上 dept.name 列
depts = db.getAllDepartments()
for dept in depts:
if (countByDept containsKey dept.id)
results.add(row(dept.id, dept.name, countByDept[dept.id]))
return results;
```
声明式编程中,你只要用关系代数的运算表达出结果:
```
employees.join(dept, employees.deptId == dept.id).where(employees.gender == 'female').groupBy(dept.id, dept.name).agg()
```
> 等价SQL: `SELECT dept.id,dept.name,COUNT(*) FROM employees JOIN dept ON employees.dept_id = dept.id WHERE employees.gender ='female' GROUP BY dept.id,dept.name`
显然,声明式的要简洁的多!但声明式编程依赖于执行者产生真正的程序代码,所以除了上面这段程序,还需要把数据模型(即 schema)一并告知执行者。声明式编程最广为人知的形式就是 SQL。
Spark SQL 就是这样一个基于 SQL 的声明式编程接口。你可以将它看作在 Spark 之上的一层封装,在 RDD 计算模型的基础上,提供了 DataFrame API 以及一个内置的 SQL 执行计划优化器 Catalyst。
![](img/spark-sql-1.jpeg)
> 上图黄色部分是 Spark SQL 中新增的部分
DataFrame 就像数据库中的表,除了数据之外它还保存了数据的 schema 信息。计算中,schema 信息也会经过算子进行相应的变换。DataFrame 的数据是行(row)对象组成的 RDD,对 DataFrame 的操作最终会变成对底层 RDD 的操作。
Catalyst 是一个内置的 SQL 优化器,负责把用户输入的 SQL 转化成执行计划。Catelyst 强大之处是它利用了 Scala 提供的代码生成(codegen)机制,物理执行计划经过编译,产出的执行代码效率很高,和直接操作 RDD 的命令式代码几乎没有分别。
![](img/spark-sql-2.jpeg)
>上图是 Catalyst 的工作流程,与大多数 SQL 优化器一样是一个 Cost-Based Optimizer (CBO),但最后使用代码生成(codegen)转化成直接对 RDD 的操作。
#### 流计算框架:Spark Streaming
以往,批处理和流计算被看作大数据系统的两个方面。我们常常能看到这样的架构——以 Kafka、Storm和后来的Flink 为代表的流计算框架用于实时计算,而 Spark 或 MapReduce 则负责每天、每小时的数据批处理。在 ETL 等场合,这样的设计常常导致同样的计算逻辑被实现两次,耗费人力不说,保证一致性也是个问题。
Spark Streaming 正是诞生于此类需求。传统的流计算框架大多注重于低延迟,采用了持续的(continuous)算子模型;而 Spark Streaming 基于 Spark,另辟蹊径提出了 D-Stream(Discretized Streams)方案:将流数据切成很小的批(micro-batch),用一系列的短暂、无状态、确定性的批处理实现流处理。
![](img/spark-straming-1.jpeg)
Spark Streaming 的做法在流计算框架中很有创新性,它虽然牺牲了低延迟(一般流计算能做到 100ms 级别,Spark Streaming 延迟一般为 1s 左右),但是带来了三个诱人的优势:
- 更高的吞吐量(大约是 Storm 的 2-5 倍)
- 更快速的失败恢复(通常只要 1-2s),因此对于 straggler(性能拖后腿的节点)直接杀掉即可
- 开发者只需要维护一套 ETL 逻辑即可同时用于批处理和流计算
#### 流计算与 SQL:Spark Structured Streaming
Spark 通过 Spark Streaming 拥有了流计算能力,那 Spark SQL 是否也能具有类似的流处理能力呢?答案是肯定的,只要将数据流建模成一张不断增长、没有边界的表,在这样的语义之下,很多 SQL 操作等就能直接应用在流数据上。
![](img/spark-straming-2.jpeg)
> 左b部分是 Spark Structured Streaming 模型示意图;右部分展示了同一个任务的批处理、流计算版本,可以看到,除了输入输出不同,内部计算过程完全相同。
与 Spark SQL 相比,流式 SQL 计算还有两个额外的特性,分别是窗口(window)和水位(watermark)。
**窗口(window)是对过去某段时间的定义**。批处理中,查询通常是全量的(例如:总用户量是多少);而流计算中,我们通常关心近期一段时间的数据(例如:最近24小时新增的用户量是多少)。用户通过选用合适的窗口来获得自己所需的计算结果,常见的窗口有滑动窗口(Sliding Window)、滚动窗口(Tumbling Window)等。
**水位(watermark)用来丢弃过早的数据**。在流计算中,上游的输入事件可能存在不确定的延迟,而流计算系统的内存是有限的、只能保存有限的状态,一定时间之后必须丢弃历史数据。以双流 A JOIN B 为例,假设窗口为 1 小时,那么 A 中比当前时间减 1 小时更早的数据(行)会被丢弃;如果 B 中出现 1 小时前的事件,因为无法处理只能忽略。
水位和窗口的概念都是因时间而来。在其他流计算系统中,也存在相同或类似的概念。
> 关于 SQL 的流计算模型,常常被拿来对比的还有另一个流计算框架 Apache Flink。与 Spark 相比,它们的实现思路有很大不同,但在模型上是很相似的。
#### 访问不同的数据源
可以访问HDFS、Alluxio、Apache Cassandra、Apache HBase、Apache Hive和其他数百个数据源中的数据(DB,MQ,socket)。
## 参考
[Spark入门——什么是Hadoop,为什么是Spark?](https://www.cnblogs.com/wing1995/p/9300120.html)
[Spark 以及 spark streaming 核心原理及实践](https://www.cnblogs.com/liuliliuli2017/p/6809094.html)
[一文读懂 Spark 和 Spark Streaming](https://www.sohu.com/a/270444235_494938)
[Apache Spark Architecture](https://intellipaat.com/blog/tutorial/spark-tutorial/spark-architecture/)
[Spark Cluster Architecture Explained](https://www.edureka.co/blog/spark-architecture/)
[The Components and Working of Spark](https://www.digitalvidya.com/blog/spark-architecture/)
\ No newline at end of file
Spark streaming 是更快的批处理,而Flink Batch是有限数据的流式计算
[flink与Spark的对比分析](https://www.jianshu.com/p/905ca3a7edb9)
\ No newline at end of file
......@@ -7,13 +7,30 @@ http://spark.apache.org/docs/latest/quick-start.html
```
tar xzf spark-*.tgz
cd spark-2.4.4-bin-hadoop2.7
cd spark-2.4.5-bin-hadoop2.7
```
or source .bash_profile
在~/.bashrc文件中添加如下内容,并执行$ source ~/.bashrc命令使其生效
```
# export HADOOP_HOME=/root/spark-2.4.4-bin-hadoop2.7
export SPARK_HOME=/root/spark-2.4.4-bin-hadoop2.7
# export HADOOP_HOME=/root/spark-2.4.5-bin-hadoop2.7
export SPARK_HOME=/root/spark-2.4.5-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
spark-env.sh
#!/usr/bin/env bash
export SPARK_MASTER_HOST=192.168.110.216
export SPARK_LOCAL_IP=192.168.110.216
export SPARK_MASTER_IP=192.168.110.216
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
spark-submit --master spark://192.168.110.216:7077 examples/src/main/python/wordcount.py /root/spark-2.4.5-bin-hadoop2.7/README.md
```
......@@ -27,6 +44,10 @@ export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
## windows
[Spark启动时的master参数以及Spark的部署方式](https://blog.csdn.net/zpf336/article/details/82152286)
[spark-submit几种提交模式的区别](https://blog.csdn.net/fa124607857/article/details/103390996)
http://spark.apache.org/docs/latest/quick-start.html
### 下载安装
```
......@@ -42,12 +63,24 @@ setx SPARK_HOME E:\bigdata\spark-2.4.4-bin-hadoop2.7\
%SPARK_HOME%\bin\run-example SparkPi
%SPARK_HOME%\bin\run-example SparkPi # 可选参数10
%SPARK_HOME%\bin\spark-submit examples/src/main/python/pi.py
# http://spark.apache.org/docs/latest/submitting-applications.html#master-urls
# spark-submit --class Test --master spark://localhost:7077 /home/data/myjar/Hello.jar
set SPARK_LOCAL_IP=192.168.1.216
set SPARK_MASTER_HOST=192.168.1.216
%SPARK_HOME%\bin\spark-submit --master spark://192.168.110.216:7077 examples/src/main/python/pi.py 10
```
```
bin/spark-submit --master spark://master.hadoop:7077 --class nuc.sw.test.ScalaWordCount spark-1.0-SNAPSHOT.jar hdfs://master.hadoop:9000/spark/input/a.txt hdfs://master.hadoop:9000/spark/output
```
### 交互环境
交互环境的默认UI http://localhost:4040/
```
cd E:\bigdata\spark-2.4.4-bin-hadoop2.7
......@@ -63,7 +96,8 @@ Row(value='# Apache Spark')
>>> textFile.filter(textFile.value.contains("Spark")).count() # How many lines contain "Spark"?
20
>>> sc.parallelize(range(1000)).count()
1000
# Scala
%SPARK_HOME%\bin\spark-shell
......
<!--toc-->
[TOC]
# Spark入门——什么是Hadoop,为什么是Spark?
Spark入门#这个系列课程,是综合于我从2017年3月分到今年7月份为止学习并使用Spark的使用心得感悟,暂定于每周更新,以后可能会上传讲课视频和PPT,目前先在博客园把稿子打好。注意:这只是一个草稿,里面关于知识的误解还请各大网友监督,我们互相进步。总而言之,网络上的知识学会断舍离,学会带着辩证的眼光去学习就能进步。
  谈到Spark,实际上从16年本科实习的时候就已经开始接触,那个时候是从Pig入门大数据Hadoop的,有兴趣的朋友可以看[Hadoop家族之Pig入门](https://www.cnblogs.com/wing1995/p/5161511.html);当时大家基本都在使用Pig,Pig我也没有接触太深,大概两个月后开始跟着当时的师父(当时是实习的硕士,后来就业去了阿里)学了Spark,整个公司就他在写Spark,他是一个我很佩服的人,属于全栈工程师类型的人,前后端数据分析以及数据挖掘的算法都会,所以就跟着使用Python写着Spark的一些入门程序,可见我另外一个博客Spark2.0系列[RDDVs.DataSetVs.DataFrame](https://www.cnblogs.com/wing1995/p/6803630.html),实际上这里关于Dataset的介绍是非常不全面的,接下来我也会在这个Spark入门系列讲的更为详细一点。目前看来,大数据相关的职位那么吃香,很多学计算机的,学数学的,学统计的,半路上培训的,各种各样的人都来投Spark工程师的岗位,因为薪资高的原因吧,但是真正喜欢这个职业的又有几个,希望大家能一直坚持下去,见证大数据技术的更新迭代!
**第一个问题,什么是HadoopTM?**实际上这个答案[Hadoop官网](http://hadoop.apache.org/)已经给的很明确:
  Hadoop是[Apache软件基金会](https://www.apache.org/)支持可靠的、可扩展的一个开源的分布式计算框架的工程。(PS:Apache软件基金会真是扛下了开源世界的半壁江山,旗下支持的开源的大数据项目大家有兴趣可以去官网访问一下。)
  具体而言,Apache Hadoop软件库是一个允许使用简单编程模型跨计算机集群处理大型数据集合的框架,其设计的初衷是将单个服务器扩展成上千个机器组成的一个集群为大数据提供计算服务,其中每个机器都提供本地计算和存储服务。
  Hadoop工程包括以下模块:
- **Hadoop Common:**支持其他Hadoop模块的通用工具。
- **Hadoop Distributed File System(HDFSTM):**提供高吞吐量的访问应用数据的一个分布式文件系统。
- **Hadoop YARN:**一种作业调度和集群资源管理的框架。
- **Hadoop MapReduce:**一种基于Yarn来处理大数据集合的系统。
  Apache中其他Hadoop相关的项目包括:
- **[Ambari](http://ambari.apache.org/)**TM:一种用于提供、管理和监督Apache Hadoop集群的基于Web UI的且易于使用的Hadoop管理工具。
- **[Avro](http://avro.apache.org/)**TM:一种数据序列化系统。
- **[Cassandra](http://cassandra.apache.org/)**TM:一种无单点故障的可扩展的分布式数据库。
- **[Chukwa](http://chukwa.apache.org/)**TM:一种用于管理大型分布式系统的数据收集系统。
- **[HBase](http://hbase.apache.org/)**TM:一种支持存储大型表的结构化存储的可扩展的分布式数据库。
- **[Hive](http://hive.apache.org/)**TM:一种提供数据汇总和特定查询的数据仓库。
- **[Mahout](http://mahout.apache.org/)**TM:一种可扩展的机器学习和数据挖掘库(Scala语言实现,可结合Spark后端)。
- **[Pig](http://pig.apache.org/)**TM:一种高级的数据流语言且支持并行计算的执行框架(2017年发布的最新版本0.17.0是添加了Spark上的Pig应用)。
- **[Spark](http://spark.apache.org/)**TM:一种用于Hadoop数据的快速通用计算引擎。Spark提供一种支持广泛应用的简单而易懂的编程模型,包括ETL( Extract-Transform-Load)、机器学习、流处理以及图计算。
- **[Tez](http://tez.apache.org/)**TM:一种建立在Hadoop YARN上数据流编程框架,它提供了一个强大而灵活的引擎来任意构建DAG(Directed-acyclic-graph)任务去处理用于批处理和交互用例的数据。
- **[ZooKeeper](http://zookeeper.apache.org/)**TM:一种给分布式应用提供高性能的协同服务系统。
**第二个问题,既然Hadoop生态家族这么庞大,我们为什么要选择Spark作为对于大数据进行数据分析和数据挖掘的基本计算框架?**
这个问题的答案实际上[Spark官网](http://spark.apache.org/)已经给的很明确了,我就照样搬砖过来。
- **速度快**
  Apache Spark拥有先进的DAG调度器、查询优化器以及物理执行引擎从而高性能的实现批处理和流数据处理。
![](img/什么是Hadoop为什么是Spark-1.png)
- **易用性**(可以使用Java,Scala,Python,R以及SQL快速的写Spark应用)
Spark提供80个以上高级算子便于执行并行应用,并且可以使用Scala、Python、R以及SQL的shell端交互式运行Spark应用。
```
#通过Spark的Python的DataFrame的API读取JSON文件
df = spark.read.json("logs.json")
df.where("age > 21").show()
```
- **通用性**(支持SQL,流数据处理以及复杂分析)
Spark拥有一系列库,包括SQL和DataFrame,用于机器学习的MLib,支持图计算GraphX以及流计算模块Streaming。你可以在一个应用中同时组合这些库。
![](img/什么是Hadoop为什么是Spark-2.png)
- **支持多种模式运行**(平台包括Hadoop,Apache Mesos,Kubernete,standalone或者云上,也可以获取各种数据源上的数据)
Spark可以直接运行以自身的[standalone](http://spark.apache.org/docs/latest/spark-standalone.html)集群模式运行,也可以在[亚马逊EC2](https://github.com/amplab/spark-ec2)上运行,不过企业级用的比较多的是[Hadoop Yarn](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html)模式,当然也有[Mesos](https://mesos.apache.org/)[Kubernetes](https://kubernetes.io/)模式。可以获取不限于来自于[HDFS](https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html)[Apache Cassandra](https://cassandra.apache.org/)[Apache HBase](https://hbase.apache.org/)[Apache Hive](https://hive.apache.org/)等上百种数据源。
**那么,第三个问题,Hadoop和Spark之间的关系是什么?**
首先要从Hadoop的MapReduce编程框架说起,如果说MapReduce是第一代计算引擎,那么Spark就是第二代计算引擎。
  MapReduce将复杂的并行计算过程高度的抽象到了两个函数:Map函数和Reduce函数。
![](img/什么是Hadoop为什么是Spark-3.png)
  MapReduce的核心是“分而治之”策略。数据在其MapReduce的生命周期中过程中需要经过六大保护神的洗礼,分别是:Input、Split、Map、Shuffule、Reduce和Output。
![](img/什么是Hadoop为什么是Spark-4.png)
  MapReduce框架采用Master/Slave架构,一个Master对应多个Slave,Master运行JobTracker,Slave运行TaskTracker;JobTracker充当一个管理者,负责Client端提交的任务能够由手下的TaskTracker执行完成,而TaskTracker充当普通员工执行的Task分为Map Task(Split and Map)和Reduce Task(Shuffle and Reduce)。
![](img/什么是Hadoop为什么是Spark-5.png)
  现在,我们普通的开发人员只要会用MapReduce的API就可以实现高大上的并行计算了,但是对于非科班毕业的数据分析(例如我这样半路出家的统计学毕业)人员而言,MapReduce存在的局限性不仅仅是在于其代码的又长又臭,固定的框架等,总而言之其短板可见以下列表:
1. 抽象层次低,具体的Map和Reduce实现起来代码量大并且对于数据挖掘算法中复杂的分析需要大量的Job来支持,且Job之间的依赖需要开发者定义,导致开发的难度高而代码的可读性不强;
2. 中间结果也存放在HDFS文件系统中,导致中间结果不能复用(需要重新从磁盘中读取),不适宜数据挖掘算法中的大量迭代操作,ReduceTask需要等待所有的MapTask执行完毕才可以开始;
3. 只适合批处理场景,不支持交互式查询和数据的实时处理。
要知道,我们通常意义上的Hadoop往往是Hadoop生态圈,意味着很多技术对Hadoop本身具有的局限进行了扩展和改进,从而有了Pig、Hive将SQL语言翻译成MapReduce程序,让我们从繁琐的MapReduce程序中释放出来。如果说Pig这类的类SQL语言解决了MapReduce中存在的大量手写代码,那么Tez就解决是去除了Map和Reduce两个任务之间的屏障从而提升了整体的性能,从而将多个MapReduce任务在一个Tez任务中处理完。
![](img/什么是Hadoop为什么是Spark-6.png)
随着大数据处理的应用场景越来越多,人们对Hadoop的要求也越来越高,开发出的对应的系统也越来越多,人们迫切的需要一个综合的计算框架,Spark应运而生,我们可以看看Spark可以干些什么。
![](img/什么是Hadoop为什么是Spark-7.png)
  那么为什么Spark能做到这些?
  首先,我们需要理解Spark中的三大概念:
1. **RDD(Resilient Distributed Dataset)**。实际上对与开发人员而已它是以一种对象的形式作为数据的一种表现形式而存在,可以理解为一种你可以操作的只读的分布式数据集,之所以称之为有弹性,在于:1. RDD可以在内存和磁盘存储间手动或自动切换;
2. RDD拥有Lineage(血统)信息,及存储着它的父RDD以及父子之间的关系,当数据丢失时,可通过Lineage关系重新计算并恢复结果集,使其具备高容错性;
3. 当血统链太长时,用户可以建立checkpoint将数据存放到磁盘上持久化存储加快容错速度(建议通过saveAsTextFile等方式存储到文件系统),而persist方式可以将数据存储到内存中用于后续计算的复用;
4. RDD的数据重新分片可以手动设置。在Spark中执行重新分片操作的方法有repartition和coalesce两个方法,这两个方法都是手动设置RDD的分区数量,repartition只是coalesce接口中参数shuffle=true的实现;是否重新分区对性能影响比较大,如果分区数量大,可以减少每个分区的占存,减少OOM(内存溢出)的风险,但如果分区数量过多同时产生了过多的碎片,消耗过多的线程去处理数据,从而浪费计算资源。
2. **Transformations。**转换发生在当你将现有的RDD转换成其他的RDD的时候。比如当你打开一个文件然后读取文件内容并通过map方法将字符串类型RDD转换成另外一个数组类型RDD就是一种转换操作,常用的转换操作有map,filer,flatMap,union,distinct,groupByKey等。
3. **Actions。**动作发生在你需要系统返回一个结果的时候。比如你需要知道RDD的第一行数据是什么样的内容,比如你想知道RDD一共有多少行这样类似的操作就是一种动作,常用的动作操作有reduce,collect,count,first,take(),saveAsTextFile(),foreach()等。
  有意思的是Spark使用“lazy evaluation”,意味着执行Transformations操作的时候实际上系统并没有发生任何操作,只有在遇到Actions操作的时候Spark才开始真正从头运行程序执行一系列转换并返回结果。因为有了这种惰性求值方式加上RDD的血缘依赖关系导致程序在一系列连续的运算中形成了DAG,而这种DAG(Directed Acyclic Graph)可以优化整个执行计划(参照上图中的Tez)。
**最后再强调一下,为什么要选择Spark?**
- 首先,Spark通过RDD的lineage血统依赖关系提供了一个完备的数据恢复机制;
- 其次,Spark通过使用DAG优化整个计算过程;
- 最后,Spark对RDD进行Transformation和Action的一系列算子操作使得并行计算在粗粒度上就可以简单执行,而且Spark生态系统提供了一系列的开发包使得数据科学家可以执行一系列的SQL、ML、Streaming以及Graph操作,而且还支持很多其他的第三方包括一些交互式框架类似于[Apache Zeppelin](https://hortonworks.com/apache/zeppelin/),地理数据可视化框架[GeoSpark](http://geospark.co.uk/)以及一些比较流行的深度学习框架[Sparking-water](https://www.h2o.ai/sparkling-water/),[Deeplearning4j](https://deeplearning4j.org/),[SparkNet](https://sparknet.net/)等。
  我们都知道Spark最初是由UC伯克利大学的AMP实验室研究出来的,强烈推荐这个实验室的[Projects](https://amplab.cs.berkeley.edu/projects)!Happy Coding!
[原文](https://www.cnblogs.com/wing1995/p/9300120.html)
\ No newline at end of file
# 几个最新免费开源的中文语音数据集
工欲善其事必先利其器,做机器学习,我们需要有利器,才能完成工作,数据就是我们最重要的利器之一。做中文语音识别,我们需要有对应的中文语音数据集,以帮助我们完成和不断优化改进项目。我们可能很难拿到成千上万小时的语音数据集,但是这里有一些免费开源的语音数据集,大家一定不要错过。文末附数据集下载地址。我们也非常感谢相关单位和团体为国内的开源界做出的贡献。
### 普通语音识别数据集
**THCHS30**
THCHS30是一个很经典的中文语音数据集了,包含了1万余条语音文件,大约40小时的中文语音数据,内容以文章诗句为主,全部为女声。它是由清华大学语音与语言技术中心(CSLT)出版的开放式中文语音数据库。原创录音于2002年由朱晓燕教授在清华大学计算机科学系智能与系统重点实验室监督下进行,原名为“TCMSD”,代表“清华连续”普通话语音数据库’。13年后的出版由王东博士发起,并得到了朱晓燕教授的支持。他们希望为语音识别领域的新入门的研究人员提供玩具级别的数据库,因此,数据库对学术用户完全免费。
license: Apache License v.2.0
**ST-CMDS**
ST-CMDS是由一个AI数据公司发布的中文语音数据集,包含10万余条语音文件,大约100余小时的语音数据。数据内容以平时的网上语音聊天和智能语音控制语句为主,855个不同说话者,同时有男声和女声,适合多种场景下使用。
License: Creative Common BY-NC-ND 4.0 (Attribution-NonCommercial-NoDerivatives 4.0 International)
**AISHELL开源版**
AISHELL是由北京希尔公司发布的一个中文语音数据集,其中包含约178小时的开源版数据。该数据集包含400个来自中国不同地区、具有不同的口音的人的声音。录音是在安静的室内环境中使用高保真麦克风进行录音,并采样降至16kHz。通过专业的语音注释和严格的质量检查,手动转录准确率达到95%以上。该数据免费供学术使用。他们希望为语音识别领域的新研究人员提供适量的数据。
License: Apache License v.2.0
**Primewords Chinese Corpus Set 1**
Primewords包含了大约100小时的中文语音数据,这个免费的中文普通话语料库由上海普力信息技术有限公司发布。语料库由296名母语为英语的智能手机录制。转录准确度大于98%,置信水平为95%,学术用途免费。抄本和话语之间的映射以JSON格式给出。
**aidatatang**
Aidatatang_200zh是由北京数据科技有限公司(数据堂)提供的开放式中文普通话电话语音库。
语料库长达200小时,由Android系统手机(16kHz,16位)和iOS系统手机(16kHz,16位)记录。邀请来自中国不同重点区域的600名演讲者参加录音,录音是在安静的室内环境或环境中进行,其中包含不影响语音识别的背景噪音。参与者的性别和年龄均匀分布。语料库的语言材料是设计为音素均衡的口语句子。每个句子的手动转录准确率大于98%。
**MAGICDATA Mandarin Chinese Read Speech Corpus**
Magic Data技术有限公司的语料库,语料库包含755小时的语音数据,其主要是移动终端的录音数据。邀请来自中国不同重点区域的1080名演讲者参与录制。句子转录准确率高于98%。录音在安静的室内环境中进行。数据库分为训练集,验证集和测试集,比例为51:1:2。诸如语音数据编码和说话者信息的细节信息被保存在元数据文件中。录音文本领域多样化,包括互动问答,音乐搜索,SNS信息,家庭指挥和控制等。还提供了分段的成绩单。该语料库旨在支持语音识别,机器翻译,说话人识别和其他语音相关领域的研究人员。因此,语料库完全免费用于学术用途。
**AISHELL-2 高校学术免费授权版数据集**
希尔贝壳中文普通话语音数据库AISHELL-2的语音时长为**1000**小时,其中718小时来自AISHELL-ASR0009-\[ZH-CN\],282小时来自AISHELL-ASR0010-\[ZH-CN\]。录音文本涉及唤醒词、语音控制词、智能家居、无人驾驶、工业生产等12个领域。录制过程在安静室内环境中, 同时使用3种不同设备: 高保真麦克风(44.1kHz,16bit);Android系统手机(16kHz,16bit);iOS系统手机(16kHz,16bit)。AISHELL-2采用iOS系统手机录制的语音数据。1991名来自中国不同口音区域的发言人参与录制。经过专业语音校对人员转写标注,并通过严格质量检验,此数据库文本正确率在96%以上。(支持学术研究,未经允许禁止商用。)
[AISHELL-2 中文语音数据库申请链接](http://www.aishelltech.com/aishell_2)
**数据堂1505小时中文语音数据集(高校学术免费授权版)**
数据有效时长达1505小时,。录音内容超过3万条口语化句子,由6408名来自中国不同地区的录音人参与录制。经过专业语音校对及人员转写标注,通过严格质量检验,句准确率达98%以上,是行业内句准确率的最高标准。
[数据堂1050小时数据集申请获取链接](https://datatang.com/opensource)
### 说话人验证数据集
**cn-celeb**
此数据是“在野外”收集的大规模说话人识别数据集。该数据集包含来自1000位中国名人的13万种语音,涵盖了现实世界中的11种不同流派。所有音频文件都编码为单通道,并以16位精度以16kHz采样。数据收集过程由清华大学语音与语言技术中心组织。它也由国家自然科学基金61633013和博士后科学基金2018M640133资助。
**附下载链接:**
* THCHS30
[国内镜像](http://cn-mirror.openslr.org/resources/18/data_thchs30.tgz) | [国外镜像](http://www.openslr.org/resources/18/data_thchs30.tgz)
* ST-CMDS
[国内镜像](http://cn-mirror.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz) | [国外镜像](http://www.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz)
* AISHELL开源版
[国内镜像](http://cn-mirror.openslr.org/resources/33/data_aishell.tgz) | [国外镜像](http://www.openslr.org/resources/33/data_aishell.tgz)
* Primewords Chinese Corpus Set 1
[国内镜像](http://cn-mirror.openslr.org/resources/47/primewords_md_2018_set1.tar.gz) | [国外镜像](http://www.openslr.org/resources/47/primewords_md_2018_set1.tar.gz)
* aidatatang
[国内镜像](http://cn-mirror.openslr.org/resources/62/aidatatang_200zh.tgz) | [国外镜像](http://www.openslr.org/resources/62/aidatatang_200zh.tgz)
* Magic Data Mandarin Chinese Read Speech Corpus
[国内镜像(train)](http://cn-mirror.openslr.org/resources/68/train_set.tar.gz)  |  [国内镜像(dev)](http://cn-mirror.openslr.org/resources/68/dev_set.tar.gz)  |  [国内镜像(test)](http://cn-mirror.openslr.org/resources/68/test_set.tar.gz)  |  [国内镜像(metadata)](http://cn-mirror.openslr.org/resources/68/metadata.tar.gz)
[国外镜像(train)](http://www.openslr.org/resources/68/train_set.tar.gz)  |  [国外镜像(dev)](http://www.openslr.org/resources/68/dev_set.tar.gz) |  [国外镜像(test)](http://www.openslr.org/resources/68/test_set.tar.gz) | [国外镜像(metadata)](http://www.openslr.org/resources/68/metadata.tar.gz)
* cn-celeb
[国内镜像](http://cn-mirror.openslr.org/resources/82/cn-celeb.tgz) | [国外镜像](http://www.openslr.org/resources/82/cn-celeb.tgz)
更多语音数据集,请访问:
[OpenSLR国内镜像](http://cn-mirror.openslr.org) | [OpenSLR国外镜像](http://www.openslr.org)
[AI柠檬OpenSLR镜像站(部分镜像)](https://dev.ailemon.me/openslr)
24.6G、90亿像素天文照片,8400万颗恒星在里面!
这是由智利的帕拉那尔天文台 (Paranal Observatory) 的 VISTA 望远镜 (Visible and Infrared Survey Telescope for Astronomy) 所拍摄出来的照片,多达 108200 x 81500 分辨率数字,以及 24.6 GB 的单文件大小。数字非常惊人!
经过计算总共拍到了多达 8400 万颗的星星!可说是天文学中的一大突破。
帕拉那尔天文台拍摄的这张 90 亿像素照片,如果按照原比例冲洗成照片的话,据说可以洗成一张长达 9 米、宽达7米的巨幅照片!
官网:http://www.eso.org/public/images/eso1242a/
ht防吞tp://www.eso.org/public/images/eso1242a/
原图(24.64g)
迅雷下载地址:http://kuai.xunlei.com/d/KOTDVLQFQPAA
h防吞ttp://kuai.xunlei.com/d/KOTDVLQFQPAA
官方下载地址:http://www.eso.org/public/archives/images/original/eso1242a.psb
h防吞ttp://www.eso.org/public/archives/images/original/eso1242a.psb
压缩图(3.9g)
官方下载地址:http://www.eso.org/public/archives/images/publicationtiff40k/eso1242a.tif
h防吞ttp://www.eso.org/public/archives/images/publicationtiff40k/eso1242a.tif
压缩图(1.5g)
官方下载地址:http://www.eso.org/public/archives/images/publicationtiff25k/eso1242a.tif
ht防吞tp://www.eso.org/public/archives/images/publicationtiff25k/eso1242a.tif
https://developer.aliyun.com/article/742945
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册