计划2个月内能精通spark开发,今天起开始努力!
1、环境准备
虚拟机采用visualbox,https://www.virtualbox.org
在上面搭建ubuntu server 集群,下载ubuntu server 光盘镜像,http://www.ubuntu.com/download/server
在visualbox上安装 ubuntu server,从中选择英文语言,如果中文可能会有乱码,按提示基本一路回车。
装好ubuntu server第一件事是安装增强功能,visualbox光驱设置成为VBoxGuestAdditions.iso,进入虚拟机
$ sudo mount /dev/cdrom /media/cdrom
$ sudo aptitude install build-essential linux-headers-$(uname -r) -y
$ cd /media/cdrom
$ sudo ./VBoxLinuxAdditions.run
安装成功的标志是鼠标可以随便拖动。
安装ssh服务器
$ sudo apt-get install openssh-server
visualbox中设置本虚拟机的网络为“桥接网络" ,这样就可以通过ssh客户端链接到虚拟机中。
新装的ubuntu server开始并不好用,为了让下载速度更快一点需要更新ubuntu的软件源
根据官方文档 http://wiki.ubuntu.org.cn/Qref/Source
新建用户名sparker
ubuntu建用户最好用adduser,虽然adduser和useradd是一样的在别的linux糸统下,但是我在ubuntu下用useradd时,并没有创建同名的用户主目录。
例子:adduser user1
这样他就会自动创建用户主目录,创建用户同名的组。
root@ubuntu:~# sudo adduser sparker
[sudo] password for xx:
输入xx用户的密码,出现如下信息
正在添加用户"sparker"…
正在添加新组"sparker" (1006)…
正在添加新用户"sparker" (1006) 到组"sparker"…
创建主目录"/home/sparker"…
正在从"/etc/skel"复制文件…
输入新的 UNIX 口令:
重新输入新的 UNIX 口令:
两次输入db的初始密码,出现的信息如下
passwd: password updated successfully
Changing the user information for db
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Full Name []:等信息一路回车
这个信息是否正确? [Y/n] y
到此,用户添加成功。如果需要让此用户有root权限,执行命令:
root@ubuntu:~# sudo vim /etc/sudoers
修改文件如下:
# User privilege specification
root ALL=(ALL) ALL
sparker ALL=(ALL) ALL
保存退出,sparker用户就拥有了root权限。
1、安装jdk
1.删除自带的
2.安装Oracle官方的
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
3.管理
sudo update-alternatives --config java
2、下载需要的安装包,我在sparker用户目录下面新建了一个~/bigdata文件夹,用于存放需要的安装包;
wget http://apache.osuosl.org/spark/spark-1.6.0/spark-1.6.0-bin-hadoop2.6.tgz
wget https://dl.bintray.com/sbt/native-packages/sbt/0.13.9/sbt-0.13.9.tgz
wget http://apache.claz.org/hadoop/common/hadoop-2.6.3/hadoop-2.6.3.tar.gz
wget http://apache.mirrors.tds.net/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
wget http://downloads.typesafe.com/scala/2.11.7/scala-2.11.7.tgz
wget http://mirror.reverse.net/pub/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
2、对所有安装包进行解压,重命名
比如:
tar -zxf hadoop-2.6.3.tar.gz
mv hadoop-2.6.3 hadoop
依次对所有的包进行解压,解压完的目录结构如下:
3、环境变量设置
$ vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SBT_HOME=$HOME/bigdata/sbt
export MAVEN_HOME=$HOME/bigdata/maven
export SPARK_HOME=$HOME/bigdata/spark/
export HADOOP_HOME=$HOME/bigdata/hadoop/
export HADOOP_CONF_DIR=$HOME/bigdata/hadoop/etc/hadoop
export SCALA_HOME=$HOME/bigdata/scala/
export PATH=$PATH:$MAVEN_HOME/bin:$SBT_HOME/bin:$JAVA_HOME/bin:$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
$source .bashrc
验证一下
$sbt sbt-version
[info] Set current project to sparker (in build file:/home/sparker/)
[info] 0.13.9
$mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /home/sparker/bigdata/maven
Java version: 1.8.0_66, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.19.0-25-generic", arch: "amd64", family: "unix"
$ java -version
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
4、关闭当前虚拟机,复制虚拟机2台,组成一个3台的集群。
进入每台机器,
修改 /etc/hostname 定义机器名列表为:
master
slave1
slave2
修改 /etc/hosts 如下,IP为实际的机器IP
192.168.3.10 master
192.168.3.11 slave1
192.168.3.12 slave2
5、打通各个服务器的ssh免密码登陆
1:生成密钥
ssh-keygen -t rsa
2:把本机的公钥追到slave1,slave2的 .ssh/authorized_keys 里
ssh-copy-id -i ~/.ssh/id_rsa.pub jifeng@feng02
3:测试
ssh slave1
6、zookeeper配置
1、在master 机器的zookeeper home目录下
mkdir data
mkdir logs
cd conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg #在最后面增加如下代码:
dataDir=/home/sparker/bigdata/zookeeper/data
dataLogDir=/home/sparker/bigdata/zookeeper/logs
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
3、设置serverid
cd data
echo "1">myid #在data目录下生成myid文件,内容为1
4、copy zookeeper 到另两个节点
cd /usr/local
scp -r ./zookeeper root@slave1:/usr/local/
scp -r ./zookeeper root@slave2:/usr/local/
登录到slave1:
cd data #zookeeperhome目录下的data文件夹
echo "2">myid
登录到slave2:
cd data
echo "3">myid
5、运行zookeeper:
./bin/zkServer.sh start #zookeeper每个节点需要单独启动运行
7、修改spark配置,并同步到所有机器。
$ cd ~/bigdata/spark/conf
$ cp spark-env.sh.template spark-env.sh
$ vim spark-env.sh
export SCALA_HOME=$HOME/bigdata/scala
#export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=1G
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export MASTER=spark://master:7077
export export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master:2181,slave1:2181,slave2:2181 -Dspark.deploy.zookeeper.dir=/spark"
8、Spark Standalone HA运行:
1、分别启动三个节点的zookeeper:
./bin/zkServer.sh start #关闭服务,把start换成stop
2、在master启动Spark
./sbin/start-all.sh
3、启动StandBy Spark Master,假设为Slave1
./sbin/start-master.sh
4、用jps查看进程
master节点包含: Master、Worker、Jps、QuorumPeerMain
Standby节点(slave1):Master、Worker、Jps、QuorumPeerMain
slave2节点:Worker、Jps、QuorumPeerMain
9、完了我们写个spark程序验证一下整个集群是否可用,参照 http://spark.apache.org/docs/latest/quick-start.html#self-contained-applications 写个程序来计算某个txt文件中含字母a的总行数和含字母b的总行数。新建mvn 工程myfirstsparkapp(可到附件下载),代码如下。然后通过 mvn clean package打出一个jar包MySimpleSpark-1.0-SNAPSHOT.jar
package com.jinn.spark;
/**
* @author zhanjun.
* @version MyFistSparkApp, v 0.1 2016 16-1-18 上午7:34 zhanjun Exp $$
* @description
*/
import org.apache.spark.api.java.*;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.function.Function;
/**
* 计算txt 中含a 含b的总行数
*/
public class SimpleApp {
public static void main(String[] args) {
/**
* 保证这个readme.txt在集群的各个节点上都有
*/
String logFile = "file:///home/sparker/bigdata/worksparce/readme.txt";
SparkConf conf = new SparkConf().setAppName("Simple Application");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> logData = sc.textFile(logFile).cache();
long numAs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) {
return s.contains("a");
}
}).count();
long numBs = logData.filter(new Function<String, Boolean>() {
public Boolean call(String s) {
return s.contains("b");
}
}).count();
System.out.println("------Lines with a: " + numAs + ", lines with b: " + numBs);
}
}
把生成的jar 上传到spark集群的某个节点,并要求集群中所有节点都有我们的测试数据readme.txt(含英文的文本) 通过spark-submit提交任务:
spark-submit --class "com.jinn.spark.SimpleApp" --master spark://master:7077 ~/bigdata/worksparce/MySimpleSpark-1.0-SNAPSHOT.jar
可以看到执行结果:
恭喜您,部署成功了!