6.7尝试了使用学校里Python读取数据库,读取一条数据耗时八分钟。返回多条数据程序卡死。使用了vscode,pycharm专业版和anaconda。pycharm专业版由于公司内网设置无法运行。
开始spark的学习。
选择尚硅谷视频教程学习并入上手wordcount小例子
建立spark框架链接需要加入依赖。在pom.xml中添加
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.0.0</version> </dependency> </dependencies>
出现内存不足的错误,经过检索后在设置SparkConf后加入指定分配给spark的内存。
.set("spark.testing.memory","2147480000")
scala表达式后续需要补充学习。如果是用java也看看怎么进行转换。
从师父给的代码来看,以后在集群运行不需加入此条。
将运行日志省略只留下error信息
Set everything to be logged to the console log4j.rootCategory=ERROR, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n # Settings to quiet third party logs that are too verbose log4j.logger.org.eclipse.jetty=WARN log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=WARN log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=WARN
Yarn模式在集群运行
home/spark-2.3.0-bin-hadoop2.7/bin/spark-submit --class test.SparksqlTest --master spark://(host地址):7077 --num-executors 3 --executor-memory 8G --driver-memory 2g --conf spark.driver.maxResultSize=2g
--num-executors 配置Executor数量
--executor-memory配置每个Executor内存大小
并行度(可以修改,同时执行)
资源申请,计算准备
数据结构:RDD、累加器、广播变量
(socket通信先不看,视频看看,因为好像实际用不到mark一下,为了引入RDD。)
RDD将task进行拆分分给executor。RDD为最小计算单元。多个RDD关联完成需求。(装饰者设计模式:核心不变,进行扩展例如java的io操作)
IO的字节流&字符流可以帮助理解RDD
file---------ShuffledRDD-reducebykey{------------colllect------console
MapPartitionsRDD-map{
MapPartitionsRDD-flatmap{
HadoopRDD-textFile
}
}
}
RDD不保存数据,只有collect方法才开始读取数据。RDD是一个抽象类,需要子类实现。一般使用子类
弹性:存储(内存磁盘相互转换)容错 计算 分片
分布式:存储在大数据集群不同节点上
RDD封装计算逻辑,不可改变,只能产生新的RDD装饰者设计模式。可分区、并行计算。
RDD五大属性1.分区列表2 计算逻辑3依赖关系(maven)4分区器option可有可无5option首选位置nodemanager 有excutor和data优先,减少网络数据传输。判断计算发到哪个节点效率最优。
移动数据不如移动计算
RDD:内存中创建,文件中创建
sc.parallelize(seq)
val rdd: RDD[Int] = sc.makeRDD(seq)
makeRDD是简化版本,底层实现时调用RDDparallelize方法。
文件路径可有通配符*,还可以是HDFS,Hbase。
textFile:以行为单位读取数据,读取数据都是字符串
wholeTextFiles:以文件为单位读取数据,表示为元组,第一个元素表示文件路径,第二个元素表示文件内容(保留换行符)
makeRDD可有传递第二个参数,表示分区数量。可以不传递,会使用默认并行度.sparkconf的totalcores:当前运行环境的最大可用核数。通过更改sparkConf.set("spark.default.parallelism",5)改变default分区数量。
源码可看数据如何存放,from until 前闭后开
文件:
(数据源为单个文件)
minPartitions有个math.min(defaultParallelism,2)
如果分区与预计不符,实际分区比最小分区数多。依照特定的计算方式,遵循hadoop的1.1.底层使用hadoop的读取方式。
totalsize=7
goalsize=7/2=3(byte) 每个分区
7/3=2....1(1.1)如果大于百分之十产生新的分区,小于不会产生新分区。
spark读取按行读取和字节数没有关系,以偏移量为单位。数据分区的偏移量范围计算。偏移量不会被重复读取,整行读取。
(数据源为多个文件,计算分区时以文件为单位进行分区)