1、num-executors,execuor-cores和executor-memory的分配
driver.memory :driver运行内存,默认值512m,一般2-6G
num-executors :集群中启动的executor总数
executor.memory :每个executor分配的内存数,默认值512m,一般4-8G
executor.cores :每个executor分配的核心数目
yarn.am.memory :AppMaster内存,默认值512m
yarn.am.memoryOverhead :am堆外内存,值为 AM memory * 0.07, 最小384
yarn.driver.memoryOverhead :driver堆外内存,driverMemory *0.07 最小384
yarn.executor.memoryOverhead :executor堆外内存,值为 executorMemory * 0.07, 最小384
每个executor从Yarn请求的内存 = executor.memory + yarn.executor.memoryOverhead
2、spark-submit 详细参数说明
参数名 | 说明 |
---|---|
–master | master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local |
–deploy-mode | 在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client |
–class | 应用程序的主类,仅针对 java 或 scala 应用 |
–name | 应用程序的名称 |
–jars | 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下 |
–packages | 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标 |
–exclude-packages | 为了避免冲突 而指定不包含的 package |
–repositories | 远程 repository |
–conf PROP=VALUE | 指定 spark 配置属性的值, |
例如 -conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m" | |
–properties-file | 加载的配置文件,默认为 conf/spark-defaults.conf |
–driver-memory | Driver内存,默认 1G |
–driver-java-options | 传给 driver 的额外的 Java 选项 |
–driver-library-path | 传给 driver 的额外的库路径 |
–driver-class-path | 传给 driver 的额外的类路径 |
–driver-cores | Driver 的核数,默认是1。在 yarn 或者 standalone 下使用 |
–executor-memory | 每个 executor 的内存,默认是1G |
–total-executor-cores | 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用 |
–num-executors | 启动的 executor 数量。默认为2。在 yarn 下使用 |
–executor-core | 每个 executor 的核数。在yarn或者standalone下使用 |
3、spark-sql读取hive创建表读取数据不一致或者为空null
Tez引擎:
spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true spark.hive.mapred.supports.subdirectories=true
文件为Parquet格式:
set mapred.input.dir.recursive=true;
set spark.sql.hive.convertMetastoreParquet=false;
文件为orc格式:
set mapred.input.dir.recursive=true;
set spark.sql.hive.convertMetastoreOrc=false;
4、spark-sql写入hive的orc表报错 orc的jar冲突
主要是因为spark和hive的orc版本不一致导致
5、spark运行作业报错,查看是jar包冲突
20/08/24 17:24:39 ERROR [Driver] ApplicationMaster: User class threw exception: java.lang.IncompatibleClassChangeError: class com.google.protobuf.Descriptors$OneofDescriptor has interface com.google.protobuf.Descriptors$GenericDescriptor as super class
java.lang.IncompatibleClassChangeError: class com.google.protobuf.Descriptors$OneofDescriptor has interface com.google.protobuf.Descriptors$GenericDescriptor as super class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
查看spark的protobuf版本和hadoop的protobuf版本不同产生冲突,剔除spark中的protobuf
6、sparksql表刷新
sql_context.sql(“REFRESH TABLE table_name”)
或者
spark.catalog.refreshTable(“my_table”)
7、spark上面stage的task任务状态不实时显示了好多天了,任务是正常的。只有job上 才能看到对应实时的task状态
以前实时显示,之后不显示了。刷新job能看到task实时在变化,刷新stage的话task看不到只有等整个stage全部执行完成后才显示这个stage的所欲task全部完成。估计spark存在这个问题,重启spark服务就好了。。