安装Spark Standalone模式/Hadoop yarn模式并运行Wordcount

来源:互联网 发布:python列表转换成字典 编辑:程序博客网 时间:2024/03/29 03:59

Spark Standalone模式

先说一下我的环境:

2个node,其中一个是master兼worker,另外一个是纯worker
master兼worker:sparkmaster  192.168.10.80
纯worker:sparkworker1  192.168.10.81

  • 下载及安装

从官网下载预编译好的spark 1.6http://spark.apache.org/downloads.html
解压缩到/opt/spark-1.6.0-bin-hadoop2.6
[root@sparkmaster spark-1.6.0-bin-hadoop2.6]# ll
total 1984
drwxr-xr-x. 3 root root    4096 Jan 11 19:41 bin
-rw-r--r--. 1 root root 1312258 Dec 21 18:22 CHANGES.txt
drwxr-xr-x. 2 root root    4096 Jan 13 22:12 conf
drwxr-xr-x. 3 root root    4096 Jan 11 05:51 data
-rw-r--r--. 1 root root     729 Jan 11 06:03 derby.log
drwxr-xr-x. 3 root root    4096 Jan 11 05:51 ec2
drwxr-xr-x. 3 root root    4096 Jan 11 05:51 examples
drwxr-xr-x. 2 root root    4096 Jan 11 05:52 lib
-rw-r--r--. 1 root root   17352 Dec 21 18:22 LICENSE
drwxr-xr-x. 2 root root    4096 Jan 11 05:52 licenses
-rw-r--r--. 1 root root  605095 Jan 11 07:37 log
drwxr-xr-x. 2 root root    4096 Jan 13 22:17 logs
drwxr-xr-x. 5 root root    4096 Jan 11 06:03 metastore_db
-rw-r--r--. 1 root root   23529 Dec 21 18:22 NOTICE
drwxr-xr-x. 6 root root    4096 Jan 11 05:52 python
drwxr-xr-x. 3 root root    4096 Jan 11 05:52 R
-rw-r--r--. 1 root root    3359 Dec 21 18:22 README.md
-rw-r--r--. 1 root root     120 Dec 21 18:22 RELEASE
drwxr-xr-x. 2 root root    4096 Jan 11 05:52 sbin
drwxr-xr-x. 5 root root    4096 Jan 13 22:25 work

安装jdk-7u79-linux-x64.rpm并在/etc/profile里添加环境变量,如下:
[root@sparkmaster spark-1.6.0-bin-hadoop2.6]# tail /etc/profile
        fi
    fi
done

unset i
unset pathmunge
export JAVA_HOME=/usr/java/jdk1.7.0_79/
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH

如果除了master之外还有其他worker,需要在每一台worker也做相同的操作,并且master与worker之间需要password-less ssh连接。而且还需要在每台电脑的/etc/hosts文件里加入各自的hostname IP

  • 启动spark master

[root@sparkmaster sbin]# pwd
/opt/spark-1.6.0-bin-hadoop2.6/sbin
[root@sparkmaster sbin]# ./start-master.sh 
starting org.apache.spark.deploy.master.Master, logging to /opt/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.master.Master-1-sparkmaster.out
启动master上的worker(master同时也当做worker使用)
[root@sparkmaster sbin]# ./start-slave.sh sparkmaster:7077
检查进程是否起来
[root@sparkmaster sbin]# jps
3368 Jps
2865 Master
3242 Worker

登入worker启动spark的worker进程
[root@sparkworker1 ~]# cd /opt/spark-1.6.0-bin-hadoop2.6/sbin/
[root@sparkworker1 sbin]# ./start-slave.sh spark://sparkmaster:7077
starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark-1.6.0-bin-hadoop2.6/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-sparkworker1.out
检查进程是否起来
[root@sparkworker1 sbin]# jps
2500 Jps
2470 Worker

访问UI,有个直观界面http://sparkmaster:8080/



  • run application在Spark上跑wordcount

此时没有run任何的application,所以Running Application没有内容。下面跑一个简单例子。

先进入spark shell
[root@sparkmaster bin]# pwd
/opt/spark-1.6.0-bin-hadoop2.6/bin
[root@sparkmaster bin]#  ./spark-shell --master spark://sparkmaster:7077
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79)
Type in expressions to have them evaluated.
Type :help for more information.
Spark context available as sc.
16/01/14 06:52:37 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/01/14 06:52:38 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/01/14 06:52:47 WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 1.2.0
16/01/14 06:52:48 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
16/01/14 06:52:53 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
16/01/14 06:52:54 WARN Connection: BoneCP specified but not present in CLASSPATH (or one of dependencies)
SQL context available as sqlContext.

scala> 
下面就可以开始构造RDD并计算了。让我们来试试在MapReduce里的Wordcount在spark里是如何实现的。

读取文件,注意这个文件必须在master和所有的worker的相同目录下都存在。
scala>  val file = sc.textFile("file:///input")
file: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:27
切割成一个个单词。
scala> val words = file.flatMap(line => line.split(" "))
words: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:29
转换成键值对并计数
scala> val counts =words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
counts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:31
收集结果
scala> counts.collect
res0: Array[(String, Int)] = Array((this,1), (is,1), (workcount,1), (file,1), (test,2), (spark,1), (fantastic,1), (for,1))
将统计出来的单词总数存入一个文本文件
scala> counts.saveAsTextFile("file:///output2")

scala> 
退出spark shell去查看保存的结果。但是我有点不太理解的是,保存的文件居然分开在所有的worker上(我的环境是2个worker)
[root@sparkmaster bin]# cat /output2/part-00000 
(this,1)
(is,1)
(workcount,1)
(file,1)
(test,2)
[root@sparkworker1 ~]# cat /output2/_temporary/0/task_201601140727_0003_m_000001/part-00001 
(spark,1)
(fantastic,1)
(for,1)

登录jobs界面查看结果,UI是http://sparkmaster:4040 

--------------------------------------------------------------------------------------------------------------------------------------------------------

Hadoop yarn模式

spark跑在Hadoop cluster上,首先要准备好Hadoop cluster,并启动整个集群。
spark方面要做的配置比较简单,只需要在$SPARK_HOME/conf/spark-env.sh加上这个参数:
HADOOP_CONF_DIR=/opt/hadoop-2.6.0/etc/hadoop/  <--Hadoop的core-site.xml所在目录

启动spark即可。
在spark-shell里提交作业,可以指定hdfs上的文件路径即可。如:
scala> val infile = sc.textFile("hdfs://sparkmaster:9000/input")  <--输入文件
16/01/19 22:10:35 INFO MemoryStore: Block broadcast_1 stored as values in memory (estimated size 228.3 KB, free 334.9 KB)
16/01/19 22:10:35 INFO MemoryStore: Block broadcast_1_piece0 stored as bytes in memory (estimated size 19.6 KB, free 354.5 KB)
16/01/19 22:10:35 INFO BlockManagerInfo: Added broadcast_1_piece0 in memory on 192.168.10.80:50237 (size: 19.6 KB, free: 511.5 MB)
16/01/19 22:10:35 INFO SparkContext: Created broadcast 1 from textFile at <console>:27
infile: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[5] at textFile at <console>:27

scala> val words = infile.flatMap(line => line.split(" "))
words: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[6] at flatMap at <console>:29

scala> val counts = words.map(word => (word, 1)).reduceByKey{case (x,y) => x + y}
16/01/19 22:10:46 INFO FileInputFormat: Total input paths to process : 1
counts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[8] at reduceByKey at <console>:31    

scala> counts.saveAsTextFile("hdfs://sparkmaster:9000/out01")  <--输出目录
16/01/19 22:11:32 INFO deprecation: mapred.tip.id is deprecated. Instead, use mapreduce.task.id
16/01/19 22:11:32 INFO deprecation: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
16/01/19 22:11:32 INFO deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap
16/01/19 22:11:32 INFO deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition
16/01/19 22:11:32 INFO deprecation: mapred.job.id is deprecated. Instead, use mapreduce.job.id
16/01/19 22:11:33 INFO SparkContext: Starting job: saveAsTextFile at <console>:34
16/01/19 22:11:33 INFO DAGScheduler: Registering RDD 7 (map at <console>:31)
16/01/19 22:11:33 INFO DAGScheduler: Got job 0 (saveAsTextFile at <console>:34) with 2 output partitions
16/01/19 22:11:33 INFO DAGScheduler: Final stage: ResultStage 1 (saveAsTextFile at <console>:34)
16/01/19 22:11:33 INFO DAGScheduler: Parents of final stage: List(ShuffleMapStage 0)
16/01/19 22:11:33 INFO DAGScheduler: Missing parents: List(ShuffleMapStage 0)
16/01/19 22:11:33 INFO DAGScheduler: Submitting ShuffleMapStage 0 (MapPartitionsRDD[7] at map at <console>:31), which has no missing parents
16/01/19 22:11:33 INFO MemoryStore: Block broadcast_2 stored as values in memory (estimated size 4.1 KB, free 358.7 KB)
16/01/19 22:11:33 INFO MemoryStore: Block broadcast_2_piece0 stored as bytes in memory (estimated size 2.3 KB, free 360.9 KB)
16/01/19 22:11:33 INFO BlockManagerInfo: Added broadcast_2_piece0 in memory on 192.168.10.80:50237 (size: 2.3 KB, free: 511.5 MB)
16/01/19 22:11:33 INFO SparkContext: Created broadcast 2 from broadcast at DAGScheduler.scala:1006
16/01/19 22:11:33 INFO DAGScheduler: Submitting 2 missing tasks from ShuffleMapStage 0 (MapPartitionsRDD[7] at map at <console>:31)
16/01/19 22:11:34 INFO TaskSchedulerImpl: Adding task set 0.0 with 2 tasks
16/01/19 22:11:34 INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, sparkmaster, partition 0,NODE_LOCAL, 2120 bytes)
16/01/19 22:11:34 INFO TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1, sparkmaster, partition 1,NODE_LOCAL, 2120 bytes)
16/01/19 22:11:48 INFO BlockManagerInfo: Added broadcast_2_piece0 in memory on sparkmaster:34871 (size: 2.3 KB, free: 511.5 MB)
16/01/19 22:12:05 INFO BlockManagerInfo: Added broadcast_1_piece0 in memory on sparkmaster:34871 (size: 19.6 KB, free: 511.5 MB)
16/01/19 22:12:18 INFO TaskSetManager: Finished task 1.0 in stage 0.0 (TID 1) in 43960 ms on sparkmaster (1/2)
16/01/19 22:12:18 INFO TaskSetManager: Finished task 0.0 in stage 0.0 (TID 0) in 44063 ms on sparkmaster (2/2)
16/01/19 22:12:18 INFO TaskSchedulerImpl: Removed TaskSet 0.0, whose tasks have all completed, from pool 
16/01/19 22:12:18 INFO DAGScheduler: ShuffleMapStage 0 (map at <console>:31) finished in 44.138 s
16/01/19 22:12:18 INFO DAGScheduler: looking for newly runnable stages
16/01/19 22:12:18 INFO DAGScheduler: running: Set()
16/01/19 22:12:18 INFO DAGScheduler: waiting: Set(ResultStage 1)
16/01/19 22:12:18 INFO DAGScheduler: failed: Set()
16/01/19 22:12:18 INFO DAGScheduler: Submitting ResultStage 1 (MapPartitionsRDD[9] at saveAsTextFile at <console>:34), which has no missing parents
16/01/19 22:12:18 INFO MemoryStore: Block broadcast_3 stored as values in memory (estimated size 64.7 KB, free 425.6 KB)
16/01/19 22:12:18 INFO MemoryStore: Block broadcast_3_piece0 stored as bytes in memory (estimated size 22.5 KB, free 448.1 KB)
16/01/19 22:12:18 INFO BlockManagerInfo: Added broadcast_3_piece0 in memory on 192.168.10.80:50237 (size: 22.5 KB, free: 511.4 MB)
16/01/19 22:12:18 INFO SparkContext: Created broadcast 3 from broadcast at DAGScheduler.scala:1006
16/01/19 22:12:18 INFO DAGScheduler: Submitting 2 missing tasks from ResultStage 1 (MapPartitionsRDD[9] at saveAsTextFile at <console>:34)
16/01/19 22:12:18 INFO TaskSchedulerImpl: Adding task set 1.0 with 2 tasks
16/01/19 22:12:18 INFO TaskSetManager: Starting task 0.0 in stage 1.0 (TID 2, sparkmaster, partition 0,NODE_LOCAL, 1894 bytes)
16/01/19 22:12:18 INFO TaskSetManager: Starting task 1.0 in stage 1.0 (TID 3, sparkmaster, partition 1,NODE_LOCAL, 1894 bytes)
16/01/19 22:12:18 INFO BlockManagerInfo: Added broadcast_3_piece0 in memory on sparkmaster:34871 (size: 22.5 KB, free: 511.5 MB)
16/01/19 22:12:20 INFO MapOutputTrackerMasterEndpoint: Asked to send map output locations for shuffle 0 to sparkmaster:45740
16/01/19 22:12:20 INFO MapOutputTrackerMaster: Size of output statuses for shuffle 0 is 146 bytes
16/01/19 22:12:47 INFO TaskSetManager: Finished task 0.0 in stage 1.0 (TID 2) in 28853 ms on sparkmaster (1/2)
16/01/19 22:12:47 INFO DAGScheduler: ResultStage 1 (saveAsTextFile at <console>:34) finished in 29.028 s
16/01/19 22:12:47 INFO TaskSetManager: Finished task 1.0 in stage 1.0 (TID 3) in 29006 ms on sparkmaster (2/2)
16/01/19 22:12:47 INFO TaskSchedulerImpl: Removed TaskSet 1.0, whose tasks have all completed, from pool 
16/01/19 22:12:47 INFO DAGScheduler: Job 0 finished: saveAsTextFile at <console>:34, took 74.176049 s

scala> 






















0 0
原创粉丝点击