前言
最近在搞hadoop+spark+python,所以就搭建了一個本地的hadoop環境,基礎環境搭建地址hadoop2.7.7 分布式集群安裝與配置
本篇博客主要說明,如果搭建spark集群並集成到hadoop
安裝流程
安裝spark需要先安裝scala 注意在安裝過程中需要對應spark與scala版本, spark 也要跟hadoop對應版本,具體的可以在spark官網下載頁面查看
下載sacla並安裝
https://www.scala-lang.org/files/archive/scala-2.11.12.tgz tar zxf scala-2.11.12.tgz
移動並修改權限
chown hduser:hduser -R scala-2.11.11 mv /root/scala-2.11.11 /usr/local/scala
配置環境變量
vim .bashrc #scala var
export SCALA_HOME=/usr/local/scala export PATH=$PATH:$SCALA_HOME/bin
安裝完成可以通過scala進如交互頁面
注意事項
注意:Spark與hadoop版本必須互相匹配,因為Spark會讀取Hadoop HDFS 並且必須能在Hadoop YARN執行程序,所以必須要按照我們目前安裝的Hadoop版本來選擇 筆者這里用的是hadoop2.7.7 所以我選擇的是Pre-built for Apache Hadoop 2.7 and later
下載並安裝spark
http://mirror.bit.edu.cn/apache/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz tar zxf spark-2.3.3-bin-hadoop2.7.tgz
移動並修改權限
chown hduser:hduser spark-2.3.3-bin-hadoop2.7 mv spark-2.3.3-bin-hadoop2.7 /usr/local/spark
配置環境變量
vim .bashrc #spark var
export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin
進入spark交互頁面
默認是python2.7.x版本,對於當前來說版本比較老,可以修改pyspark來選擇其他版本(前提是當前服務器已安裝其他版本python)
修改master下的spark-env.sh #沒有這個文件可以cp spark-env.sh.template spark-env.sh
在最后一行添加如下 export PYSPARK_PYTHON=/usr/bin/python3 修改master下的spark bin目錄下pyspark 將文本中 PYSPARK_PYTHON=python 改為 PYSPARK_PYTHON=python3 #取消INFO信息打印
復制conf目錄下的log4j模本文件到log4j.properties 將文本中 log4j.rootCategory=INFO, console 改為 log4j.rootCategory=WARN, console
測試與效果圖
本地運行spark
pyspark --master local[4] spark 讀取本地文件,所有節點都必須存在該文件 textFile=sc.textFile("file:/usr/local/spark/README.md") spark 讀取hdfs文件 textFile2=sc.textFile("hdfs://hadoop-master-001:9000/wordcount/input/LICENSE.txt")
Hadoop YARN運行spark
HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop pyspark --master yarn --deploy-mode client textFile = sc.textFile("hdfs://hadoop-master-001:9000/wordcount/input/LICENSE.txt") textFile.count()
spark Standalone Cluster運行
編輯spark-env.sh #spark_home/conf export SPARK_MASTER=hadoop-master-001 //設置master的ip或域名 export SPARK_WORKER_CORES=1 //設置每個worker使用的CPU核心 export SPARK_WORKER_MEMORY=512m //設置每個worker使用的內存 export SPARK_WORKER_INSTANCES=4 //設置實例數
將master環境中的spark目錄打包並分別遠程傳輸到所有slave節點中.
設置spark Standalone Cluster 服務器(master環境) vim /usr/local/spark/conf/slaves 添加ip或域名 hadoop-data-001 hadoop-data-002 hadoop-data-003
啟動與關閉
/usr/local/spark/sbin/start-all.sh
/usr/local/spark/sbin/stop-all.sh
pyspark --master spark://hadoop-master-001:7077 --num-executors 1 --total-executor-cores 3 --executor-memory 512m textFile = sc.textFile("file:/usr/local/spark/README.md") textFile.count() 注意 當在cluster模式下,如yarn-client或spark standalone 讀取本地文件時,因為程序是分不到不同的服務器,所以必須確認所有機器都有該文件,否則會發生錯誤. 建議 最好在cluster讀取hdfs文件,這樣不會出現文件 text2=sc.textFile("hdfs://hadoop-master-001:9000/wordcount/input/LICENSE.txt") text2.count()
spark web ui
異常處理
hadoop yarn運行pyspark時異常信息: ERROR SparkContext: Error initializing SparkContext. org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master 解決方式 查看http://hadoop-master-001:8088/cluster/app/ 最新任務點擊history 查看信息 "Diagnostics: Container [pid=29708,containerID=container_1563435447194_0007_02_000001] is running beyond virtual memory limits. Current usage: 55.6 MB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container." 修改所有節點的yarn-site.xml,添加如下 <property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property> 主節點執行stop-yarn.sh, start-yarn.sh 重啟所有節點yarn