spark集成外部hive(轉載)

接下來作的操做是:(這個操做,將程序打成jar包到集羣中運行)
(1)編寫spark程序在線上的hive中建立表並導入數據
(2)查詢hive中的數據
(3)將查詢結果保存到MySQL中
代碼:python

object SparkSqlTest {
    def main(args: Array[String]): Unit = { //屏蔽多餘的日誌 Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN) Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.project-spark").setLevel(Level.WARN) //構建編程入口 val conf: SparkConf = new SparkConf() conf.setAppName("SparkSqlTest") val spark: SparkSession = SparkSession.builder().config(conf) .enableHiveSupport() //這句話表示支持hive .getOrCreate() //建立sqlcontext對象 val sqlContext: SQLContext = spark.sqlContext //建立sparkContext val sc: SparkContext = spark.sparkContext //建立數據庫 var sql= """ |create database if not exists `test` """.stripMargin spark.sql(sql) //使用當前建立的數據庫 sql= """ |use `test` """.stripMargin spark.sql(sql) //建立hive表 sql= """ |create table if not exists `test`.`teacher_basic`( |name string, |age int, |married boolean, |children int |) row format delimited |fields terminated by ',' """.stripMargin spark.sql(sql) //加載數據 sql= """ |load data local inpath 'file:///home/hadoop/teacher_info.txt' |into table `test`.`teacher_basic` """.stripMargin spark.sql(sql) //執行查詢操做 sql= """ |select * from `test`.`teacher_basic` """.stripMargin val hiveDF=spark.sql(sql) val url="jdbc:mysql://localhost:3306/test" val table_name="teacher_basic" val pro=new Properties() pro.put("password","123456") pro.put("user","root") hiveDF.write.mode(SaveMode.Append).jdbc(url,table_name,pro) } }

打jar包到集羣中運行:https://blog.51cto.com/14048416/2337760mysql

做業提交shell:sql

spark-submit \
--class com.zy.sql.SparkSqlTest \ --master yarn \ --deploy-mode cluster \ --driver-memory 512M \ --executor-memory 512M \ --total-executor-cores 1 \ file:////home/hadoop/SparkSqlTest-1.0-SNAPSHOT.jar \

而後滿懷期待的等待着success,不幸的是,當程序運行到一半的時候異常終止了:
我查看了一下打印的日誌:
sparkSQL來完成對Hive的操做
我上網查了好多資料,都說是hive的版本太高,what? I‘not why!!
而後想了想,我在集羣中,使用spark的程序,去在hive表中進行操做,那麼是否是spark須要和hive整合一下啊,而後我又上網查了spark如何整合hive,總的來講就是將hive的元數據庫共享出去,讓spark能夠訪問。
具體操做
①在hive的hive-site.xml加入:shell

<property> <name>hive.metastore.uris</name> <value>thrift://hadoop01:9083</value> #在哪裏啓動這個進程 </property>

②在相應的節點上啓動在hive-site.xml中配置的進程數據庫

nohup hive --service metastore 1>/home/hadoop/logs/hive_thriftserver.log 2>&1 &

ps:這裏須要注意一下,nohup是後臺啓動的,並且全部的信息都是定向輸出的,這條命令使用以後,必定要檢查一下這個命令是否真的執行成功了:
使用:jsp查一下是否有相應的進程啓動,若是沒有表示啓動失敗,確定是 /home/hadoop/logs這個父目錄沒有建立,而後建立這個目錄以後,在啓動,在檢查是否啓動成功!!!!!!!
③將hive-site.xml複製到$SPARK_HOME/conf下(注意是每個節點都要複製)
④測試是否成功:spark-sql,若是正確進入而且能夠訪問hive的表,表示spark整合hive成功!!!apache


以後我有將原來的程序,從新跑了一次,結果 沒有報錯,程序運行成功!!!
我不敢相信,我又查看了一下MySQL的表:
sparkSQL來完成對Hive的操做
確認 程序成功!!!!!!編程

 

原文路徑:https://blog.51cto.com/14048416/2339270ruby

相關文章
相關標籤/搜索