如咱们所知,spark之因此强大,除了强大的数据处理功能,另外一个优点就在于良好的分布式架构。举一个例子在Spark实战--寻找5亿次访问中,访问次数最多的人中,我用四个spark节点去尝试寻找5亿次访问中,次数最频繁的ID。这一个过程耗时居然超过40分钟,对一个程序来讲,40分钟出结果这简直就是难以忍耐。可是在大数据处理中,这又是理所固然的。固然实际中不可能容许本身的程序在简单的仅处理五亿次访问中耗费如此之大的时间,所以考虑了分布式架构。(PS:固然处理5亿次请求的示例中,咱们实际采用的实际上是四个节点,三台机子的伪分布式架构)java
仍是以上面Spark实战--寻找5亿次访问中,访问次数最多的人做为例子,若是咱们四个节点(实际上三台机子)处理了四十分钟,若是咱们用一千个相同配置的节点上,理论上这个时间会缩短到2.4分钟。若是咱们再增长节点的性能,好比内存、CPU性能、核数等这个理论值会缩短到更小的值。可是,实际上这个理论值永远达不到,这一点显而易见,由于spark调度、分配、网络等时间消耗,所以这个值会比2.4分钟大一些。可是相较于47分钟,这个值已经很是使人满意了。为了达到spark的性能,咱们经常会对其进行调优,这是后话了。node
为了搭建一个真正的的集群环境,而且要作到高可用的架构,咱们至少准备三个虚拟机来做为集群节点。所以我购买了三台阿里云的服务器,来做为咱们的集群节点。python
Hostname | IP | 内存 | CPU |
---|---|---|---|
master | 172.19.101.111 | 4G | 1核 |
slave1 | 172.19.77.91 | 4G | 1核 |
slave2 | 172.19.131.1 | 4G | 1核 |
注意到,master是主节点,而slave顾名思义就是奴隶,天然就是为主节点工做的节点。实际上,在咱们这个集群中,master和slave并无那么明确的区分,由于事实上他们都在“努力地工做”。固然在搭建集群的时候,咱们依然要明确这个概念。linux
wget https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
复制代码
tar -zxvf jdk-8u201-linux-x64.tar.gz
复制代码
解压以后获得web
修改profileshell
vi /etc/profile
复制代码
添加以下apache
export JAVA_HOME=/usr/local/java1.8/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
复制代码
source使其生效浏览器
source /etc/profile
复制代码
查看是否生效bash
java -version
复制代码
看到如图内容表示已经成功。服务器
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
复制代码
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
复制代码
tar -zxvf zookeeper-3.4.13.tar.gz
复制代码
cd zookeeper-3.4.13/conf
复制代码
cp zoo_sample.cfg zoo.cfg
复制代码
dataDir=/home/hadoop/data/zkdata
dataLogDir=/home/hadoop/log/zklog
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
复制代码
export ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.4.13
export PATH=$PATH:$ZOOKEEPER_HOME/bin
复制代码
source /etc/profile
复制代码
dataDir=/home/hadoop/data/zkdata
复制代码
cd /home/hadoop/data/zkdata/
echo 3 > myid
复制代码
echo 1 > myid
复制代码
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
复制代码
zkServer.sh start
复制代码
zkServer.sh status
复制代码
以上操做三台虚拟机都要进行!只有echo 不同
以上操做三台虚拟机都要进行!只有echo 不同
以上操做三台虚拟机都要进行!只有echo 不同
复制代码
这里面的Mode是不同的,这是zookeeper的选举机制,至于该机制如何运行,这里按下不表。后续会有专门说明。 至此,zookeeper集群已经搭建完成
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
复制代码
解压出一个hadoop-2.7.7目录
tar -zxvf hadoop-2.7.7
复制代码
修改profile
vi /etc/profile
复制代码
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
复制代码
source /etc/profile
复制代码
hadoop version
复制代码
进入hadoop-2.7.7/etc/hadoop中
编辑core-site.xml
vi core-site.xml
复制代码
<configuration>
<!-- 指定hdfs的nameservice为myha01 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://myha01/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- hadoop连接zookeeper的超时时长设置 -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
<description>ms</description>
</property>
</configuration>
复制代码
cp mapred-site.xml.template mapred-site.xml
复制代码
vi mapred-site.xml
复制代码
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 指定mapreduce jobhistory地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 任务历史服务器的web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
复制代码
vi hdfs-site.xml
复制代码
<configuration>
<!-- 指定副本数 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- 配置namenode和datanode的工做目录-数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/data</value>
</property>
<!-- 启用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--指定hdfs的nameservice为myha01,须要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]为在nameservice中的每个NameNode设置惟一标示符。
配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为全部的NameNode。
例如,若是使用"myha01"做为nameservice ID,而且使用"nn1"和"nn2"做为NameNodes标示符
-->
<property>
<name>dfs.nameservices</name>
<value>myha01</value>
</property>
<!-- myha01下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.myha01</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通讯地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn1</name>
<value>master:9000</value>
</property>
复制代码
vi yarn-site.xml
复制代码
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave2</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
复制代码
master
slave1
slave2
复制代码
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
复制代码
接着就能够启动hadoop
首先在三个节点上启动journalnode,切记三个节点都要操做
hadoop-daemon.sh start journalnode
复制代码
其中QuorumPeerMain是zookeeper,JournalNode则是我启动的内容
接着对主节点的namenode进行格式化
hadoop namenode -format
复制代码
注意标红色方框的地方
完成格式化后查看/home/hadoop/data/hadoopdata目录下的内容
cd..
scp -r hadoopdata/ root@slave1:hadoopdata/
复制代码
接着就能够启动hadoop
start-dfs.sh
复制代码
start-yarn.sh
复制代码
master
slave1
slave2
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
复制代码
wget http://mirrors.shu.edu.cn/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
复制代码
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz
复制代码
cd spark-2.4.0-bin-hadoop2.7/conf
复制代码
cp spark-env.sh.template spark-env.sh
复制代码
编辑spark-env.sh
vi spark-env.sh
复制代码
export JAVA_HOME=/usr/local/java1.8/jdk1.8.0_201
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.7
export HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.7.7/etc/hadoop
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master:2181,slave1:2181,slave2:2181 -Dspark.deploy.zookeeper.dir=/spark"
export SPARK_WORKER_MEMORY=300m
export SPARK_WORKER_CORES=1
复制代码
其中java的环境变量、hadoop环境变量请从系统环境变量中拷贝,后面SPARK_WORKER_MEMORY是spark运行的内存,SPARK_WORKER_CORES是spark使用的CPU核数
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
以上操做三台虚拟机如出一辙!
复制代码
vi /etc/profile
复制代码
export SPARK_HOME=/usr/local/spark/spark-2.4.0-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
复制代码
cp slaves.template slaves
复制代码
source /etc/profile
复制代码
vi slaves
复制代码
master
slave1
slave2
复制代码
最后咱们启动spark,注意即使配置了spark的环境变量,因为start-all.sh和hadoop的start-all.sh冲突,所以咱们必须进入到spark的启动目录下,才能执行启动全部的操做。
进入启动目录
cd spark-2.4.0-bin-hadoop2.7/sbin
复制代码
./start-all.sh
复制代码
执行完成后,用jps查看三个节点下的状态
master:
注意到三个节点都有了spark的worker进程,只有master当中有Master进程。
访问master:8080
至此咱们就拥有了正式的spark环境。
六、尝试使用
因为咱们已经配置了环境变量,故能够输入spark-shell直接开始。
spark-shell
复制代码
这里咱们就进入了spark-shell.
而后进行编码
val lise = List(1,2,3,4,5)
val data = sc.parallelize(lise)
data.foreach(println)
复制代码
或者咱们进入spark-python
pyspark
复制代码
查看sparkContext