如咱們所知,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