一、安装spark依赖的内容
1.JDK
spark是由Scala语言编写的,但是运行的环境是jvm,所以需要安装JDK
编译过程:Python、java、Scala编写的代码 -> scala编译器编译解释,生成class文件 -> 由jvm负责执行class文件(与java代码执行一致)
2.scala
由于 spark是由Scala语言编写的,所以依赖Scala环境,且由Scala编写的执行代码也需要环境进行编译
3.配置SSH免密码登录
集群节点无密码访问,与安装Hadoop时一致
4.安装Hadoop
hdfs是作为spark的持久层,所以需要安装Hadoop,同时如果需要配置spark on yarn,则Hadoop需要安装yarn版本的
5.安装spark
安装spark,执行spark代码
二、JDK安装
1.下载地址
用户可以在官网下载相应版本的JDK,本例使用JDK1.6,下载地址为: http://www.oracle.com/technetwork/java/javase/archive-139210.html
development kit的bin包
2.下载后,在相应的目录下执行bin文件(假设JDK目录是 jdkpath)
./ jdk-6u45-linux-i586.bin
3.配置环境变量,修改/etc/profile文件增加以下内容
export JAVA_HOME= $jdkpath
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/dt.jar:$JAVA_HOME/jre/lib/tools.jar
4.生效profile(或者重启机器)
source /etc/profile
5.终端输入 java -version
输出类似如下说明安装成功
三、安装Scala
1.下载地址
官网下载地址:http://www.scala-lang.org/download/all.html
本例使用的是Scala 2.9.3
2.在安装目录下解压(假设Scala目录是scalapath)
tar -zxvf scala-2.9.3.tgz
3.配置环境变量,修改/etc/profile文件增加以下内容
export SCALA_HOME= $scalapath
export PATH=$SCALA_HOME/bin:$PATH
4.生效profile(或者重启机器)
source /etc/profile
四、配置SSH免密码登陆
首先,需要配置各个机器间的相互访问:
1、 配置ssh的自动登陆(在master机上):
$ ssh-keygen -t dsa -P ” -f ~/.ssh/id_dsa
完成后会在~/.ssh/(用户目录下)生成两个文件:id_dsa 和id_dsa.pub。
再把id_dsa.pub 追加到授权key 里面(当前并没有authorized_keys文件):
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
完成后可以实现无密码登录本机:
$ ssh localhost
2、把master上的id_dsa.pub 文件追加到slaves机器的authorized_keys 内( 以slaves1节点为例):
#拷贝master的id_dsa.pub文件(在master号机器上执行)
$ scp id_dsa.pub redmap@192.168.1.2:/home/redmap/
注:(只需在主节点上运行ssh-kegen程序。其他节点的目录结构创建后,将刚才在主节点创建的keys通过scp拷贝到从节点的同样的目录上。)
我们在实际执行中是手动把id_dsa.pub拷贝到其他slaves的节点中,而不是用scp命令。最好是直接手动拷贝过去,这样文件的权限是一致的。
登录192.168.1.2,进入用户目录下执行:
$ cat id_dsa.pub >> .ssh/authorized_keys
之后可以在master上不输入密码直接SSH访问slaves1
五、安装Hadoop2.x
1.下载Hadoop
下载地址 http://apache.fayea.com/hadoop/common/
本文使用hadoop-2.5.2.tar
2.解压压缩包到指定目录
tar -zxvf hadoop-2.5.2.tar -C /usr/local (目录自定义)
如果需要修改拥有者
chown -R hduser:hadoop hadoop-2.5.2
3.配置环境变量
编辑profile文件
vi /etc/profile
在profile文件增加以下内容
export HADOOP_HOME=/home/root/hadoop-2.5.2 (安装路径)
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
4.编辑配置文件
(1)进入Hadoop安装路径下的/etc/hadoop目录
(2)配置Hadoop-env.sh文件
增加 export JAVA_HOME=....(java JDK安装路径)
(3)修改hadoop安装目录下/etc/hadoop目录中的core-site.xml
<configuration>
<property>
<name>io.native.lib.available</name>
<value>true</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://host:9000</value>//本机的Ip地址或者域名,端口自己设置
<description>The name of the default file system.Either the literal string "local" or a host:port for NDFS.</description>
<final>true</final>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/home/tmp</value>
</property>
</configuration>
(4) 在etc/hadoop目录中编辑hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name><value>file:/usr/hadoop23/dfs/name</value>//本机保存name数据的目录,自定义
<description>Determines where on the local filesystem the DFS name node should store the name table.If this is a comma-delimited list of directories,then name table is replicated in all of
the directories,for redundancy.</description>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name><value>file:/us/hadoop23/dfs/data</value>//本机保存data数据的目录,自定义
<description>Determines where on the local filesystem an DFS data node should store its blocks.If this is a comma-delimited list of directories,then data will be stored in all named directories,typically
on different devices.Directories that do not exist are ignored.</description>
<final>true</final>
</property>
<property>
<name>dfs.replication</name><value>1</value>
</property>
<property>
<name>dfs.permission</name><value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name><value>true</value>
</property>
</configuration>
路径
file:/usr/hadoop23/dfs/name与
file:/usr/hadoop23/dfs/data
是计算机中的一些文件夹,用于存放数据和编辑文件的路径必须用一个详细的URI描述。
(5) 在etc/hadoop目录中编辑mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>yarn,local,classic</description>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
(6)编辑yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.address</name><value>host:port</value>//本机的Ip地址或者域名,端口自己设置
<description>the host is the hostname of the ResourceManager and the port is the port on
which the clients can talk to the Resource Manager. </description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name><value> host:port </value>//本机的Ip地址或者域名,端口自己设置
<description>host is the hostname of the resourcemanager and port is the port
on which the Applications in the cluster talk to the Resource Manager.
</description>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name><value> host:port </value>//本机的Ip地址或者域名,端口自己设置
<description>host is the hostname of the resource manager and
port is the port on which the NodeManagers contact the Resource Manager.
</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name><value> host:8033 </value>//本机的Ip地址或者域名,端口自己设置
<description>host is the hostname of the resource manager and
port is the port on which the NodeManagers contact the Resource Manager.
</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name><value> host:8088 </value>//本机的Ip地址或者域名,端口自己设置
<description>host is the hostname of the resource manager and
port is the port on which the NodeManagers contact the Resource Manager.
</description>
</property>
<property>
<name>yarn.nodemanager.aux-services</name><value>mapreduce.shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
5.配置masters和slaves文件
(1)如果etc/hadoop目录下没有masters文件,则新建一个,并添加集群的主节点名称或者IP,最好和之前的配置格式一致,同为IP或者同为主机名称
比如:本文配置的masters文件内容为(master为某个主节点名称)
master
(2)修改slaves文件,添加所有slave机器的名称或IP
比如:本文配置的slaves文件内容为(由于配置的是伪分布式集群,所以内容和masters文件一样)
master
6.如果有多个slaves机器,则需要把配置好的Hadoop文件分发到各个节点相同路径下,修改profile文件和master一致,修改hosts文件,增加所有的机器名称和IP对应关系,同时确保各个节点上Hadoop目录的权限,操作用户对Hadoop目录有拥有权
按以上的配置修改好集群的节点后,最好重启所有节点,确保所有配置文件生效
7.格式化namenode
hadoop namenode -format
8.启动Hadoop
./sbin/start-all.sh
9.查看是否启动成功
(1) 如果是单机伪分布式集群
执行 jps 命令,输出类似如下,则说明安装成功
8451 SecondaryNameNode
8721 NodeManager
8592 ResourceManager
9384 Jps
8152 NameNode
8282 DataNode
(2) 如果是多个几点的分布式集群
在主节点执行jps命令时,只有
8451 SecondaryNameNode
8592 ResourceManager
9384 Jps
8152 NameNode
而在slave机器执行命令时,只有
9384 Jps
8282 DataNode
8721 NodeManager
10.关闭Hadoop
./sbin/stop-all.sh
六、安装spark1.x
1.下载安装包
官网地址: http://spark.apache.org/downloads.html
本文使用的是spark1.0.0
2.解压压缩包到指定目录
tar -zxvf spark-1.0.0.tar.gz -C ‘指定目录’(假设为sparkpath)
3.修改profile文件
vi /etc/profile
添加以下内容
export SPARK_HOME=sparkpath
export PATH=$PATH:$SPARK_HOME/bin
4.编辑spark安装目录下conf/spark-env.sh文件,增加以下参数
export SCALA_HOME=scalahome
export JAVA_HOME=jdkhome
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=256m (自定义,每个worker节点可用内存)
export MASTER=spark://master:7077 (master地址)
5.编辑conf/slaves文件
增加所有worker节点的主机名或IP,最好所有的配置都统一为机器名
6.启动spark集群
./sparkpath/sbin/start-all.sh
如果只是一个伪分布式的集群执行jps命令时,会多出两个进程
2222222
显示如上图所示,则说明配置成功,相应进程都启动
如果是多个节点的spark集群
则在master机器上只有 333333Master这个进程
而在slaves机器上只有444444Worker这个进程
7.关闭spark集群
./sparkpath/sbin/stop-all.sh
8.集群测试
./bin/run-example org.apache.spark.examples.SparkPi
结果输出有如下,则运行成功
Pi is roughly 3.1352 (类似结果)
9.spark-shell测试
交互终端
Spark context available as sc. Spark context默认被初始化,sc
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
val totalSum = distData.reduce((a, b) => a + b)
println(totalSum)
由于,我本身机器内存不是很大,所以我在/conf/spark-defaults.conf 文件中增加了几个默认配置(机器不好)
spark.deploy.defaultCores 1 (默认内核数)
spark.default.parallelism 1 (并行数目)
spark.akka.threads 1
spark.cores.max 1 (最大内核数)
spark.executor.memory 50m (这个值要小于spark-env.sh中配置的SPARK_WORKER_MEMORY值,否则会报内存不够的警告,代码不执行)
10.访问web
http://master:8080/
查看集群状态
http://master:4040/