1. 程式人生 > >Spark之路:(一)Scala + Spark + Hadoop環境搭建

Spark之路:(一)Scala + Spark + Hadoop環境搭建

一、Spark 介紹

Spark是基於記憶體計算的大資料分散式計算框架。Spark基於記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者將Spark部署在大量廉價硬體之上,形成叢集。

  • 1.提供分散式計算功能,將分散式儲存的資料讀入,同時將任務分發到各個節點進行計算;
  • 2.基於記憶體計算,將磁碟資料讀入記憶體,將計算的中間結果儲存在記憶體,這樣可以很好的進行迭代運算;
  • 3.支援高容錯;
  • 4.提供多計算正規化;

1、Spark與Hadoop關係

  • Spark是一個計算框架。
  • Hadoop是包含計算框架MapReducehe分散式檔案系統HDFS。
  • Spark是MapReduce的替代方案,而且相容HDFS、Hive等分散式儲存系統,可融入Hadoop生態。

2、Spark與Scala關係

  • Spark是用Scala開發的,因為計算資料,Scala它是函數語言程式設計,它實現演算法非常簡潔優雅。
  • Scala即有面向物件組織專案工程的能力,又有計算資料的功能。

3、Scala與Java的關係:

  • 它們都是基於JVM的,但Scala可以呼叫Java的任何功能,比如Spark執行在Hadoop上,它可以呼叫Hadoop上的一切功能。
  • 你可以認為Scala它是一個升級版的Java,因為Scala它本身是一門支援面向物件的語言,在Scala中,一切皆物件,它是一門純面向物件的語言,同時Scala也是面向物件以及函式式結合的語言。

4、大資料的開發語言是Scala,原因如下:

  • 大資料的本身是計算資料,而Scala即有面向物件組織專案工程的能力,又有計算資料的功能。
  • 現在大資料事實上的計算標準框架Spark,它是用Scala開發的,因為計算資料,Scala它是函數語言程式設計,它實現演算法非常簡潔優雅。
  • 例:kafka,它是一個訊息中介軟體,如果外部資料要流進大資料中心,我們一般都要用kafka作介面卡,那如果大資料中心的資料流到外部,也是用kafka(如Spark計算的資料要交給HBASE或MySql,期間我們都會用kafka),很多的大資料元件都是用的Scala編寫的,SO,如果你想成為一個頂級的大資料開發高手,你一定要掌握Scala。

二、環境搭建

Mac 下 Hadoop + Spark + Scala

1、安裝前必備

  • 作業系統:Mac OS X
  • JDK:1.8.0_151
  • 命令終端:~/.bash_profile下新增
  • 軟體包管理工具:brew(能夠方便的安裝和解除安裝軟體,使用brew cash還可以安裝圖形化的軟體,類似於Ubuntu下的apt-get以及前端裡的npm)

2、安裝配置Hadoop

2.1、配置ssh

配置ssh就是為了能夠實現免密登入,這樣方便遠端管理Hadoop並無需登入密碼在Hadoop叢集上共享檔案資源。
如果你的機子沒有配置ssh的話,在命令終端輸入ssh localhost是需要輸入你的電腦登入密碼的。配置好ssh後,就無需輸入密碼了。
第一步就是在終端執行ssh-keygen -t rsa,之後一路enter鍵,當然如果你之前已經執行過這樣的語句,那過程中會提示是否要覆蓋原有的key,輸入y即可。
第二步執行語句cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys用於授權你的公鑰到本地可以無需密碼實現登入。
理論上這時候,你在終端輸入ssh lcoalhost就能夠免密登入了。

Q & A

1、mac無法ssh localhost
解決方案:

  • 編輯/etc/sshd_config檔案,註釋掉
    #ForceCommand /usr/local/bin/ssh_session
  • 啟動sshd服務:
    sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
  • 停止sshd服務:
    sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
  • 檢視是否啟動:
    sudo launchctl list | grep ssh
  • 如果看到下面的輸出表示成功啟動了:
    - 0 com.openssh.sshd
  • 最後ssh localhost 成功

2、許可權問題
問題報錯:
permission denied 顯然這是許可權問題,我直接為ssh目錄賦予777、740和700都無效,還是報同樣的錯。
解決方案:
設定authorized_keys許可權——chmod 600 authorized_keys
設定.ssh目錄許可權——chmod 700 -R .ssh
參考資料給出的解釋是:檔案和目錄的許可權千萬別設定成chmod 777.這個許可權太大了,不安全,數字簽名也不支援–!。

2.2、安裝Hadoop

  • 安裝命令,brew install hadoop
  • 安裝路徑,/usr/local/Cellar/hadoop/2.8.2

2.3、修改hadoop-env.sh

  • 進入安裝目錄如下,找到並開啟hadoop-env.sh檔案,
    /usr/local/Cellar/hadoop/2.8.2/libexec/etc/hadoop
  • 註釋如下程式碼
    # export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

  • 並在後面新增如下程式碼,JAVA_HOME為本機jdk版本
    export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="

    export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home"

2.4、配置hdfs地址和埠

  • 進入目錄/usr/local/Cellar/hadoop/2.8.2/libexec/etc/hadoop,
  • 開啟core-site.xml將<configuration></configuration>替換為
      <property>
     <name>hadoop.tmp.dir</name>
<value>/usr/local/Cellar/hadoop/hdfs/tmp</value>
    <description>A base for other temporary directories.</description>
  </property>
  <property>
     <name>fs.default.name</name>
     <value>hdfs://localhost:8020</value>
  </property>
</configuration>

2.5、配置mapreduce中jobtracker的地址和埠

  • 進入目錄/usr/local/Cellar/hadoop/2.8.2/libexec/etc/hadoop,
  • 在相同的目錄下,你可以看到一個mapred-site.xml.template首先將檔案重新命名為mapred-site.xml,
  • 同樣將<configuration></configuration>替換為
<configuration>
      <property>
        <name>mapred.job.tracker</name>
        <value>localhost:8021</value>
      </property>
</configuration>

2.6、修改hdfs備份數

相同目錄下,開啟hdfs-site.xml加上

<configuration>
   <property>
     <name>dfs.replication</name>
     <value>1</value>
    </property>
</configuration>

2.7、格式化HDFS

這個操作相當於一個檔案系統的初始化,執行命令hdfs namenode -format
在終端最終會顯示成功
hdfs namenode -format.jpeg

2.8、環境變數配置

  • 執行編輯命令,sudo vim ~/.profile
  • add如下程式碼:
    #hadoop
    export HADOOP_HOME=/usr/local/Cellar/hadoop/2.8.2
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

  • 使之生效,source ~/.profile

2.9、檢查hadoop

  • hadoop version
shiqingdeMacBook-Air:local shiqingwang$ hadoop version
Hadoop 2.8.2
Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 66c47f2a01ad9637879e95f80c41f798373828fb
Compiled by jdu on 2017-10-19T20:39Z
Compiled with protoc 2.5.0
From source with checksum dce55e5afe30c210816b39b631a53b1d
This command was run using /usr/local/Cellar/hadoop/2.8.2/libexec/share/hadoop/common/hadoop-common-2.8.2.jar

2.10、 啟動關閉Hadoop服務

  • 啟動/關閉HDSF服務
    start-dfs.sh
    stop-dfs.sh
  • 啟動成功後,我們在瀏覽器中輸入http://localhost:50070可以看到
    start-dfs.png

  • 啟動/關閉YARN服務
    start-yarn.sh
    stop-yarn.sh

  • 啟動/關閉Hadoop服務(等效上面兩個)
    start-all.sh
    stop-all.sh

  • 啟動成功後,我們在瀏覽器中輸入http://localhost:8088可以看到
    start-all.png

3、安裝配置Spark

3.1、下載路徑:http://spark.apache.org/downloads.html

3.2、選擇版本:spark-2.2.1-bin-hadoop2.7

3.3、環境變數

  • 執行編輯命令,sudo vim ~/.profile
  • add如下程式碼:
    #spark
    export SPARK_HOME=/usr/local/spark
    export PATH=$PATH:$SPARK_HOME/bin
  • 配置生效,source ~/.profile

3.4、檢查版本

  • 命令:spark-shell
    spark-shell.png

4、安裝配置Scala

Scala 是一門多正規化(multi-paradigm)的程式語言,設計初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。
Scala 執行在Java虛擬機器上,併兼容現有的Java程式。
Scala 原始碼被編譯成Java位元組碼,所以它可以運行於JVM之上,並可以呼叫現有的Java類庫。

4.1、安裝命令,brew install scala

4.、檢查版本,scala -version

Scala code runner version 2.12.4 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
scala> println("Hello, world!")
Hello, world!
scala> :q

4.3、環境變數

  • 執行編輯命令,sudo vim ~/.profile
  • add如下程式碼:
    #scala
    export SCALA_HOME=/usr/local/scala
    export PATH=$PATH:$SCALA_HOME/bin
  • 配置生效,source ~/.profile

Scala + Spark + Hadoop環境配置,終,終,終於大功告成!!!

附錄

完整的環境變數配置檔案如下

cat ./profile

#scala
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin

#hadoop
export HADOOP_HOME=/usr/local/Cellar/hadoop/2.8.2
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

#spark
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin

相關網址推薦: