---- このセクション -------
1. Q&Aの遺産
1.1一般的な質問
1.2知識ポイントレビュー
2.Sparkプログラミングの基礎
2.1スパーク開発tetralogy
2.2 RDD典型的な例
非RDD 2.3の典型的な例
3.質問
4.参考文献
---------------------
Q&Aのすべての段階では、私はそれが私だった場合、私は答えるために、それほど頻繁に、助けることが冷や汗に抜け出すことはできませんどのようにする必要があり、考えるようにビューの教師の点に立ちます。非常に簡単実際にいくつかの質問に答える参照してください、しかし、考えて、人として自分自身を答える際に、迅速な確認の答えは、あなたは多くのことを否定する必要がありますので、異なる場合があり、私の心は不確実性の多くを点滅、我々はすぐにしなければなりません拒否されました。東氏は、非常に精通し、目に見える深い内部強度を反映して、彼は良い建築家であるこの点では、間違いなく立派でも良い説教です。
1. Q&Aの遺産
1.1 一般的な質問
通常の糸、科学スパークプロセスにおけるサプリメントの知識と組み合わせて使用する1)スパークHadoopのは、あなたがおよそ整理することができます
HDFSは、私は、実際には、多くのものHDFSは、先生がそうで基本的なファイルストレージ戦略、読み出し動作、基本的なコマンドライン、API、およびを言った私たちは理解している必要がありますと思います。
糸は基本的なアーキテクチャ、ResoureManger、NodeManger、ApplicationMaster、コンテナなど
実際に、私は言いたい、これらが内臓されている、それはそれをすべての上に行くのがベストです、で相互に依存しており、無Linuxなどなしでは生きていけないことができるものだけでなく、知識、Javaの基本的な知識、ネットワークの基本的な知識など、あります知識の使用における実際的な問題は、私は約束する、に使用されます。
コンセプトは1つのノード上でのみ2)パーティションではなく、コンテナそれの先生?教師は、コンテナ、エグゼキュータ、タスクをpartionし、それについての詳細に行くことができますか?
一時的な問題は、ここでそれを聞いていませんでした。これは実際には非常に基本的なものですが、答えは基本的なスキルの比較試験を出てきました。私が派生についての質問を入れて、次の質問が含まれています。
).partionの基本的な概念は、あるパーティションとの関係は何であるブロックは何ですか?
セル内部パーティションを計算する並列計算RDDで、RDDデータセットは、論理的に複数のスライスに分割され、各スライスは、パーティションと呼ばれます。HDFSブロックは、記憶の最小単位であります
実際には、問題は、何らかの理由でパーティションの概念を望んでいる、なぜスパークパーティションがあり、ここにあるのでしょうか?私はpartiionの理解は非常に有用、答えはボーエンを参照してください「スパーク-08パーティション原理と最適化の話に夕食のために家を呼び出して、あなたの母をスパーク」してくださいだと思います
B).containerの概念は、糸がコンテナのリソース割り当てに基づいている方法ですとは何ですか?
どのような実装プロセスC).Sparkアプリケーションはありますか?
そこタスクモードの問題が提出した二つの質問があり、基本的には実際の目の前にこれらの質問に答えることができます実行している様々なモード火花を理解し、非常に明確な説明がなされています。
1.2 知識ポイントレビュー
1)コアコンセプトRDD
弾力性のある分散型データセットは、以下の点を把握します
・RDDは、彼がデータの記述が何であるか、データ・セット、である、データが操作だけでなく、操作の間のデータの依存関係のセットを行います
なぜ弾力性のある、メモリー内またはディスク上のいずれかの彼の主要な店は、することができました
・分散:クラスタ全体に分散
自動復興:自動的に再構築するのに十分な失敗
2)手続きフレームワーク
ドライバの応用= 1番目のエグゼキュータ複数+
タスク+キャッシュExcecutorの複数=
何をしたか、ドライバを把握、エグゼキュータ何が行われている、タスク彼らは、ネクタイにする方法
3)糸分散モード
リソースアプリケーション要求a.clientを送ります
b.RMがNodeMangerリソースを呼び出すために通知を送信し、
AppAplicationMasterを開始c.NodeManger
d.AppAplicationMaster通知は、各エグゼキュータを開始するノードマネージャ
executorを開始e.nodeManager
f.nodeManagerのリアルタイム実装へのドライバのリターンは、AppAplicationMasterを通知します
2.Spark编程基础
2.1 Spark开发四部曲
每一个spark程序都有一个main,我们称之为driver,driver将程序分解成多个task, task分发到多个executor,从而完成并行化。Spark程序开发的四部曲总结起来如下:
· 创建SparkContext对象
封装了spark执行环境信息
· 创建RDD
可从scala结合或hadoop数据集上创建
· 在RDD上执行转换和action
spark提供了多种转换和action函数
· 返回结果
保存到HDFS中,或者直接打印出来
2.2 RDD典型实例
启动spark shell:
bin/spark-shell --master spark://master01:7077 --driver-class-path/usr/local/tdr_hadoop/spark/spark-1.6.0-bin-hadoop2.6/lib/mysql-connector-java-5.1.40-bin.jar
1) 设置conf
val conf=new org.apache.spark.SparkConf().setAppName("xx");
conf.set("spark.app.name","test");
conf.set("spark.driver.allowMultipleContexts","true");
val sc= new org.apache.spark.SparkContext(conf);
#读取hdfs上的文件,如果你在hdfs-site.xml中配置hdfs集群的话
val a=sc.textFile("/tmp/test/core-site.xml");
a.collect().foreach(println);
#读取hdfs上的文件
val a = sc.textFile("hdfs:///tmp/test/core-site.xml");
a.collect().foreach(println);
#读取hdfs上的文件 ,这里的端口是9000
vala=sc.textFile("hdfs://master02:9000/tmp/test/core-site.xml");
a.collect().foreach(println);
#读取本地文件,这里要注意,driver是在哪里运行,如果driver不在本地运行,执行会报错,找不到文件哦
val a=sc.textFile("file:///data/aa.txt");
a.collect().foreach(println);
报错1:netty是spark通信框架,通信超时了。所以产生问题。把::1也就是ip6先注释掉。但是还是没有解决问题,后来把master HA给回退过去了,又恢复了,可能是HA的配置没有配好导致
报错2:不能出现多个sc
设置参数:conf.set("spark.driver.allowMultipleContexts","true");
2)创建RDD
· 从HDFS中读取数据
inputRdd=sc.textFile("hdfs://master01:8020/xx/xx");
· 从本地读取数据
inputRdd=sc.textFile("file://data/input")
· 从Hbase读取数据
· 从自定义文件格式读取数据
2.3 RDD典型实例
1.回忆经典概念
再次提一下RDD的transformation与Action,现在假设你去面试,面试官问你,简单说说你对Transformation和Action的理解,我个人觉得应该回答以下几个知识点,可能你有很多要说的,但是要整理好思路,一个个知识点回答。
1).先说概念
先说RDD概念,RDD弹性分布式数据集。它记录了2类东西一个是数据,一个是操作。数据,RDD记录了数据是保存在内存还是磁盘,而且能控制数据分区。操作,RDD记录了数据之上的各种操作,以及操作之间的依赖关系。最后说一下特点,RDD具有容错,并行,是spark的核心概念。
接着引入Transformation,Transformation是根据特定规则将一个RDD变换为另一个RDD,记录了RDD的演变过程,最后结果是RDD。
Action:将数据聚集起来执行实际的操作,触发所有job,并且保存计算结果,最后结果是数据。
2).后说联系
Transformation记录RDD之间的转换关系,为Action的触发记录RDD逻辑关系。
3).最后说区别
·Transformation不触发job,返回RDD。
·Action触发job,执行计算,返回数据。
2.典型例子
1)Transformation例子
例子1:
------------------------
val nums =sc.parallelize(List(1,2,3),3);
nums.collect();
//返回前k个
nums.take(2);
nums.count();
//累加求和
nums.reduce(_+_);
//写数据到hdfs
nums.saveAsTextFile("/tmp/dxc/week2/output1");
import org.apache.spark.rdd._;
nums.saveAsSequenceFile("/tmp/dxc/week2/output2");
nums.saveAsSequenceFile("/tmp/dxc/week2/output2");
//读取sequenceFile格式文件
lines = sc.sequenceFile("/tmp/dxc/week2/output2/") ;
---------
说明:
collection:转为数组,单机概念,保存到driver里面,非常危险,如果非常大
10G数据,2g内存,很可能打爆driver的内存,慎重
从这里可以看出,启动了一个Executor,Executor上面起了2个task,因为是指定了2个分区,分区的个数决定了task的个数。
val nums =sc.parallelize(List(1,2,3),3);
nums.collect();
这里指定3个分区,启动了3个task。
保存到hdfs也是3个part,如果指定分区为2,那就保存为2个数据块。
------------------------
例子2:
--------
valpets=sc.parallelize([("cat",1),("dog",2),("dog",2)]);
pets.reduceByKey(_+_);
pets.groupByKey();
pets.sortByKey();
pets.collect();
---------
说明:reduceByKey自动在本地进行combine
------------------------
例子3:
val line =sc.textFile("/tmp/test/core-site.xml");
val count=line.flatMap(line=>line.split(" ")).map(word=>(word,1)).reduceByKey(_+_);
count.collect();
line.foreach(println);
例子4:
val left = sc.parallelize(List(("spark",1),("hadoop",1),("storm",1)))
val right=sc.parallelize(List(("scala",1),("hadoop",1),("spark",1)))
val result = left.join(right);
val result = left.cogroup(right);
result.collect();
result.foreach(println);
---------
说明:
cogroup:保证key唯一,key只占一行,可用做一个笛卡尔积,cogroup结果如下
(scala,(CompactBuffer(),CompactBuffer(1)))
(spark,(CompactBuffer(1),CompactBuffer(1)))
(hadoop,(CompactBuffer(1),CompactBuffer(1)))
(storm,(CompactBuffer(1),CompactBuffer()))
------------------------
还有其他的RDD操作可以参考之前写的博客。
2.3 非RDD典型实例
1.Accumulator
Accumulator是spark提供的累加器,顾名思义,该变量只能够增加。 只有driver能获取到Accumulator的值(使用value方法),Task只能对其做增加操作(使用 +=)。你也可以在为Accumulator命名(不支持Python),这样就会在spark web ui中显示,可以帮助你了解程序运行的情况。用于监控和调试,记录符合某类特征的数据数据等。
-----------------
//在driver中定义
val accum = sc.accumulator(0, "Example Accumulator")
//在task中进行累加
sc.parallelize(1 to10,5).foreach(x=> accum += 1)
//在driver中输出 accum.value
//结果将返回10 res: 10
---
说明:
在web ui中可以看到Accumulators在task进行累加的具体情况,driver将accumulator收集过来汇总
-----------------
3.广播变量
Spark有两种共享变量——累加器、广播变量。广播变量可以让程序高效地向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。高效分发大对象,比如字典map,集合set,每个executor一份,而不是每个task一份.
Spark中分布式执行的代码需要传递到各个Executor的Task上运行。对于一些只读、固定的数据(比如从DB中读出的数据),每次都需要Driver广播到各个Task上,这样效率低下。广播变量允许将变量只广播(提前广播)给各个Executor。该Executor上的各个Task再从所在节点的BlockManager获取变量,而不是从Driver获取变量,从而提升了效率。
一个Executor只需要在第一个Task启动时,获得一份Broadcast数据,之后的Task都从本节点的BlockManager中获取相关数据。
场景1:
val data = Set(1,2,3,4,5,6,7)
val rdd=sc.parallelize(1 to 6,2)
val result =rdd.map(_=>data.size)
result.collect();
场景2:
val data = Set(1,2,3,4,5,6,7)
val bddata=sc.broadcast(data)
val rdd=sc.parallelize(1 to 6,2)
val result =rdd.map(_=>data.size)
result.collect();
区别是:data数值的获取方式,场景1 executor 每次都要从driver那里获取,要和交互7次,而场景2使用广播变量,将data分发到executor,那么driver和executor只需要交互一次。
4.cache的使用
val data=sc.textFile("/tmp/tbMonitordataResultHbase");
val a = data.count
println(a);
执行了29秒
val data=sc.textFile("/tmp/tbMonitordataResultHbase");
data.cache()
val a = data.count
println(a);
cache了100多M
val a = data.count
println(a);
data.persist(org.apache.spark.storage.StorageLevel. MEMORY_ONLY)
3.问题解答
1).spark计算时,数据会写入磁盘么,什么条件下写入磁盘
shuffle的时候都会写到磁盘,带shuffle的时候会写入到磁盘,有哪算子呢?
2).报错日志里的错误是,ERRORCoarsegRainedExcecutorBackend:RECEIVED SIGNAL TERM ,这个可能是什么原因
虚拟内存超了,被yarn的nodemanager杀了,配置这个参数, 如果是1G内存,可以达到1.1G的使用内存
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>10</value>
</property>
3).中文乱码问题,出现中文乱码和spark没有关系
4).resourceManager的工作负担重不重,实际部署时候是否有必要单独到一台机器上?
机器的规模,50或者100,可以nodemanager合并
5).hbase预分区个数和spark过程中reduce个数相同么
设置,map阶段和region一样,reduce取决于task
4.参考资料
1.董西成ppt
转载于:https://www.cnblogs.com/licheng/p/6822416.html