• 背景:

接到任务,需要在一个一天数据量在460亿条记录的hive表中,筛选出某些host为特定的值时才解析该条记录的http_content中的经纬度:

解析规则譬如:

  1. 需要解析host: api.map.baidu.com
  2. 需要解析的规则:"result":{"location":{"lng":120.25088311933617,"lat":30.310684375444877},
  3. "confidence":25
  4. 需要解析http_conent:renderReverse&&renderReverse({"status":0,"result":{"location":{"lng":120.25088311933617,"lat":30.310684375444877},"formatted_address":"???????????????????????????????????????","business":"","addressComponent":{"country":"??????","country_code":0,"province":"?????????","city":"?????????","district":"?????????","adcode":"330104","street":"????????????","street_number":"","direction":"","distance":""},"pois":[{"addr":"????????????5277???","cp":" ","direction":"???","distance":"68","name":"????????????????????????????????????","poiType":"????????????","point":{"x":120.25084961536486,"y":30.3112150
  • Scala代码实现“访问hive,并保存结果到hive表”的spark任务:

开发工具为IDEA16,开发语言为scala,开发包有了spark对应集群版本下的很多个jar包,和对应集群版本下的很多个jar包,引入jar包:

scala代码:

  1. import java.sql.{Connection, DriverManager, PreparedStatement, Timestamp}
  2.  
  3. import org.apache.spark.SparkConf
  4. import org.apache.spark.SparkContext
  5. import org.apache.spark.sql.hive.HiveContext
  6. import java.util
  7. import java.util.{UUID, Calendar, Properties}
  8. import org.apache.spark.rdd.JdbcRDD
  9. import org.apache.spark.sql.{Row, SaveMode, SQLContext}
  10. import org.apache.spark.storage.StorageLevel
  11. import org.apache.spark.{sql, SparkContext, SparkConf}
  12. import org.apache.spark.sql.DataFrameHolder
  13.  
  14. /**
  15. * temp http_content
  16. **/
  17. case class Temp_Http_Content_ParserResult(success: String, lnglatType: String, longitude: String, Latitude: String, radius: String)
  18.  
  19. /**
  20. * Created by Administrator on 2016/11/15.
  21. */
  22. object ParserMain {
  23. def main(args: Array[String]): Unit = {
  24. val conf = new SparkConf()
  25. //.setAppName("XXX_ParserHttp").setMaster("local[1]").setMaster("spark://172.21.7.10:7077").setJars(List("xxx.jar"))
  26. //.set("spark.executor.memory", "10g")
  27. val sc = new SparkContext(conf)
  28. val hiveContext = new HiveContext(sc)
  29.  
  30. // use abc_hive_db;
  31. hiveContext.sql("use abc_hive_db")
  32. // error date format:2016-11-15,date format must be 20161115
  33. val rdd = hiveContext.sql("select host,http_content from default.http where hour>='20161115' and hour<'20161116'")
  34.  
  35. // toDF() method need this line...
  36. import hiveContext.implicits._
  37.  
  38. // (success, lnglatType, longitude, latitude, radius)
  39. val rdd2 = rdd.map(s => parse_http_context(s.getAs[String]("host"), s.getAs[String]("http_content"))).filter(s => s._1).map(s => Temp_Http_Content_ParserResult(s._1.toString(), s._2, s._3, s._4, s._5)).toDF()
  40. rdd2.registerTempTable("Temp_Http_Content_ParserResult_20161115")
  41. hiveContext.sql("create table Temp_Http_Content_ParserResult20161115 as select * from Temp_Http_Content_ParserResult_20161115")
  42.  
  43. sc.stop()
  44. }
  45.  
  46. /**
  47. * @ summary: 解析http_context字段信息
  48. * @ param http_context 参数信息
  49. * @ result 1:是否匹配成功;
  50. * @ result 2:匹配出的是什么经纬度的格式:
  51. * @ result 3:经度;
  52. * @ result 4:纬度,
  53. * @ result 5:radius
  54. **/
  55. def parse_http_context(host: String, http_context: String): (Boolean, String, String, String, String) = {
  56. if (host == null || http_context == null) {
  57. return (false, "", "", "", "")
  58. }
  59.  
  60. // val result2 = parse_http_context(“api.map.baidu.com”,"renderReverse&&renderReverse({\"status\":0,\"result\":{\"location\":{\"lng\":120.25088311933617,\"lat\":30.310684375444877},\"formatted_address\":\"???????????????????????????????????????\",\"business\":\"\",\"addressComponent\":{\"country\":\"??????\",\"country_code\":0,\"province\":\"?????????\",\"city\":\"?????????\",\"district\":\"?????????\",\"adcode\":\"330104\",\"street\":\"????????????\",\"street_number\":\"\",\"direction\":\"\",\"distance\":\"\"},\"pois\":[{\"addr\":\"????????????5277???\",\"cp\":\" \",\"direction\":\"???\",\"distance\":\"68\",\"name\":\"????????????????????????????????????\",\"poiType\":\"????????????\",\"point\":{\"x\":120.25084961536486,\"y\":30.3112150")
  61. // println(result2._1 + ":" + result2._2 + ":" + result2._3 + ":" + result2._4 + ":" + result2._5)
  62.  
  63. var success = false
  64. var lnglatType = ""
  65. var longitude = ""
  66. var latitude = ""
  67. var radius = ""
  68. var lowerCaseHost = host.toLowerCase().trim();
  69. val lowerCaseHttp_Content = http_context.toLowerCase()
  70. // api.map.baidu.com
  71. // "result":{"location":{"lng":120.25088311933617,"lat":30.310684375444877},
  72. // "confidence":25
  73. // --renderReverse&&renderReverse({"status":0,"result":{"location":{"lng":120.25088311933617,"lat":30.310684375444877},"formatted_address":"???????????????????????????????????????","business":"","addressComponent":{"country":"??????","country_code":0,"province":"?????????","city":"?????????","district":"?????????","adcode":"330104","street":"????????????","street_number":"","direction":"","distance":""},"pois":[{"addr":"????????????5277???","cp":" ","direction":"???","distance":"68","name":"????????????????????????????????????","poiType":"????????????","point":{"x":120.25084961536486,"y":30.3112150
  74. if (lowerCaseHost.equals("api.map.baidu.com")) {
  75. val indexLng = lowerCaseHttp_Content.indexOf("\"lng\"")
  76. val indexLat = lowerCaseHttp_Content.indexOf("\"lat\"")
  77. if (lowerCaseHttp_Content.indexOf("\"location\"") != -1 && indexLng != -1 && indexLat != -1) {
  78. var splitstr: String = "\\,|\\{|\\}"
  79. var uriItems: Array[String] = lowerCaseHttp_Content.split(splitstr)
  80. var tempItem: String = ""
  81. lnglatType = "BD"
  82. success = true
  83. for (uriItem <- uriItems) {
  84. tempItem = uriItem.trim()
  85. if (tempItem.startsWith("\"lng\":")) {
  86. longitude = tempItem.replace("\"lng\":", "").trim()
  87. } else if (tempItem.startsWith("\"lat\":")) {
  88. latitude = tempItem.replace("\"lat\":", "").trim()
  89. } else if (tempItem.startsWith("\"confidence\":")) {
  90. radius = tempItem.replace("\"confidence\":", "").trim()
  91. }
  92. }
  93. }
  94. }
  95. else if (lowerCaseHost.equals("loc.map.baidu.com")) {
  96. 。。。
  97. }
  98.  
  99. longitude = longitude.replace("\"", "")
  100. latitude = latitude.replace("\"", "")
  101. radius = radius.replace("\"", "")
  102.  
  103. (success, lnglatType, longitude, latitude, radius)
  104. }
  105. }

打包,注意应为我们使用的hadoop&hive&spark on yarn的集群,我们这里并不需要想spark&hadoop一样还需要在执行spark-submit时将spark-hadoop-xx.jar打包进来,也不需要在submit-spark脚本.sh中制定jars参数,yarn会自动诊断我们需要哪些集群系统包;但是,如果你应用的是第三方的包,比如ab.jar,那打包时可以打包进来,也可以在spark-submit 参数jars后边指定特定的包。

  • 写spark-submit提交脚本.sh:

  • 当执行spark-submit脚本出现错误时,怎么应对呢?

注意,我们这里不是spark而是spark on yarn,当我们使用yarn-cluster方式提交时,界面是看不到任何日志新的。我们需要借助yarn管理系统来查看日志:

1、根据返回的任务id查看历史日志:
  1. yarn logs -applicationId application_1475071482566_3329402

2、yarn页面查看日志

https://xx.xx.xx.xx:xxxxx/Yarn/ResourceManager/xxxx/cluster
用户名/密码:user/password
 
 
3、yarn关闭application:
从yarn resourcemanger界面中,可以查看到具体的applicationId,使用命令来杀掉该任务:
更多命令可以参考:http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YarnCommands.html
  1. yarn application -kill application_1475071482566_3807023

或者从界面进入spark作业进度管理界面,进行查看作业具体执行进度,也可以kill application

参考资料:
http://blog.csdn.net/sparkexpert/article/details/50964732

Spark On YARN内存分配:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool

Spark&Hive:如何使用scala开发spark访问hive作业,如何使用yarn resourcemanager。的更多相关文章

  1. 使用scala开发spark入门总结

    使用scala开发spark入门总结 一.spark简单介绍 关于spark的介绍网上有很多,可以自行百度和google,这里只做简单介绍.推荐简单介绍连接:http://blog.jobbole.c ...

  2. Spark之路 --- Windows Scala 开发环境安装配置

    JDK安装 JDK安装包下载 到Oracle官网下载JDK. 传送门 下载之前要记得勾选上同意协议然后选择相应的版本(Windows/Linux, 32/64) JDK安装及验证 按提示完成安装,安装 ...

  3. 【Spark】使用java语言开发spark程序

    目录 步骤 一.创建maven工程,导入jar包 二.开发代码 步骤 一.创建maven工程,导入jar包 <properties> <scala.version>2.11.8 ...

  4. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  5. pyinstaller打包python源程序访问hive

    1.需求 使用hvie server一段时间后,业务部门需要自己不定时的查询业务数据,之前这一块都是他们提需求我们来做,后来发现这样重复一样的工作放在我们这边做是在没有效率,遂提出给他们工具或者web ...

  6. SQL Standard Based Hive Authorization(基于SQL标准的Hive授权)

    说明:该文档翻译/整理于Hive官方文档https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authori ...

  7. Spark集群 + Akka + Kafka + Scala 开发(2) : 开发一个Spark应用

    前言 在Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境,我们已经部署好了一个Spark的开发环境. 本文的目标是写一个Spark应用,并可以在集群中测试. ...

  8. 利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...

  9. 使用spark访问hive错误记录

    在spark集群中执行./spark-shell时报以下错误: 18/07/23 10:02:39 WARN DataNucleus.Connection: BoneCP specified but ...

随机推荐

  1. mybatis注意事项

    1.如果用注解的方式加载配置CRUD查询的语句时,映射文件中的配置是: <mapper class="com.day03_mybaits.test3.UserMapper"/ ...

  2. python 线程之 threading(四)

    python 线程之 threading(三) http://www.cnblogs.com/someoneHan/p/6213100.html中对Event做了简单的介绍. 但是如果线程打算一遍一遍 ...

  3. Superslide插件无效的问题

    用Superslide像往常那样导入JQ和SuperSlide后,首页焦点图不会变,就像SuperSlide失效了一样,为什么??? 排查了一圈最后发现是JS导入顺序的问题,必须先导入JQ,再导入Su ...

  4. C语言 右左法则

    C指针声明解读之左右法则 C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法.不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定 ...

  5. CSS3 justify 文本两端对齐

    浏览器参照基准:Firefox4 and Later, Chrome5 and Later, Safari5 and Later, Opera10.53 and Later, IE5.5 and La ...

  6. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...

  7. Android入门(四):链接接口组件和程序代码

    编写好layout中的接口组件之后,下一步就是编写控制接口组件的程序代码.上一章,我们使用了三种接口组件,在使用者输入性别和年龄之后点击“健康建议按钮”,程序会读取用户所填入的性别和年龄,然后显示判断 ...

  8. Java WebService 简单实例

    前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作. 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 ...

  9. PHP的流程控制结构

    1.break 使用break语句可以将深埋在嵌套循环中的语句退出到指定层数或直接退出到最外层,break是接受一个可选的数字参数来决定跳出几重语句.break可以跳出几重语句.break可以跳出几重 ...

  10. Mac通过终端显示和隐藏 隐藏文件

    defaults write com.apple.finder AppleShowAllFiles -bool true; killall Finder //显示隐藏文件 defaults write ...