一、工具下载:
1、spark下载
目前最新的是2.1.1,spark 2.0开始api和之前的还是有比较多的变化,因此如果选择2.0以上版本,最好看一下api变化,下载地址:http://spark.apache.org/downloads.html
2、hadoop下载
目前最新的hadoop版本已经到了3.0了,可以根据你的选择需要的版本,下载地址:https://dist.apache.org/repos/dist/release/hadoop/common/
3、jdk下载,这个就不多说了,基本很多都用到,不过建议下载1.8以上的,这样避免出现兼容问题
二、spark和hadoop基本介绍
1、Hadoop
Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算
Hadoop的核心包括两块,一个是map/reduce操作,另一个是HDFS分布式文件系统,这个文件系统核心是NameNode和DataNode,前者负责记录文件树形结构,简单来说就是维护文件目录结构,以及每个文件对应在DataNode中的文件块属性。后者是用作数据存储用的,举个例子,如果你往HDFS里面放入一个文件,首先经过NameNode将文件信息记录下来,然后将它存放到各个DataNode中
2、Spark
Spark是专为大规模数据处理而设计的快速通用的计算引擎,里面封装了很多方便的api调用,可以把它看做是Hadoop的补充,虽然hadoop也能进行一些分布式计算,但是spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS
三、开始搭建环境
1. 选择几个ubuntu的虚拟机,其中一个作为spark的master节点以及hadoop的 NameNode节点,其他的作为slave节点和DataNode节点
2. 解压下载的spark和hadoop分别到目录/home/spark和/home/hadoop
3. 配置ssh无秘钥登录
a) Master节点生成公钥
ssh-keygen -t rsa -P '' #一路回车直到生成公钥
b) 将master生成的pub拷贝到worker(10.14.66.215)上
scp /home/master/.ssh/id_rsa.pub
10.14.66.215:/home/worker/.ssh/id_rsa.pub.master
c) 将自己生成的pub添加到授权列表里
cat /home/master/.ssh/id_rsa.pub >> /home/master/.ssh/authorized_keys
d) worker节点中将master的pub添加到授权列表里
cat /home/worker/.ssh/id_rsa.pub.master >> /home/worker/.ssh/authorized_keys
4. 配置etc/profile,相当于环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export SPARK_HOME=/home/spark/spark-2.1.0-bin-hadoop2.6
export HADOOP_HOME=/home/hadoop/hadoop-2.6.1
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PYTHONPATH=$PYTHONPATH:$SPARK_HOME/python
export SPARK_SCALA_VERSION=2.11
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin
最后执行source /etc/profile让配置生效
注意:如果要使用python进行spark编程,那么必须将spark的python路径加到PYTHONPATH中才行,就像上面的
export PYTHONPATH=$PYTHONPATH:$SPARK_HOME/python
另外SPARK_SCALA_VERSION是2.0中需要加入的,因为每次分配任务给worker节点时都会检查当前的scala编译版本,没有这个设置就会报错找不到build directory,或者可以在SPARK_HOME目录下创建\launcher\target\scala-2.11空目录也能解决这个错误
5. 配置hadoop和spark的slaves文件
a) 最好使用机器名作为节点名,下面会提到hadoop这方面的问题
b) 如果使用机器名的话,还需要配置/etc/hosts文件将对应的机器名和ip绑定
6. 配置hadoop
a) 进入$HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_112/
b) $HADOOP_HOME/etc/hadoop/core-site.xml:
fs.defaultFS
hdfs://master:9000
io.file.buffer.size
131072
hadoop.tmp.dir
/opt/hadoop-2.7.3/tmp
注意:fs.defaultFS配置了默认的文件协议,后面代码中就默认加上hdfs://master:9000这个前缀
c) $HADOOP_HOME/etc/hadoop/hdfs-site.xml:
dfs.namenode.secondary.http-address
master:50090
dfs.replication
2
dfs.namenode.name.dir
file:/opt/hadoop-2.7.3/hdfs/name
dfs.datanode.data.dir
file:/opt/hadoop-2.7.3/hdfs/data
dfs.namenode.datanode.registration.ip-hostname-check
false
d) $HADOOP_HOME/etc/hadoop/mapred-site.xml
mapreduce.framework.name
yarn
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.address
master:19888
e) $HADOOP_HOME/etc/hadoop/yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.address
master:8032
yarn.resourcemanager.scheduler.address
master:8030
yarn.resourcemanager.resource-tracker.address
master:8031
yarn.resourcemanager.admin.address
master:8033
yarn.resourcemanager.webapp.address
master:8088
注意:
yarn
是作为资源管理器存在,每次提交一个任务时,
spark
会做两件事,一个是将代码分成多个
stage
,每个
stage
相当于一个计算,然后再把
stage
分成多个
task
,每个
task
执行相同的操作,只不过操作的数据不同,这就和之前说的每个
DataNode
里面都存放着同一个文件的不同块联系起来了。然后
spark
做的另一件事就是向
yarn
资源管理器请求分配资源,资源管理器通过
NodeManager
提供的每个节点所在机器的内存、
CPU
等信息来分配一定的资源给这个任务
f) 最后格式化一下节点:
hdfs namenode -format -force
注意:如果格式化namenode的时候没有强制格式化datanode,那么datanode里面关于namenode的信息就还是之前的,这样就找不到namenode了,所以要么每次格式化namenode前删除所有datanode,要么进行强制的格式化同时格式化namenode和datanode
7. 配置spark-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export HADOOP_HOME=/home/hadoop/hadoop-2.6.1
export SPARK_MASTER_HOST=10.64.66.215
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_MERMORY=2G
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export SPARK_SCALA_VERSION=2.11
注意:配置这些属性的时候最好根据源文件里面注释里提供的属性作为依据,因为不同版本的spark有些属性可能被废弃了,如果你按照网上查的去配置的话就会出问题,比如SPARK_MASTER_HOST是2.0才加入的,之前用的是SPARK_MASTER_IP,在2.0已经被废弃了
8. 拷贝相关文件到worker节点:
先要修改worker节点的/home目录为可写权限
scp -r /home/hadoop/hadoop-2.6.1 10.14.66.127:/home/hadoop
scp -r /home/spark/spark-2.1.0-bin-hadoop2.7 10.14.66.127:/home/spark
9. 创建hdfs文件系统
hadoop fs -mkdir -p /Hadoop/Input
hadoop fs -put wordcount.txt /Hadoop/Input
注意:hdfs文件系统是由namenode来维护目录结构的,因此你在ubuntu上看不到具体的路径存放,只能通过hadoop fs命令来查看
10. 编辑测试代码
val file=sc.textFile("hdfs://master:9000/Hadoop/Input/wordcount.txt")
val rdd = file.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
rdd.collect()
rdd.foreach(println)
注意:如果是在ubuntu上,hdfs://master:9000这个前缀可以不用加,因为hadoop中配置了默认的前缀就是它,但是在window上开发时需要加上
11. 搭建spark开发环境
Hadoop和spark比较适合搭建在ubuntu上,但是我们开发就不方便了,因此我们可以在window上搭建master节点,然后其他的像hadoop和slave节点仍然使用ubuntu上搭建好的就行,具体做法是在window上搭好开发环境后,可以查看ubuntu上worker节点启动的log文件,第一行就是启动的命令,然后将命令里的master ip指定为window的ip,最后执行命令就能在那台ubuntu上启动一个worker节点了,hadoop完全不用变,因为window上仍然可以使用hdfs文件指定