系列文章目录
- 手把手带你玩转Spark机器学习-专栏介绍
- 手把手带你玩转Spark机器学习-问题汇总
- 手把手带你玩转Spark机器学习-Spark的安装及使用
- 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换
- 手把手带你玩转Spark机器学习-使用Spark构建分类模型
- 手把手带你玩转Spark机器学习-使用Spark构建回归模型
- 手把手带你玩转Spark机器学习-使用Spark构建聚类模型
- 手把手带你玩转Spark机器学习-使用Spark进行数据降维
- 手把手带你玩转Spark机器学习-使用Spark进行文本处理
- 手把手带你玩转Spark机器学习-深度学习在Spark上的应用
文章目录
- 系列文章目录
- 前言
- 问题
- 问题1:mml.Lightgbm进行fit操作的过程中
- 问题2:from mmlspark.lightgbm import LightGBMClassifier or LightGBMRegressor
- 问题3: AttributeError: 'function' object has no attribute 'overwrite'
- 问题4:org.apache.spark.SparkException: spark.executor.cores must not be < spark.task.cpus
- 问题5:/var/log/spark2/lineage 不存在或不可写
- 问题6:client模式下某个excutor OutOfMemoryError内存不够报错
- 问题7:spark xgboost训练时,无法获取到想要的worker数或者cores数
- 问题8 Xgboost not found key:train
前言
主要记录在实战过程中遇到的各种问题及解决方法。
问题
问题1:mml.Lightgbm进行fit操作的过程中
- TypeError: ‘JavaPackage’ object is not callable
- 解决方法:这类问题一般都是在spark-submit或者spark config阶段未指定正确jar导致的,所有只要在submit或者config里面添加lightgbm对应的jar包即可:
--jars hdfs://yourpath/mmlspark_2.11-0.18.1.jar,hdfs://yourpath/com.microsoft.ml.lightgbm_lightgbmlib-2.2.350.jar
问题2:from mmlspark.lightgbm import LightGBMClassifier or LightGBMRegressor
- Pyspark ModuleNotFoundError: No module named ‘mmlspark’ or mmlspark.lightgbm._LightGBMRegressor or _LightGBMClassifier
- 解决方法:这个主要是没有安装好mmlspark的缘故,mmlspark是微软出的基于spark的机器学习库,这个库pip源安装的时候是老版本0.0.11111111,这种版本太老了,需要替换成新版的mmlspark:
step1: 从链接中下载指定版本的jar包:比如说我们下载mmlspark_2.11的0.18.1版本的jar包
step2: 解压jar包:mmlspark_2.11-0.18.1.jar
step3: 将mmlspark复制到 /yourpath/anaconda3/envs/mes/lib/python3.7/site-packages/
问题3: AttributeError: ‘function’ object has no attribute ‘overwrite’
- AttributeError: ‘function’ object has no attribute ‘overwrite’
- 解决方法:To overwrite it, please use write.overwrite().save(path) for Scala and use write().overwrite().save(path) for Java or Python,通过Spark进行模型读写的时候,如果是Scala语言使用write.overwrite().savepath(),对于java和python语言write后面要加括号。如果直接save的话,文件同名也会报错。
问题4:org.apache.spark.SparkException: spark.executor.cores must not be < spark.task.cpus
- ERROR spark.SparkContext: Error initializing SparkContext.
- 解决方法:这种个错误一般是未指定executor.cores的数量导致默认数量和cpus个数相等,设置下executor.cores的数量即可
问题5:/var/log/spark2/lineage 不存在或不可写
- WARN lineage.LineageWriter: Lineage directory /var/log/spark2/lineage doesn’t exist or is not writable. Lineage for this application will be disabled.
- 解决方法:创建目录 mkdir -p /var/log/spark2/lineage,并根据实际用户组赋予对应的权限,比如我这里是yarn:yarn 所以 chown yarn:yarn /var/log/spark2/lineage,同时查看权限是否赋予成功,ls -altri
问题6:client模式下某个excutor OutOfMemoryError内存不够报错
- OutOfMemoryError
- 解决方法:增大excutor的内存,通过–executor-memory 16g来实现
问题7:spark xgboost训练时,无法获取到想要的worker数或者cores数
- XGBoost4J-Spark : Unable to get 250 workers(cores) for XGBoost training
- 解决方法:xgboost在训练前,会检查所需要的资源是否足够,如果不够就会报错,可以适当介绍excutor和numWorker的数目
- xgboost训练时有些需要注意的点:
经验1:二分类中不要设置参数,“num_class” -> 2, 会训练失败。多元分类时设置。
经验2:为了防止block,将训练数据分区数和申请的工作节点数numWorkers保持一致。即对训练数据做repartition处理。numWorkers默认值是32.
经验3:numWorker参数应该与executor数量设置一致,executor-cores设置小一些
经验4:在train的过程中,每个partition占用的内存最好限制在executor-memory的1/3以内,因为除了本来训练样本需要驻留的内存外,xgboost为了速度的提升,为每个线程申请了额外的内存,并且这些内存是JVM所管理不到的
经验5:检查训练数据,如果有缺失值,XGB4j会training failed
经验6:XGB4j 1.3.0以上版本,解决了 spark.speculation机制 和xgboost4j的worker的逻辑冲突问题,但1.2.0版本比1.3.1 、1.5.0运行更稳定
经验7:kill_spark_context_on_worker_failure 设置为false,默认值是true,如果worker训练失败会杀掉spark进程
问题8 Xgboost not found key:train
- not found key:train
- 解决方法,增大数据分区数,或者减少numWorkers的大小,要确保每个worker至少能被分配到一个patition。