1.在安装Spark之,确保 Hadoop 已经成功安装,并且 Hadoop 已经正常启动。 Hadoop 正常启动的验证过程如下:
(1) 使用下面的命令,看可否正常显示 HDFS 上的目录列表
# hdfs dfs -ls /
(2) 使用浏览器查看相应界面
输入网址:http://192.168.222.100:50070/
输入网址:http://192.168.222.100:18088/
该页面的结果跟 Hadoop 安装部分浏览器展示结果一致。如果满足上面的两个条件,表示 Hadoop 正常启动。
HBase 需要部署在 HadoopMaster 和 HadoopSlave 上。下面的操作都是通过 HadoopMaster 节点进行。
解压并安装 Spark
注意:本文档使用的 spark 是 1.2.0 版本,实际培训时可能会改变,在进行操作时,请替换成实际的版本。 使用下面的命令,解压 Spark 安装包:
Spark安装包的权限设置
解压Spark安装包,
重命名Spark安装包,
配置spark的系统环境变量信息,在 Yarn 上运行 Spark 需要配置 HADOOP_CONF_DIR、YARN_CONF_DIR 和 HDFS_CONF_DIR 环境变量命令:
# vi /etc/profile (配置信息如下图)
export JAVA_HOME=/home/software/jdk
export HADOOP_HOME=/home/software/hadoop
export HBASE_HOME=/home/software/hbase
export HADOOP_CLASSPATH=$HBASE_HOME/lib/*
export SPARK_HOME=/home/software/spark
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HDFS_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HBASE_HOME/bin:$SPARK_HOME/bin
使环境变量信息生效,
验证 Spark 安装,执行下面的命令(这是 1 行代码):
# spark-submit --class org.apache.spark.examples.SparkPi --master yarn-cluster --num-executors 3 --driver-memory 1g --executor-memory 1g --executor-cores 1 /home/software/spark/lib/spark-examples*.jar 10
查看执行结果,在计算节点上(slave节点)。执行下面代码:
Spark-WordCount实例
10.创建Hadoop项目,
在eclipse中点击File--->new--->other,会弹出对话框:
然后找到,Map/Reduce文件夹,然后选择Map/Reduce Project。
点击下一步,然后输入Spark-WordCount,并点击完成。
在eclipse工程列表中会出现Spark-WordCount项目,
创建类,
打开Spark-WordCount目录,右键点击src文件夹,选择new--->Class
填写类名:WordCount,点击finish。
工程目录下会出现Spark_WordCount的java文件。
双击WordCount.java文件,把代码拷贝进去。
import java.util.Arrays;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
public class Spark_WordCount {
public static void main(String[] args) {
/**
* 1、创建SparkConf对象,设置Spark应用程序的配置信息
*/
SparkConf conf = new SparkConf().setAppName(Spark_WordCount.class.getSimpleName());
//设置Spark应用程序的名称
conf.setMaster("local[*]");
/**
* 2、创建SparkContext对象,Java开发使用JavaSparkContext;Scala开发使用SparkContext
* 在Spark中,SparkContext负责连接Spark集群,创建RDD、累积量和广播量等。
* Master参数是为了创建TaskSchedule(较低级的调度器,高层次的调度器为DAGSchedule),如下:
* 如果setMaster("local")则创建LocalSchedule;
* 如果setMaster("spark")则创建SparkDeploySchedulerBackend。在SparkDeploySchedulerBackend的start函数,会启动一个Client对象,连接到Spark集群。
*/
JavaSparkContext sc = new JavaSparkContext(conf);
/**
* 3、sc中提供了textFile方法是SparkContext中定义的,如下:
* def textFile(path: String): JavaRDD[String] = sc.textFile(path)
* 用来读取HDFS上的文本文件、集群中节点的本地文本文件或任何支持Hadoop的文件系统上的文本文件,它的返回值是JavaRDD[String],是文本文件每一行
*/
JavaRDD<String> lines = sc.textFile("hdfs://master:9000/spark-input.txt");
/**
* 4、将行文本内容拆分为多个单词
* lines调用flatMap这个transformation算子(参数类型是FlatMapFunction接口实现类)返回每一行的每个单词
*/
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>(){
private static final long serialVersionUID = -3243665984299496473L;
@Override
public Iterable<String> call(String line) throws Exception {
return Arrays.asList(line.split("\t"));
}
});
/**
* 5、将每个单词的初始数量都标记为1个
* words调用mapToPair这个transformation算子(参数类型是PairFunction接口实现类,PairFunction<String, String, Integer>的三个参数是<输入单词, Tuple2的key, Tuple2的value>),返回一个新的RDD,即JavaPairRDD
*/
JavaPairRDD<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {
private static final long serialVersionUID = -7879847028195817507L;
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return new Tuple2<String, Integer>(word, 1);
}
});
/**
* 6、计算每个相同单词出现的次数
* pairs调用reduceByKey这个transformation算子(参数是Function2接口实现类)对每个key的value进行reduce操作,返回一个JavaPairRDD,这个JavaPairRDD中的每一个Tuple的key是单词、value则是相同单词次数的和
*/
JavaPairRDD<String, Integer> wordCount = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = -4171349401750495688L;
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1+v2;
}
});
/**
* 7、使用foreach这个action算子提交Spark应用程序
* 在Spark中,每个应用程序都需要transformation算子计算,最终由action算子触发作业提交
*/
wordCount.foreach(new VoidFunction<Tuple2<String,Integer>>() {
private static final long serialVersionUID = -5926812153234798612L;
@Override
public void call(Tuple2<String, Integer> wordCount) throws Exception {
System.out.println(wordCount._1+":"+wordCount._2);
}
});
wordCount.saveAsTextFile("hdfs://master:9000/output3");
/**
* 9、关闭SparkContext容器,结束本次作业
*/
sc.close();
}
}
创建数据文件,
在文件中输入内容并保存退出(单词中间为table符号):
# vi spark-input.txt
上传数据文件
刷新目录会发现文件上传成功:
运行程序:右键程序Run as--->Run on Hadoop,运行完毕后,刷新目录如下图,
运行期间访问192.168.222.100:4040,可以显示如下界面。