mllib——实例1:kmeans的本地和yarn运行

yarn界面: http://192.168.80.139:8088

spark页面: http://192.168.80.139:8080

nodemanager界面: http://192.168.80.139:8042

namenode HDFS界面: http://192.168.80.139:9870

以kmeans为例

先运行hadoop,再spark-shell或spark-submit

 

 

spark-shell

本地模式:

直接输入spark-shell

:paste进入粘贴模式

import org.apache.spark.mllib.clustering._ 
import org.apache.spark.mllib.linalg.Vectors 
val data = sc.textFile("file:///test/kmeans_data.txt") 
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache() 
val model = KMeans.train(parsedData,2,20) 
model.clusterCenters.foreach(println)

也可以读取hdfs的文件:

val data = sc.textFile("file:///test/kmeans_data.txt")

 

yarn模式:

spark-shell --master yarn --deploy-mode client

:paste进入粘贴模式

import org.apache.spark.mllib.clustering._ 
import org.apache.spark.mllib.linalg.Vectors 
val data = sc.textFile("hdfs://hadoop00:9000/test/kmeans_data.txt") 
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache() 
val model = KMeans.train(parsedData,2,20) 
model.clusterCenters.foreach(println)

 

 

IDEA

spark-submit

以kmeans为例

本地模式:

使用setMaster("local"),IDEA编辑器直接右键run即可

 

import org.apache.log4j.{ Level, Logger } 
import org.apache.spark.{ SparkConf, SparkContext } 
import org.apache.spark.mllib.clustering._ 
import org.apache.spark.mllib.linalg.Vectors 
object test { 
    def main(args: Array[String]): Unit = { 
        // 1. 构造spark对象 
        val conf = new SparkConf().setMaster("local").setAppName("KMeans") 
        val sc = new SparkContext(conf) 
        println("mode:"+sc.master)
        // 去除多余的warn信息 
        // 2. 读取样本数据,LIBSVM格式 
        val data = sc.textFile("file:///test/kmeans_data.txt") 
        val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache() 
        // 3. 新建KMeans模型,并训练 
        val model = KMeans.train(parsedData,2,20) 
        // 打印聚类中心 model.clusterCenters.foreach(println) 
        // 4. 误差计算 
        //val WSSSE = model.computeCost(parsedData) println("Within Set Sum of Squard Errors = " + WSSSE) 
        // 5. 保存模型、加载模型 
        //val ModelPath = "file:///test/model/KMeans" model.save(sc, ModelPath) 
        //val sameModel = KMeansModel.load(sc, ModelPath) 
        sc.stop()
    } 
}

也可以读取hdfs的文件:

val data = sc.textFile("file:///test/kmeans_data.txt")

结果:

 

yarn模式:

首先打jar包,注意把setMaster("local")删了

 

 

然后选择build --》build artifacts,test --》build,

然后在工程目录的子目录下会生成对应的jar文件:

在src文件的旁的/out/artifacts中找到我们需要的test.jar

 

复制到好找到的目录,如/export/spark_jar/

[root@master ~]# spark-submit --class test --master yarn-client file:///export/spark_jar/test.jar

 

结果:

 

 

 

 

 

spark-submit命令参数:

./bin/spark-submit --class org.apache.spark.examples.SparkPi \ 
--master yarn \ 
--deploy-mode cluster \ 
--driver-memory 1g \ 
--executor-memory 1g \ 
--executor-cores 1 \ 
--queue thequeue \ 
examples/target/scala-2.11/jars/spark-examples*.jar 10

 

 

遇到的错误:

1.内存不足:

diagnostics: Application application_1555606869295_0001 failed 2 times due to AM Container for appattempt_1555606869295_0001_000002 exited with exitCode: -103

Failing this attempt.Diagnostics: [2019-04-19 01:02:32.548]Container [pid=18294,containerID=container_1555606869295_0001_02_000001] is running 125774336B beyond the 'VIRTUAL' memory limit. Current usage: 75.3 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

Dump of the process-tree for container_1555606869295_0001_02_000001 :

Container要用2.2GB的内存,而虚拟内存只有2.1GB,不够用了,所以Kill了Container

我的SPARK-EXECUTOR-MEMORY设置的是1G,即物理内存是1G,Yarn默认的虚拟内存和物理内存比例是2.1,也就是说虚拟内存是2.1G,小于了需要的内存2.2G。解决的办法是把拟内存和物理内存比例增大,在yarn-site.xml中增加一个设置:

解决方法:

yarn-site.xml中增加一个设置:

<property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>2.5</value> </property>

 

2.警告warn:Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.

原因:

原因是因为Spark提交任务到yarn集群,需要上传Hadoop相关yarn的jar包,只是warn,可以不管

解决办法:

把yarn的jar包上传到hdfs,修改配置文件指定路径即可

(1)上传

[root@hadoop00 ~]# hadoop fs -mkdir -p /spark/jars

[root@hadoop00 ~]# hadoop fs -ls /

[root@hadoop00 ~]# hadoop fs -put /export/servers/spark-2.3.1-bin-hadoop2.7/jars/* /spark/jars/

(2)在spark的conf的spark-default.conf ,添加:

spark.yarn.jars hdfs://192.168.12.129:9000//spark/jars/*

(3)重新运行,warn消失

[root@hadoop00 ~]# spark-shell --master yarn --deploy-mode client

还可修改hadoop的的yarn-site.xml,不检查一些东西

<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value></property>

<property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property>

 

3. 报错:ERROR ContextCleaner: Error cleaning broadcast 14

思路:应该是无法正确关闭spark

在代码中加入sc.stop()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值