pyspark访问hive数据实战

2023-11-06

之前我们部门在数据分析这边每天的日报都是直接使用hive脚本进行调用,随着APP用户行为和日志数据量的逐渐累积,跑每天的脚本运行需要花的时间越来越长,虽然进行了sql优化,但是上spark已经提上日程。

直接进行spark开发需要去学习scala,为了降低数据分析师的学习成本,决定前期先试用sparkSQL,能够让计算引擎无缝从MR切换到spark,现在主要使用pyspark访问hive数据。

以下是安装配置过程中的详细步骤:

1.安装spark

需要先安装JDK和scala,这不必多说,由于现有hadoop集群版本是采用的2.6.3,所以spark版本是下载的稳定版本spark-1.4.0-bin-hadoop2.6.tgz

我是先在一台机器上完成了Spark的部署,Master和Slave都在一台机器上。注意要配置免秘钥ssh登陆。

1.1 环境变量配置

export JAVA_HOME=/usr/jdk1.8.0_73
export HADOOP_HOME=/usr/hadoop
export HADOOP_CONF_DIR=/usr/hadoop/etc/hadoop
export SCALA_HOME=/usr/local/scala-2.11.7
export SPARK_HOME=/home/hadoop/spark_folder/spark-1.4.0-bin-hadoop2.6
export SPARK_MASTER_IP=127.0.0.1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8099
 
export SPARK_WORKER_CORES=3     //每个Worker使用的CPU核数
export SPARK_WORKER_INSTANCES=1   //每个Slave中启动几个Worker实例
export SPARK_WORKER_MEMORY=10G    //每个Worker使用多大的内存
export SPARK_WORKER_WEBUI_PORT=8081 //Worker的WebUI端口号
export SPARK_EXECUTOR_CORES=1       //每个Executor使用使用的核数
export SPARK_EXECUTOR_MEMORY=1G     //每个Executor使用的内存

export HIVE_HOME=/home/hadoop/hive
export SPARK_CLASSPATH=$HIVE_HOME/lib/mysql-connector-java-5.1.31-bin.jar:$SPARK_CLASSPATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HADOOP_HOME/lib/native

1.2 配置slaves

cp slaves.template slaves
vi slaves 添加以下内容:localhost

1.3 启动master和slave

cd $SPARK_HOME/sbin/
./start-master.sh

启动日志位于 $SPARK_HOME/logs/目录,访问 http://localhost:8099,即可看到Spark的WebUI界面

执行 ./bin/spark-shell,打开Scala到Spark的连接窗口   

 

2.SparkSQL与Hive的整合

1. 拷贝$HIVE_HOME/conf/hive-site.xml和hive-log4j.properties到 $SPARK_HOME/conf/
2. 在$SPARK_HOME/conf/目录中,修改spark-env.sh,添加
export HIVE_HOME=/home/hadoop/hive
export SPARK_CLASSPATH=$HIVE_HOME/lib/mysql-connector-java-5.1.31-bin.jar:$SPARK_CLASSPATH
3. 另外也可以设置一下Spark的log4j配置文件,使得屏幕中不打印额外的INFO信息(如果不想受干扰可设置为更高):
log4j.rootCategory=WARN, console

4.进入$SPARK_HOME/bin,执行 ./spark-sql –master spark://127.0.0.1:7077 进入spark-sql CLI:

[hadoop@hadoop spark]$ bin/spark-sql --help  
Usage: ./bin/spark-sql [options] [cli option]  
CLI options:  
 -d,--define <keykey=value>          Variable subsitution to apply to hive  
                                  commands. e.g. -d A=B or --define A=B  
    --database <databasename>     Specify the database to use  
 -e <quoted-query-string>         SQL from command line  
 -f <filename>                    SQL from files  
 -h <hostname>                    connecting to Hive Server on remote host  
    --hiveconf <propertyproperty=value>   Use value for given property  
    --hivevar <keykey=value>         Variable subsitution to apply to hive  
                                  commands. e.g. --hivevar A=B  
 -i <filename>                    Initialization SQL file  
 -p <port>                        connecting to Hive Server on port number  
 -S,--silent                      Silent mode in interactive shell  
 -v,--verbose                     Verbose mode (echo executed SQL to the  
                                  console)  

 需要注意的是CLI不是使用JDBC连接,所以不能连接到ThriftServer;但可以配置conf/hive-site.xml连接到hive的metastore,然后对hive数据进行查询。下面我们接着说如何在python中连接hive数据表查询。

 

3.配置pyspark和示例代码

3.1 配置pyspark

打开/etc/profile:

        #PythonPath 将Spark中的pySpark模块增加的Python环境中

         export PYTHONPATH=/opt/spark-hadoop/python

        source /etc/profile  

执行./bin/pyspark ,打开Python到Spark的连接窗口,确认没有报错。

打开命令行窗口,输入python,Python版本为2.7.6,如图所示,注意Spark暂时不支持Python3。输入import pyspark不报错,证明开发前工作已经完成。

3.2 启动ThriftServer

启动ThriftServer,使之运行在spark集群中:

sbin/start-thriftserver.sh --master spark://localhost:7077 --executor-memory 5g  

ThriftServer可以连接多个JDBC/ODBC客户端,并相互之间可以共享数据。

 

3.3 请求示例

查看spark官方文档说明,spark1.4和2.0对于sparksql调用hive数据的API变化并不大。都是用sparkContext 。

120317_UDTv_1583436.png

from pyspark import SparkConf, SparkContext
from pyspark.sql import HiveContext

conf = (SparkConf()
         .setMaster("spark://127.0.0.1:7077")
         .setAppName("My app")
         .set("spark.executor.memory", "1g"))
sc = SparkContext(conf = conf)
sqlContext = HiveContext(sc)
my_dataframe = sqlContext.sql("Select count(1) from logs.fmnews_dim_where")
my_dataframe.show()

返回结果:

114404_r2rN_1583436.png

运行以后在webUI界面看到job运行详情。

114233_vcNm_1583436.png

 

4.性能比较

截取了接近一个月的用户行为数据,数据大小为2G,总共接近1600w条记录。

 

为了测试不同sql需求情况下的结果,我们选取了日常运行的2类sql:

1.统计数据条数:

select count(1) from fmnews_user_log2;

2.统计用户行为:

SELECT device_id, min_time FROM
        (SELECT device_id,min(import_time) min_time FROM fmnews_user_log2
            GROUP BY device_id)a
        WHERE from_unixtime(int(substr(min_time,0,10)),'yyyy-MM-dd') = '2017-03-02';

3. 用户行为分析:

select case when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '06:00' and '07:59' then 1
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '08:00' and '09:59' then 2
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '10:00' and '11:59' then 3
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '12:00' and '13:59' then 4
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '14:00' and '15:59' then 5
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '16:00' and '17:59' then 6
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '18:00' and '19:59' then 7
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '20:00' and '21:59' then 8
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '22:00' and '23:59' then 9
            else 0 end fmnews_time_type, count(distinct device_id) device_count,count(1) click_count
       from fmcm.fmnews_user_log2
     where from_unixtime(int(substr(import_time,0,10)),'yyyy-MM-dd') = '2017-03-02'
    group by case when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '06:00' and '07:59' then 1
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '08:00' and '09:59' then 2
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '10:00' and '11:59' then 3
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '12:00' and '13:59' then 4
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '14:00' and '15:59' then 5
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '16:00' and '17:59' then 6
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '18:00' and '19:59' then 7
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '20:00' and '21:59' then 8
            when from_unixtime(int(substr(fmnews_time,0,10)),'HH:mm') between '22:00' and '23:59' then 9
            else 0 end;

第一条sql的执行结果对比:hive 35.013 seconds

174723_z9Wm_1583436.png

第一条sql的执行结果对比:sparksql 1.218 seconds

174855_GbJE_1583436.png

 

第二条sql的执行结果对比:hive 78.101 seconds

173955_upzd_1583436.png

第二条sql的执行结果对比:sparksql 8.669 seconds

174214_8imh_1583436.png
 

第三条sql的执行结果对比:hive 101.228 seconds

153015_1DIh_1583436.png

第三条sql的执行结果对比:sparksql 14.221 seconds

151832_NdWe_1583436.png

可以看到,虽然没有官网吹破天的100倍性能提升,但是根据sql的复杂度来看10~30倍的效率还是可以达到的。

不过这里要注意到2个影响因子:

1. 我们数据集并没有采取全量,在数据量达到TB级别两者的差距应该会有所减小。同时sql也没有针对hive做优化。

2. spark暂时是单机(内存足够)并没有搭建集群,hive使用的hadoop集群有4台datanode。

 

 

参考内容:

http://lxw1234.com/archives/2015/06/281.htm

http://spark.apache.org/docs/1.4.0/api/python/pyspark.sql.html

http://blog.csdn.net/book_mmicky/article/details/39152727

http://stackoverflow.com/questions/36051091/query-hive-table-in-pyspark

http://kevin12.iteye.com/blog/2290821

https://my.oschina.net/zhgk/blog/417596

转载于:https://my.oschina.net/aibati2008/blog/855416

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pyspark访问hive数据实战 的相关文章

随机推荐

  • 【现代谜题】晚上有四个人要过桥,只有一个手电筒,每次过桥都需要手电筒,每次最多可同时过两个人,其中甲过桥要1分钟,乙要2分钟,丙要5分钟,丁要10分钟。求最短的过桥时间。

    文章目录 题目 一 思路 方法一 方法二 二 代码 测试数据 题目 晚上有四个人要过桥 只有一个手电筒 每次过桥都需要手电筒 每次最多可同时过两个人 其中甲过桥要1分钟 乙要2分钟 丙要5分钟 丁要10分钟 求最短的过桥时间 一 思路 首先
  • R语言基本数据结构

    R语言系列文章目录 文章目录 R语言系列文章目录 前言 一 向量 二 矩阵 三 数组 四 列表 五 数据框 前言 一篇技术博客的写作不可能面面俱到 那这就意味着必须抛弃一些内容 在R语言的书里对于R的基础知识的讲解很容易找到 因此 这一R语
  • qt文件操作

    第一步 手动获取文件路径 include
  • 动态代理简单实现

    动态代理简单实现 文章目录 动态代理简单实现 一 反射 二 反射机制提供的功能 1 相关API 2 Class类的理解 4 创建类的对象的方式 5 Class实例可以是那些结构的说明 三 类的加载过程 四 动态代理 反射的动态性 一 反射的
  • LeetCode:设计循环队列

    题目链接 622 设计循环队列 力扣 Leetcode https leetcode cn problems design circular queue 还是老套路二话不说 先上代码 typedef struct int front int
  • win11下经典jdk8的安装与环境变量的配置(一看就懂,超级详细!!!)

    1 安装jdk8 由于Oracle官网需要注册账号才能下载 不想注册的同学们可以直接通过下面的地址下载 因为新的jdk版本变化不是很大 所以初学者用1 8版本就足够啦 链接 https pan baidu com s 1HjoXGTlaPw
  • 函数栈帧的创建和销毁

    全文目录 前言 寄存器 main函数的调用 调用main函数的函数 main函数的栈帧如何开辟的 push 保存调用方的 ebp move 维护新开栈帧的栈底 sub 维护新开栈帧的栈顶 三连 push 添加栈帧的信息的变量 lea 存放栈
  • spring中的quartz调度问题

    1 SchedulerFactoryBean会自动启动 当在spring文件中定义了多个SchedulerFactoryBean实例时 一定要小心 因为这些ScheduleFactoryBean自从load进程序里 就会自动启动 如果要手动
  • Grafana

    一 Grafana 数据可视化 1 下载各种环境以及版本地址 https grafana com grafana download platform windows 2 windows下的安装并运行 https www jianshu co
  • Leetcode2488-统计中位数为 K 的子数组

    数组中的元素只有三种 等于k的 大于k 小于k的 首先找到k在数组中的位置p 分别统计p左侧和右侧的每个位置有多少个元素大于或小于k 假设向左开始记录 首先记c 0 遇到大于k的元素则c 否则c 表示这个位置到p之间净有c个元素大于k 同理
  • 科学计算库Numpy

    一 创建Numpy数组 创建一个一维数组 data1 np array 1 2 4 创建一个二维数组 data2 np array 1 2 3 4 5 6 1 2 3 创造元素值都是0的数组 np zeros 3 4 创建元素值全是1的数组
  • ai作文批改_好未来:AI智能批改中英文作文为老师“减负”

    开篇诗词点题 结尾升华主题 非常赞 细节上 人物描写方法多样 人物的性格特点描绘细致 整体上 内容凸显文章主题 语言新颖清爽 读来令人如沐春风 这是一份语文作文的批改反馈 不过 这份生动详细的批改反馈并不普通 它是利用好未来自主研发的 中英
  • vue动态渲染ref,获取this.$refs.xxx.style为undefined获取循环元素中的style

    正常情况下通过this refs xxx style获取是没问题的 本文遇到的是要获取循环列表中某一元素 并改变其样式 设置ref在v for列表上 直接获取this r e f s n a
  • antd4.x 使用setfieldsvalue动态修改表单值

    表单的默认值可以用 Form 里的 initialValues 来设置 但是 initialValues 不能被 setState 动态更新 因此需要用 setFieldsValue 来更新 1 创建ref实例 创建ref实例 export
  • 技术支持岗位面试问题汇总,绝对有你遇到的面试题!!

    交换机与路由器的区别 1 路由器能拨号 交换机不能 2 无线路由器能使无线设备WIFI上网 交换机不行 3 外形上 从外形上我们区分两者 交换机通常端口比较多看起来比较笨重 而路由器的端口就少得多体积也小得多 4 工作层次不同 最初的交换机
  • 2019最新计算机毕业设计-题目汇总大全-系列1

    课设题目 备注 基于NLP ASR及TTS技术的智能语音分析工具 负责语义分析部分 论文替代 基于SpringBoot的用户音乐平台 家装设计公司客户关系系统 基于机器学习的文本语义分析工具 基于微信小程序的私教预约系统 标准化轮胎仓库管理
  • (转)读源码品Caffe - 结构流程篇

    原文链接 https blog csdn net jinzhuojun article details 79834697 背景 本文主要介绍深度学习框架Caffe的工作原理和实现 时至今日 各种深度学习框架百花齐放 百家争鸣 从流行程度来说
  • R软件的rattle安装指南

    rattle安装问题 1 正常安装情况 2 无法正常安装情况 2 1版本号不对应 2 2网络不稳定 2 3文字乱码问题 1 正常安装情况 这是先基于R4 0 0 这个在3 6的版本都成功过 看到有人说4 0 0不能安装 因此特地去安装尝试下
  • maven环境变量配置(超详细!)

    下载地址 官网地址 建议不要下载在C盘 配置过程 1 解压下载好的压缩包 2 此电脑 右键 属性 高级系统设置 环境变量 3 新建一个系统变量 点击系统变量的新建 变量名 MAVEN HOME 变量值 maven解压的目录 通过浏览目录选择
  • pyspark访问hive数据实战

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 之前我们部门在数据分析这边每天的日报都是直接使用hive脚本进行调用 随着APP用户行为和日志数据量的逐渐累积 跑每天的脚本运行需要花的时间越来越长 虽然进行了sql优化