PY => Ubuntu-Hadoop-YARN-HDFS-Hive-Spark安裝配置

環境條件

Java 8
Python 3.7
Scala 2.12.10
Spark 2.4.4
hadoop 2.7.7
hive 2.3.6
mysql 5.7
mysql-connector-java-5.1.48.jarhtml

R 3.1+(能夠不安裝)java

安裝Java

先驗傳送門:https://segmentfault.com/a/11...node

安裝Python

用Ubuntu自帶Python3.7python

安裝Scala

下載:https://downloads.lightbend.c...
解壓:mysql

tar -zxvf 下載好的Scala

配置:sql

vi ~/.bashrc
    export SCALA_HOME=/home/lin/spark/scala-2.12.10
    export PATH=${SCALA_HOME}/bin:$PATH
保存退出

激活配置:shell

source ~/.bashrc

安裝Hadoop

提早說明: 若不使用HDFS 和 YARN,整個 Hadoop安裝可忽略,能夠直接安裝spark。
下載:https://archive.apache.org/dist/hadoop/common/
詳細地址: https://archive.apache.org/di...
解壓:apache

tar -zxvf 下載好的 hadoop

配置hadoop:ubuntu

vi ~/.bashrc
    export HADOOP_HOME=/home/lin/hadoop/hadoop-2.7.7
    export PATH=${HADOOP_HOME}/bin:$PATH

激活配置:segmentfault

source ~/.bashrc

HDFS配置:

進入解壓後的 etc/hadoop (注意這不是根目錄的etc, 而是解壓後的hadoop目錄下的etc)

echo $JAVA_HOME        # 複製打印出的路徑

vi hadoop-env.sh:  (找到 export JAVA_HOME 這行,並替換爲以下)
    export JAVA_HOME=/home/lin/spark/jdk1.8.0_181  
    
vi core-site.xml:  (hdfs後面爲 主機名:端口號)  (主機名就是終端顯示的 @後面的~~~)
    <property>
      <name>fs.default.name</name>
      <value>hdfs://lin:8020</value>       
    </property>
    
vi hdfs-site.xml: (一樣在 <configuration> 之間加入) (/home/lin/hdfs是我已經有的目錄)
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>/home/lin/hdfs/dfs/name</value>
    </property>

    <property>
      <name>dfs.datanode.data.dir</name>
      <value>/home/lin/hdfs/dfs/data</value>
    </property>

格式化HDFS:

hadoop namenode -format
# 而後去剛纔上面配置的這個路徑裏面是否有新東西出現: /home/lin/hdfs

開啓HDFS (先進入 sbin目錄下, sbin 和 etc bin是同級的, 這裏說的都是hadoop裏的目錄):

./start-dfs.sh

# 一路yes, 若讓你輸入密碼, 則輸入對應服務器的密碼。(我這裏都是本機)
# 若提示權限錯誤,繼續往下看(支線)
    sudo passwd root              # 激活ubuntu的root用戶,並設置密碼
    vi /etc/ssh/sshd_config:
        PermitRootLogin yes       # 任意位置添加這個(此選項以前多是存在的註釋後再添加)
    service ssh restart

查看HDFS裏面根目錄 / 的內容:

hadoop fs -ls /

向HDFS裏面根目錄 / 中 傳入文件:

echo test > test.txt     # 首先,隨便創建一個文件

hadoop fs -put test.txt /     # 向HDFS裏面根目錄 / 中 傳入文件

hadoop fs -ls /          # 再次查看,就發現有 test.txt 文件了。

從HDFS裏面根目錄 / 中 讀取文件test.txt:

hadoop fs -text /test.txt

從Hadoop WebUI 中查看剛纔的文件是否存在:

http://192.168.0.108:50070/           # 50070是默認端口

點擊右側下拉框 "Utilities"  ->  "Browser the file system "
清晰可見, 咱們的test.txt 躺在那裏~

YARN配置

仍是etc/hadoop這個目錄:

cp mapred-site.xml.template mapred-site.xml

vi mapred-site.xml:
    <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
    </property>
    
vi yarn-site.xml:
    <property>
      <name>yarn.nodemanager.services</name>
      <value>mapreduce_shuffle</value>
    </property>

啓動 YARN: (仍是 sbin目錄下)

./start-yarn.sh

# 一樣,如有密碼,輸入機器的密碼便可

從Hadoop WebUI 中查看YARN:

http://192.168.0.108:8088/

安裝MySQL

下面要用MySQL, 因此單獨提一下MySQL 的 安裝與配置:
其實MySQL是不須要單獨說的, (但我裝的時候出現了和以往的不一樣經歷), 因此仍是說一下吧:

apt-get install mysql-server-5.7

安裝容易, 不一樣版本的MySQL配置有些雞肋 (我用的是 Ubuntu19):

vi /etc/mysql/mysql.conf.d/mysqld.cnf:
    bind-address     0.0.0.0               # 找到修改一下便可

修改密碼+遠程鏈接權限 (默認無密碼):

mysql                # 啥參數也不用加, 直接就能進去
use mysql
update mysql.user set authentication_string=password("123") where user="root";
update user set plugin="mysql_native_password";
flush privileges;

select host from user;
update user set host ='%' where user ='root';
flush privileges;

重啓服務:

systemctl restart mysql

服務端鏈接測試:

mysql -uroot -p
# 密碼 123

遠程鏈接測試 (Navicat):

成功

安裝Hive

下載: https://archive.apache.org/di...

解壓:

tar -zxvf apache-hive-2.3.6-bin.tar.gz

配置Hive:

vi ~/.bashrc
    export HIVE_HOME=/home/lin/hive/apache-hive-2.3.6-bin
    export PATH=${HIVE_HOME}/bin:$PATH

激活配置:

source ~/.bashrc

Hive其餘相關配置(同理進入hive解壓目錄的 conf目錄中):

cp hive-env.sh.template hive-env.sh
vi hive-env.sh:
    HADOOP_HOME=/home/lin/hadoop/hadoop-2.7.7

Hive-MySQL相關配置(同是在 conf目錄下):

vi hive-site.xml:  (特別注意後兩個 <property> 裏面的內容, 本身修改一下用戶名和密碼)
    <configuration>
        <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>root</value>
        </property>
        <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>123</value>
        </property>
    </configuration>

下載 jdbc-mysql驅動,並放入Hive中,操做以下 (由於咱們上面hive-site.xml 用的是mysql):

  1. 首先下載: http://central.maven.org/mave...
  2. 將此jar文件放入 hive的lib目錄中(和 conf同級):
  3. 將此jar文件再copy一份放入 spark的 jar目錄下(爲了後續jupyter直連MySQL(不經過Hive)使用)

初始化(先確保以前的HDFS和MySQL已經啓動):

schematool -dbType mysql -initSchema

# 注意事項1: 這個用命令初始化的 步驟是 Hive 2.+ 才須要作的
# 注意事項2: 初始化一次便可, 屢次初始化,會使得MySQL有重複的鍵. 報錯.

開啓 metastore 服務:

nohup hive --service metastore &

檢測是否初始化(去MySQL表中查看):

use hive
show tables;       
# 如有數據,則說明初始化成功

啓動hive:

hive

建庫, 建表測試 (注意,千萬不要用 user這種關鍵字看成表名等):

HIVE中輸入:  
    create database mydatabase;
    use mydatabase;
    create table person (name string);
    
MySQL中查看Hive表的相關信息: 
    select * from TBLS;                 # 查看全部表結構信息
    select * from COLUMNS_V2;           # 查看全部列的信息

向Hive導入文件:

vi hive_data.txt: (寫入以下兩行)
    tom catch jerry
    every one can learn AI
    
load data local inpath '/home/lin/data/hive_data.txt' into table person;

查詢:

select * from person;

PySpark客戶端配置鏈接代碼:

import findspark
findspark.init()

from pyspark.sql import SparkSession    

spark = SparkSession.builder\
    .appName("Spark Hive Example")\
    .master("local[*]")\
    .config("hive.metastore.uris", "thrift://localhost:9083")\
    .enableHiveSupport()\
    .getOrCreate()
    
spark.sql("use mydatabase").show()
spark.sql('show tables').show()

安裝Spark

下載:spark-2.4.4-bin-hadoop2.7.tgz
粗糙傳送門:https://spark.apache.org/downloads.html
詳細傳送門:http://ftp.riken.jp/net/apache/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz

解壓:

tar -zxvf 下載好的spark-bin-hadoop

配置spark:

vi ~/.bashrc
    export SPARK_HOME=home/lin/spark/spark-2.4.4-bin-hadoop2.7
    export PATH=${SPARK_HOME}/bin:$PATH

激活配置:

source ~/.bashrc

最後一步(Python環境可能出錯)

pyspark腳本默認調用的是 "python" 這個名, 而ubuntu默認只有"python" 和 "python3"。
因此咱們須要作以下軟鏈接,來使得能夠輸入python, 直接尋找python3.7命令(不要用alias)

ln -s /usr/bin/python3.7 /usr/bin/python

測試

服務端直接輸入命令:

pyspark

或遠程瀏覽器輸入:

http://192.xx.xx.xx:4040/jobs

遠程使用Jupyter鏈接

Jupyter Notebook 這種方式是代替 pyspark 的 console執行方式的。

安裝 Jupyter Notebook:

pip3 install jupyter   
# 若新環境,須要安pip:  apt-get install python3-pip

具體有兩種鏈接方式:
第一種: 配置環境變量(會與 pyspark 的 console 有衝突,這個不建議,略)
第二種: 使用第三方模塊 findspark

pip 安裝 findspark

pip install findspark                          (Linux服務端)

啓動 Jupyter Notebook 服務(--ip必須指定 0.0.0.0),(--allow-root若不加上可能會報錯)

jupyter notebook --allow-root --ip 0.0.0.0     (Linux服務端)

下面說的是Jupyter Notebook 客戶端(Windows10)
下面兩行代碼必須放在每一個py腳本的第一行

import findspark
findspark.init()

而後纔可正常寫其餘代碼

from pyspark import SparkConf, SparkContext

sc = SparkContext(
    master='local[*]',   # 下面會講這個參數
    appName='myPyspark', # 隨便起名
) 
# 這句話,就把 spark啓動起來了,而後才能夠經過瀏覽器訪問了。 4040
# 若是你 python魔法玩的6,那麼提到上下文,你應該會自動想到 with語句 (__enter__,__exit__)
# 不寫參數,本地運行,這樣也是能夠的,  sc = SparkContext() 

raw_data = [1,2,3]
rdd_data = sc.parallelize(raw_data)  # python列表類型 轉 spark的RDD
print(rdd_data)
raw_data = rdd_data.collect()        # spark的RDD 轉回到 python列表類型
print(raw_data)

sc.stop()    # 關閉spark, 同理,瀏覽器也就訪問不到了。

解釋 SparkContext 的 master參數:

  1. "local" : 表示只用一個線程,本地運行。
  2. "local[*]" : 表示用(cpu的個數)個線程,本地運行。
  3. "local[n]" : 表示用n個線程,本地運行。
  4. "spark://ip:host" : 連其餘集羣

回顧環境問題 並 解釋 "本地" 的概念:

  1. 在 Linux 中 安裝了 Spark全套環境。
  2. 在 Linux 中 安裝了 Jupyter, 並啓動了 Jupyter Notebook 服務。
  3. 在 Win10 中 遠程鏈接 Linux中的 "Jupyter Notebook"服務 寫業務代碼(至關於客戶端鏈接)

因此, 以前所說的 "本地", 這個詞歸根結底是相對於 Linux來講的,咱們寫代碼一直操做的是Linux。

一般使用spark-submit

首先:咱們本身編寫一個包含各類 pyspark-API 的 xx.py 腳本
若是:你用了我上面推薦的 Jupyter Notebook,你會發現文件是.ipynb格式,能夠輕鬆轉.py
image.png
最後提交py腳本:

spark-submit --master local[*] --name myspark /xx/xx/myspark.py

# 你會發現 --master 和 --name  就是上面咱們代碼中配置的選項,對號入座寫入便可。
# /xx/xx/myspark.py 就是 py腳本的絕對路徑。 餵給spark,讓他去執行。便可。

Standalone部署Spark

介紹:

Standalone部署須要同時啓動:
    master端
    slave 端 
按着下面配置,最後一條  ./start-all.sh 便可同時啓動。

查看 JAVA_HOME環境變量。

echo $JAVA_HOME 

# 記住結果,複製出來

進入conf目錄,作一些配置(conf和spark中的bin目錄同級):

cp spark-env.sh.template spark-env.sh
vi spark-env.sh:(裏面寫)
    JAVA_HOME=上面的結果 

cp slaves.template slaves
vi slaves: (localhost改爲本機機器名)
    lin

上面配置完畢後,進入sbin目錄(和上面的conf在一個目錄中)

./start-all.sh          # 啓動

# 若提示權限錯誤,繼續往下看(支線)
sudo passwd root              # 激活ubuntu的root用戶,並設置密碼
vi /etc/ssh/sshd_config:
    PermitRootLogin yes       # 任意位置添加這個(此選項以前多是存在的註釋後再添加)
service ssh restart

啓動沒報錯,會給你彈出一條絕對路徑的日誌文件 xxx

cat xxx         # 便可看見啓動狀態 ,各類日誌信息

其中有幾條信息:
    Successfully started service 'WorkerUI' on port 8082  (瀏覽器訪問 8082端口)
    Successfully registered with master spark://lin:7077  (代碼上下文訪問)
其中,有些信息可能未打印出來: 建議瀏覽器中:( 8080-8082 )端口均可以嘗試一下。

輸入命令,查看啓動狀態:

jps             # 若同時有 worker 和 master 說明啓動成功

測試:

pyspark --master spark://lin:7077

# WebUI 的 Worker端,就可看見有 一個Job被添加了進來

YARN部署Spark

配置:

echo $HADOOP_HOME 
    # 個人是 /home/lin/hadoop/hadoop-2.7.7
    
進入spark解壓包的路徑的 conf 目錄中:
vi spark-env.sh:   ( etc/hadoop前面就是剛纔 echo出來的,  etc/hadoop你們都是同樣的)
    HADOOP_CONF_DIR=/home/lin/hadoop/hadoop-2.7.7/etc/hadoop

啓動spark:

spark-submit --master yarn --name myspark  script/myspark.py
# 注意 --master 的值改爲了 yarn , 其餘不變。

或者你能夠:
     pyspark --master yarn     
看到啓動成功,說明配置成功

Spark歷史服務配置

痛點:有時咱們的spark上下文 stop後,WebUI就不可訪問了。
如有未完成,或者歷史信息, 也就看不到了。
這時咱們配置 history 服務就可在 context stop後,仍可查看 未完成job。

預新建一個HDFS目錄myhistory (根路徑下),下面用獲得:

hadoop fs -mkdir /myhistory

首先,進入 spark解壓包的 conf目錄下:

cp spark-defaults.conf.template spark-defaults.conf

vi spark-defaults.conf: (解開以下注釋, lin本機名稱, 放在HDFS的根路徑下的myhistory)
    spark.eventLog.enabled           true
    spark.eventLog.dir               hdfs://lin:8020/myhistory
    
vi spark-env.sh:  (咱們以前 把template 複製過一次,因此此次直接編輯便可)
    SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://lin:8020/myhistory"

啓動(進入 spark解壓包的 sbin目錄下):

./start-history-server.sh

# cat 輸入的信息(日誌文件)。 便可查看是否啓動成功
# WebUI默認是 :http://192.168.0.108:18080/

測試:

瀏覽器中訪問History WebUI: http://192.168.0.108:18080/
發現啥也沒有: 這是正常的,由於咱們還沒運行 spark context主程序腳本。
---------------------------------------------------------------------
運行spark-context主程序腳本:
spark-submit script/myspark.py
    # 這個腳本是隨便寫的,沒什麼意義。 不過裏面有個咱們經常使用的一個注意事項!!!
    # 個人這個腳本的 context 用完,被我 stop了
    # 因此咱們訪問不到它的運行狀態的 Spark Context 的 WebUI
    
    # 可是咱們剛纔辛辛苦苦配置Spark history 服務,並啓動了它。
    # 因此 context的信息,被寫入了咱們剛纔配置的 Spark history 中
    # 因此 咱們再次訪問 Spark history WebUI 便可看到有內容被寫入進來。
---------------------------------------------------------------------
再次訪問History WebUI: http://192.168.0.108:18080/
你就會發現,裏面有內容了(spark history服務已經爲咱們幹活了)~~~~

免密碼登陸

環境Ubuntu(CentOS應該也可,不多用)
免密碼登陸設置:

cd ~
ssh-keygen -t rsa -P ""
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys

注意幾種狀況:

你若是是root用戶,那麼你須要切換到 /root/ 執行上面的命令
若是是普通用戶, 那麼你須要切換到 /home/xxx/ 執行上面的命令

這個要特別注意一下,有時候用 sudo -s ,路徑是沒有自動切換的。
須要咱們本身手動切換一下 "家" 路徑

自定義腳本啓動服務

下面內容僅供我的方便, shell不熟,用py腳本了, 你隨意。
vi start.py: (此腳本用於啓動上面配置的 HDFS,YARN,SparkHistory 和 Jupyter Notebook)

import os
import subprocess as sub

###### 啓動  HDFS + YARN ###############
hadoop_path = os.environ['HADOOP_HOME']
hadoop_sbin = os.path.join(hadoop_path, 'sbin')

os.chdir(hadoop_sbin)
sub.run('./start-dfs.sh')
sub.run('./start-yarn.sh')

###### 啓動 SparkHistory ##############
spark_path = os.environ['SPARK_HOME']
spark_sbin = os.path.join(spark_path, 'sbin')
os.chdir(spark_sbin)
sub.run('./start-history-server.sh')

###### 啓動  Jupyter Notebook ###############
# home_path = os.environ['HOME']
home_path = '/home/lin'

os.chdir(home_path)
sub.run('jupyter notebook --allow-root --ip 0.0.0.0'.split())

以後每次重啓,就不用進入每一個目錄去啓動了。直接一條命令:

sudo python start.py
nohup hive --service metastore &

查看本腳本啓動相關的WebUI:

HDFS:            http://192.168.0.108:50070/
YARN:            http://192.168.0.108:8088/
SparkHistory:    http://192.168.0.108:18080/

另附其餘 WebUI:

spark:           http://192.168.0.108:4040/

standalone啓動指定的端口(若是你使用的 standalone方式,而不是local,可能用到以下端口):

pyspark --master spark://lin:7077
相關文章
相關標籤/搜索