spark报:too many open files 打开文件过多的意思
ulimit -a 查看打开的连接限制 ulimit -n 4096 扩大最大允许打开的文件数量设置为4096(临时的,重启后会还原)
修改系统配置文件(重启生效):vim /etc/security//limits.conf
末尾增加:root soft nofile 4096
root gard nofile 4096
二,spark英文解释:
Scheduler delay : 程序调度延迟
Executor Computing Time: 执行器计算时间
Getting Result Time : 获取结果时间
Task Deserialization Time : 任务反序列化时间
Shuffle Write Time : 无序写入时间
Shuffle Read Time : 无序读取时间
Result Serialization Time : 结果序列化时间
/opt/module/hadoop-2.7.2/start-balancer.sh : 数据平衡
Locality Level :
这几个值在图中代表task的计算节点和task的输入数据的节点位置关系
PROCESS_LOCAL :数据在同一个JVM中,既在同一个executor上。
NODE_LOCAL :数据在同一个节点上。比如数据在同一节点的另一个executor上;或者在HDFS上,恰好有block在同一个节点上,速度比PROCESS_LOCAL稍慢,因为数据需要在不同的进程之间传递或者从文件中读取。
NO_LOCAL :数据从哪里访问都一样快,不需要位置优先。
RACK_LOCAL :数据在同一机架的不同节点上,需要通过网络传输数据及文件IO,比NODE_LOCAL慢
ANY :数据在非同一机架上的网络上,速度最慢
三.Spark UI的端口号:
spark的默认端口号是4040,而被占用了就会顺序取+1的端口,当开了多个spark程序后,当端口加到了4045,在chrome浏览器里面就打不开了。会返回一个UNSAFE PORT 的错误信息,其实这是浏览器禁用了你访问的端口,程序实际是正常运行的。
所以建议手工指定spark.ui.port=4046
在spark-defaults.conf的配置文件中,若是4046被占用了,就从4046开始后+1,跳过4045这个端口,避免看不到spark ui界面的困扰。
解决办法:在启动这个任务的时候带上 --conf spark.ui.port=4046
. /etc/profile nohup /opt/module/spark/bin/spark-submit --class com.lg.bigdata.streaming.KafkaAndJsonGJTS --queue default --master yarn --deploy-mode client --conf spark.ui.port=4046 /opt/module/spark/WordJzw5-jar-with-dependencies.jar > /opt/module/spark/log-KafkaAndJsonGJTS 2>&1
四.缓存:
如何清除缓存
-
如果编写代码思路比较清晰的话,可以很清楚地记得哪个
rdd
或者dataSet
进行了缓存的操作。可以直接调用unpersist
操作一个简单的例子如下:
// 假设注册了一张teacher表,dataFrame读取了 这张表 val data:DataFrame = spark.sql("SELECT * FROM teacher") // 程序开始进行缓存cache(默认存储到内存当中),然后调用action算子触发程序执行 data.cache.show() // 调用下方代码,可以清除掉刚才得到的缓存 data.unpersist() 123456
val ds: collection.Map[Int, RDD[_]] = spark.sparkContext.getPersistentRDDs ds.foreach(x => { x._2.unpersist() }) 1234
常用命令:
.getNumPartitions/.partitions.size: 查看分区数
.partitioner: 查看RDD的分区器
// 调用下方代码,可以清除掉刚才得到的缓存 data.unpersist()