作为数据工程师,我日常用的主力语言是R,HiveQL,Java与Scala。R是非常适合做数据清洗的脚本语言,并且有非常好用的服务端IDE——RStudio Server;而用户日志主要储存在hive中,因此用HiveQL写job也是日常工作之一;当然R的执行效率确实不靠谱,因此还需要Java(Elasticsearch,Hadoop的原生语言)与Scala(Spark的原生语言)的帮助。

R和python一样也是一个很好的胶水语言,在搜索引擎的实战中,我就是用R来完成了ES集群索引的全量/增量更新操作。既然是一瓶胶水,你很难不希望它粘合上越来越多的东西。对于一个有处女座倾向的双鱼座,因为RHive的安装和配置太复杂而一直没法把R和Hive粘合起来是我长期以来的苦恼。最近要用Spark的Mlib做文本分类工作于是开始重新鼓捣Spark,没想到歪打正着地发现用Spark的R语言api可以操作Hive,搞通之后真是感到Awesome as fuck!

一、编译安装带有hive与R的Spark

官网上预编译好的spark都是不带hive支持的,因此只能自己从源码重新编译(在这里要感谢spark老司机同事的指点)。

# 从官网下载源码包
wget http://mirrors.hust.edu.cn/apache/spark/spark-1.6.1/spark-1.6.1.tgz # 解压
tar zxvf spark-1.6.1.tgz # 为编译R的支持做准备
spark-1.6.1/R/install-dev.sh # 编译安装带有hive与R的spark
spark-1.6.1/make-distribution.sh --name hadoop2.5 --skip-java-test --tgz -Psparkr -Pyarn -Dhadoop.version=2.5.0 -Dscala-2.10.4 -Phive -Phive-thriftserver # 把编译好的包解压到自己习惯的目录(参考elasticsearch放在/usr/share/目录下)
tar zxvf spark-1.6.1/spark-1.6.1-bin-hadoop2.5.tgz
mvspark-1.6.1/spark-1.6.1-bin-hadoop2.5 /usr/share/

二、环境配置

环境配置可以直接参考之前的文章 CentOS 6.7 hadoop free版本Spark 1.6安装与使用 ,此外要添加一下spark-defaults.conf这个配置文件,以使得hive能够被顺利连接上:

# vim $SPARK_HOME/conf/spark-defaults.conf

spark.eventLog.dir=hdfs://n1:8020/user/spark/applicationHistory2
spark.eventLog.enabled=true
spark.yarn.jar=hdfs://n1:8020/user/spark/share/lib/spark-assembly-1.6.1-hadoop2.5.0.jar
spark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/lib/hadoop/lib/native
spark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.3.0-1.cdh5.3.0.p0.30/lib/hadoop/lib/native # 注:需要把$SPARK_HOME/lib/spark-assembly-1.6.1-hadoop2.5.0.jar这个文件放到hdfs相应的目录下

好吧,这一步也是完全按照同事之前的经验整理的,还没有深入研究到底是如何生效的,但重要的是先用起来……

三、读写hive实例

直接上代码:

Sys.setenv(SPARK_HOME = "/usr/share/spark-1.6.1-bin-hadoop2.5", HADOOP_CONF_DIR="/opt/cloudera/parcels/CDH/lib/hadoop/etc/hadoop")
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"))) sc <- sparkR.init(master = "yarn-client", appName = "test")
hiveContext <- sparkRHive.init(sc) # 读取数据
results <- sql(hiveContext, "select * from dd_b_ec_e46_clickmodel where dt=20150601")
head(results) # 写入数据(首先用R将数据写到硬盘上然后进行装载)
sql(hiveContext, "CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
sql(hiveContext, "LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")

这里需要注意的是:如果运行R的用户不是hdfs管理员用户的话要自己处理一下权限问题,具体问题具体google……

总结

大致看了一遍Spark R api后,还是略感失望的,因为发现Spark当前对R的支持主要就是集中在dataframe部分,连最基本的map和reduce操作都没有,看来也只是把R当成数据清洗的工具了。不知不觉中砸了两周的时间在Spark上,接下俩得抖擞精神做一下业务需求了,然后就是硬刚Scala和Mlib!

通过 Spark R 操作 Hive的更多相关文章

  1. spark2.3.0 配置spark sql 操作hive

    spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...

  2. spark+hcatalog操作hive表及其数据

    package iie.hadoop.hcatalog.spark; import iie.udps.common.hcatalog.SerHCatInputFormat; import iie.ud ...

  3. Spark SQL 操作Hive 数据

    Spark 2.0以前版本:val sparkConf = new SparkConf().setAppName("soyo")    val spark = new SparkC ...

  4. Spark SQL with Hive

    前一篇文章是Spark SQL的入门篇Spark SQL初探,介绍了一些基础知识和API,可是离我们的日常使用还似乎差了一步之遥. 终结Shark的利用有2个: 1.和Spark程序的集成有诸多限制 ...

  5. Hive on Spark和Spark sql on Hive,你能分的清楚么

    摘要:结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序. 本文分享自华为云社区<Hive on Spark和Spark sql o ...

  6. 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户

    1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...

  7. Spark之 使用SparkSql操作Hive的Scala程序实现

    依赖 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2 ...

  8. Spark 操作Hive 流程

    1.ubuntu 装mysql 2.进入mysql: 3.mysql>create database hive (这个将来是存 你在Hive中建的数据库以及表的信息的(也就是元数据))mysql ...

  9. spark 操作hive

    1.hive动态分区,只需进行以下设置 val spark = SparkSession.builder() .appName("hivetest") .master(" ...

随机推荐

  1. CSS边框闪烁呼吸样式

    <html> <body> <head> .arrow_box{animation: glow 800ms ease-out infinite alternate; ...

  2. IOS 集成支付宝和邮件发送

    列表中自找 :http://blog.csdn.net/sing_sing?viewmode=contents

  3. jQuery学习笔记(jquery.validate插件)

    jquery.validate官网地址:http://jqueryvalidation.org/ 1. 导入JavaScript库 <script src="../js/jquery. ...

  4. bit,Byte,Word,DWORD(DOUBLE WORD,DW)

    1个二进制位称为1个bit,8个二进制位称为1个Byte,也就是1个字节(8位),2个字节就是1个Word(1个字,16位),则DWORD(DOUBLE WORD)就是双字的意思,两个字(4个字节/3 ...

  5. mydqldump 备份数单库 然后还原数据的时候报:ERROR 1881 (HY000) at line 52: Operation not allowed when innodb_forced_recovery > 0.

    修改my.cnf innodb_force_recovery = 1 修改为: innodb_force_recovery = 0

  6. (原创)用c++11打造类似于python的range

    python中的range函数表示一个连续的有序序列,range使用起来很方便,因为在定义时就隐含了初始化过程,因为只需要给begin()和end()或者仅仅一个end(),就能表示一个连续的序列.还 ...

  7. 每日英语:Three Shows That Changed The Way Networks Think About Viewership

    As we continue examining this season’s DVR success stories in The Blacklist and Sleepy Hollow it mak ...

  8. 【消息】linux之消息队列

      1.机制 消息队列的运行方式与命名管道非常相似. 欲与其他进程通信的进程只需要将消息发送到消息队列中,目的进程就从消息队列中读取需要的消息. 2.源码 1)发送方 //msg_send.c #in ...

  9. Windows删除/修改注册表权限不足的解决方法

    在注册表的某些关键项(譬如:System.Root),连Administrator都没有权限进行修改,因为只有“system”有权限. [警告]切勿企图进行注册表上层权限覆盖低层权限的方式来使Admi ...

  10. 如何在一张ppt中插入多张图片并能依次播放

    我们在做ppt的过程中,有时遇到在一张ppt中插入多张图片还想让其能依次播放的情况,针对上述情况我们可以根据下列步骤进行设置.(新手必看) 1.首先,用鼠标点击桌面Microsoft  PowerPo ...