通过 Spark R 操作 Hive
作为数据工程师,我日常用的主力语言是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的更多相关文章
- spark2.3.0 配置spark sql 操作hive
spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...
- spark+hcatalog操作hive表及其数据
package iie.hadoop.hcatalog.spark; import iie.udps.common.hcatalog.SerHCatInputFormat; import iie.ud ...
- Spark SQL 操作Hive 数据
Spark 2.0以前版本:val sparkConf = new SparkConf().setAppName("soyo") val spark = new SparkC ...
- Spark SQL with Hive
前一篇文章是Spark SQL的入门篇Spark SQL初探,介绍了一些基础知识和API,可是离我们的日常使用还似乎差了一步之遥. 终结Shark的利用有2个: 1.和Spark程序的集成有诸多限制 ...
- Hive on Spark和Spark sql on Hive,你能分的清楚么
摘要:结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序. 本文分享自华为云社区<Hive on Spark和Spark sql o ...
- 大数据学习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 ...
- Spark之 使用SparkSql操作Hive的Scala程序实现
依赖 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-hive_2 ...
- Spark 操作Hive 流程
1.ubuntu 装mysql 2.进入mysql: 3.mysql>create database hive (这个将来是存 你在Hive中建的数据库以及表的信息的(也就是元数据))mysql ...
- spark 操作hive
1.hive动态分区,只需进行以下设置 val spark = SparkSession.builder() .appName("hivetest") .master(" ...
随机推荐
- Android build.gradle
apply plugin: 'com.android.application' android { /*编译版本 , 因此我们强烈推荐总是使用最新的 SDK 进行编译 targetSdkVersion ...
- 在c/c++中浮点数是否为0的判断
在c/c++中,因为浮点数在内存中的表示是不精确的,会有很微小的误差,所以判断是否为0,就看它的绝对值是不是<=eps. eps可以看成是epsilon的缩写,可以用来表示一个无穷小的量,通常取 ...
- SQL Server 的动态语句(SQLServer 的String.format用法)(SQLServer的调用SQL占位符的使用)
直接上代码好了: --建表语句if exists(select 1 from [你的测试数据库名字].sys.tables where name='TDepartment') BEGIN print ...
- 认识和使用Task
对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为tas ...
- ssh以密钥的方式登录服务器时,只要有密钥可以登服务器,如果有密钥和公钥同时存在(在公钥没问题的情况下可以),但如果公钥有问题,就不能登录成功
在~/.ssh/下如果只有密钥或公私同时存在时,都可以成功登录服务器,但!!!!!!如果公钥有换成别的服务器的公钥时,是无法登录远程的服务器!!!!
- 使用gm和imageMagick处理图片
第一步安装imageMagick和gm模块 1, cnpm install --save imageMagick gm 第二步在服务器上安装imageMagick,下载地址http://www.ima ...
- vim中权限不足时不用退出而强制保存
命令: :w !sudo tee % 此命令是把当前文件(即%)作为stdin传给sudo tee命令来执行.说起来挺绕口,其实就是:用sudo强制保存. 有时候在自己机器上折腾的时候需要更改一些 ...
- scp拷贝提示its a directory 错误
scp拷贝提示its a directory 错误 场景 使用scp的格式是 scp my_file user@ip:/home/directory 之前也一直这么用,没什么错误,莫名其妙 原因定位 ...
- Android.mk高级写法
转:http://blog.csdn.net/langresser_king/article/details/8275291 原本只是想记录一些常用的使用技巧,但是越写越得意(>_<),忍 ...
- AIX上打包排除某些文件/文件夹
Syntax X/Open Standards: tar {-c|-r|-t|-u|-x} [-B] [ -d ] [ -E ] [ -F ] [-h ] [ -i ] [ -l ] [ -m ] [ ...