Spark local模式連線叢集hdfs、hive
Spark提供了local、standalone、on yarn等多種執行模式,但為了保持開發環境與實際執行環境的一致性,通常都是在本地編寫程式碼,然後編譯並上傳jar包到Spark叢集除錯執行。 但是面對複雜的處理邏輯,或遇到效能問題要修改程式碼時,開發人員將不得不多次進行修改、編譯、上傳jar。無休止地重複十分耗費精力,嚴重影響開發效率。
Local模式背後的思考
Spark local模式是框架提供的一種使用執行緒模擬多個程序協調工作的模式,方便我們在IDE中直接run程式。但是預設情況下該模式所使用的本地檔案系統、本地hive的庫,都與應用真實的執行環境不一致。因此要想使用local模式的快速開發測試,必須先配置local模式使用叢集中的公共資源。
如何配置(windows)
叢集環境:hadoop2.7.4、Spark2.1.1 需要軟體:winutils.zip 開發工具:IDEA
-
配置本地HADOOP_HOME 解壓hadoop-2.7.4.tar.gz到D:\hadoop\hadoop-2.7.4 解壓 winutils.zip 軟體 至 D:\hadoop\hadoop-2.7.4\bin 配置環境變數:HADOOP_HOMED:\hadoop\hadoop-2.7.4 新增 path :%HADOOP_HOME%\bin;
-
拷貝叢集配置檔案 叢集檔案:core-site.xml、hdfs-site.xml、hive-site.xml 將叢集檔案拷貝到工程中的 resources 資料夾
-
配置本地DNS解析 目的是讓本地環境能夠解析出上述配置檔案中的域名
-
配置叢集環境中的HDFS的許可權使用者 預設情況下使用windows本地使用者去讀寫hdfs,很顯然是沒有許可權的。 使用如下方式就可解決:
System.setProperty("HADOOP_USER_NAME", "hdfs") 複製程式碼
- 執行測試程式碼 在IDEA中直接執行如下程式碼進行測試:
def main(args: Array[String]): Unit = { // 設定日誌級別 Logger.getLogger("org").setLevel(Level.INFO) // 如果在windows本地跑,需要從widnows訪問HDFS,需要指定一個合法的身份 System.setProperty("HADOOP_USER_NAME", "hdfs") val spark = SparkSession.builder() .appName("App") .master("local") // local .config("HADOOP_USER_NAME","root") // 該種方式不生效 .enableHiveSupport() .getOrCreate() val sc = spark.sparkContext // 匯入spark的隱式轉換 import spark.implicits._ // 匯入spark sql的functions import org.apache.spark.sql.functions._ spark.sql("show tables").show() sc.stop() spark.stop() } 複製程式碼