pyspark从hive导出数据到clickhouse

需求

从hive导出数据到clickhouse 大概有两百个字段,两千多万数据,30G左右

实现

采用pyspark导入,先上代码

#_*_ coding=UTF-8 _*_
import os
import sys
from pyspark.sql import SparkSession


def sparksession_read_hive():  # .master("local[*]")
    spark = SparkSession.builder.appName('bi_pharaoh_mkt_lead_detail_to_clickhouse')\
        .enableHiveSupport().getOrCreate()
    hive_df = spark.sql("""select  
    place_type 
                ,sub_place_type 
                
    from  dm.test where pt = 20220314
    """)

    print(hive_df.show())
    print('sparkcontext_read_hive读取完毕,开始准备写入')
    properties = {'driver': 'ru.yandex.clickhouse.ClickHouseDriver',
                  "socket_timeout": "300000",
                  "rewriteBatchedStatements": "true",
                  "batchsize": "1000000",
                  "numPartitions": "8",
                  'user': 'user',
                  'password': 'pass',
                  'isolationLevel': 'NONE'
                  }

    hive_df.write.jdbc(url='jdbc:clickhouse://{url}:8123/analysis',
                       table='test_table', mode='append', properties=properties)
    print('sparksession_read_hive写入完成')
    spark.stop()


def spark_te():
    spark = SparkSession.builder.appName('clickhouse').getOrCreate()
    properties = {"driver": "ru.yandex.clickhouse.ClickHouseDriver",
                  "socket_timeout": "300000",
                  "rewriteBatchedStatements": "true",
                  "batchsize": "1000000",
                  "numPartitions": "8",
                  'user': 'user',
                  'password': 'pass'}
    df = spark.read.jdbc(url='jdbc:clickhouse://{url}:8123/analysis',
                         table='bi_pharaoh_mkt_lead_detail_da', properties=properties)
    # spark.read.jdbc(properties=properties)
    # print(spark.sql('select * from default.test'))
    print(df.show(10))


if __name__ == '__main__':
    sparksession_read_hive()
    # spark_te()

1 PySpark简介

Apache Spark是用Scala编程语言编写的。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,您也可以使用Python编程语言处理RDD。正是由于一个名为Py4j的库,他们才能实现这一目标。
这里不介绍PySpark的环境设置,主要介绍一些实例,以便快速上手。

2 PySpark - SparkContext

SparkContext是任何spark功能的入口点。当我们运行任何Spark应用程序时,会启动一个驱动程序,它具有main函数,并且此处启动了SparkContext。然后,驱动程序在工作节点上的执行程序内运行操作。

SparkContext使用Py4J启动JVM并创建JavaSparkContext。默认情况下,PySpark将SparkContext作为’sc’提供,因此创建新的SparkContext将不起作用。

3 PySpark - Sparksession

Sparksession是更上层的接口,是对sparkcontext和Spark的封装,目前官方推荐使用SparkSession作为入口,实际上SparkSession中包含了SparkContext中的大部分方法。

RDD和DataFrame是Spark中最常用的两种数据集合。Column和Row分别是DataFrame类型中的一列和一行。

RDD,弹性分布式数据集,集合内对象分布在不同的节点之上,可以并行执行操作,是spark应用程序的基本数据结构。RDD中的元素类型是非结构化的,可以是任意JVM对象。

DataFrame,类似于关系型数据库中的表,相比于RDD,其内部的每一条记录都是结构化的。一般而言,推荐优先使用这种数据结构,可以轻易的在其上使用sql类操作,与hive结合较好。

再详细解释下,上面sparksession_read_hive() 这个方法是写入的方法,spark_te()这个方法是读取clickhouse的方法。spark简单语法如下:
SparkSession是新版本推荐的入口api,所有的spark操作都需要SparkSession来执行,首先,创建一个入口类,(类似于python的实例化)
语法是这样的:SparkSession.builder 然后,有下面几个函数:

  • .master(): 设置运行模式,即:本地模式还是yarn模式
  • appName(): 顾名思义,设置名字
  • enableHiveSupport() :这是hive接口函数,如果想要查询hive的表就需要执行这个函数
  • getOrCreate(:这是最终的函数,创建或者获取。

然后如果是同一个数据库拿这个实例直接执行sql就可以了。如果是不同数据库那就需要像我这么写了,spark.write().jdbc()
spark目前好像是与hive和mysql接口集成,即如果读写hive和mysql是不需要jdbc的方式的,其他的都需要。jdbc有四个参数,url table。mode(‘append’,‘overwrite’,‘error’,等) ,properties (连接的配置 ,以字典形式传入,其中‘driver’项是驱动,是固定的,连value一起都是固定传入,其他参数可以酌情使用),
spark还有其他函数,这里就不一一介绍了。

再说说踩过的坑,一开始配置好环境,环境配置可以参考
在pycharm中安装spark环境
Hadoop安装教程 Mac版
这两个结合着看就行

坑点1:

报错在这里插入图片描述
py4j.protocol.Py4JJavaError: An error occurred while calling o75.jdbc.
java.lang.ClassNotFoundException:ru.yandex.clickhouse.ClickHouseDriver
没有clickhouse的驱动,去下载一个驱动,放进spark下的jars中解决。

坑点2:可以读取,不可写入

这里耽误了好久,因为觉得已经能够读取了,那就肯定不是驱动的事,一直在找语法上的错误,最后在网上查到缺少guava-28.0-jre.jar包
错误信息为:
java.lang.NoClassDefFoundError: com/google/common/escape/Escapers
or
NoClassDefFoundError: Could not initialize class ru.yandex.clickhouse.ClickHouseUtil
去下载一个放进 spark中的jar下,解决,但是要注意,3.1spark自带一个guava-14.0.jar,但自带的这个jar版本不够,必须放进去更高的版本。测试几次好像最低要guava-16.jar才行。另外,网上有人遇到放进spark的jars路径下无法解决,可以试试其他路径,参考链接:
Caused by: java.lang.NoClassDefFoundError: com/google/common/escape/Escapers

坑点3:不能overwrite

这个坑目前未解决,只要我用overwrite模式,就会报错,错误信息很粗略,改用append模式就能够成功写入,现在采取的方案是在执行spark程序之前先用clickhouse_driver 进行清空表的操作,然后使用append的模式写入。另外说一下,好像好多etl工具的overwrite模式好像都不怎么靠谱,动不动就报错。

最后,成功写入

补充:在pycharm中添加spark的环境变量:
和上面文档中提示添加的路径变量没有任何关系,重新梳理一下pycarm中的配置步骤。

1.

创建项目,指定python解释器的版本

2.

配置项目依赖,
在这里插入图片描述
py4j 将Python代码转换为Java代码的库
pyspark Python的Spark编程依赖库

选择Add Content Root,在弹出的文件选择框中,选择Spark安装目录中的python文件夹下的lib目录中的py4j和pyspark的依赖文件,点击OK,将这两个依赖加入到当前项目的依赖库中。

3.

点击右上角的程序配置,配置环境变量,添加SPARK_HOME值为SPARK安装包的解压路径,PYSAPRK_PYTHON指定PySpark的Python命令,注意python版本为3.6+。在这里插入图片描述

调用

spark-submit --master yarn --deploy-mode cluster --name dm_bi_pharaoh_mkt_lead_detail_a_test_task --queue analysis --conf spark.pyspark.python=python3 --driver-class-path /usr/lib/spark-current/driver-jars/ --num-executors 8 --executor-memory 4g --executor-cores 4 --driver-memory 4g --conf spark.sql.execution.arrow.enabled=true --conf spark.kryoserializer.buffer.max=2008 --conf spark.driver.extraClassPath=/usr/lib/spark-current/driver-jars/clickhouse-jdbc-0.2.4.jar --conf spark.executor.extraClassPath=/usr/lib/spark-current/driver-jars/clickhouse-jdbc-0.2.4.jar   /mnt/disk1/server/code/data-integration/script/huike/etl/core/dm/bi/bi_pharaoh_mkt_lead_detail_to_clickhouse.py

后续补充1

问题:要使用自定义模块,报错找不到模块
解决:在调用命令里添加 --py-files 参数,把自定义模块的文件(含路径)写在后面,如果有多个用英文逗号隔开。
问题:要读取配置文件,报错没有section
解决:实际错误是找不到配置文件, 没有section=空文件=没有文件。在调用命令里添加 --files 参数 把文件写在后面,如果有多个用英文逗号隔开。

注意:–py-files 文件后填写的模块在导入时不需要考虑路径的问题,直接from xxx import Xxxx , 在–files后写的文件使用时也不需要考虑路径,直接使用文件名即可

参考文档
将数据通过spark从hive导入到Clickhouse

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析职业是一个多金的职业,数据分析职位是一个金饭碗的职位,前景美好,但是要全面掌握大数据分析技术,非常困难,大部分学员的痛点是不能快速找到入门要点,精准快速上手。本课程采用项目驱动的方式,以Spark3和Clickhouse技术为突破口,带领学员快速入门Spark3+Clickhouse数据分析,促使学员成为一名高效且优秀的大数据分析人才。学员通过本课程的学习,不仅可以掌握使用Python3进行Spark3数据分析,还会掌握利用Scala/java进行Spark数据分析,多语言并进,力求全面掌握;另外通过项目驱动,掌握Spark框架的精髓,教导Spark源码查看的技巧;会学到Spark性能优化的核心要点,成为企业急缺的数据分析人才;更会通过ClickhouseSpark搭建OLAP引擎,使学员对大数据生态圈有一个更加全面的认识和能力的综合提升。真实的数据分析项目,学完即可拿来作为自己的项目经验,增加面试谈薪筹码。课程涉及内容:Ø  Spark内核原理(RDD、DataFrame、Dataset、Structed Stream、SparkML、SparkSQL)Ø  Spark离线数据分析(千万简历数据分析、雪花模型离线数仓构建)Ø  Spark特征处理及模型预测Ø  Spark实时数据分析(Structed Stream)原理及实战Ø  Spark+Hive构建离线数据仓库(数仓概念ODS/DWD/DWS/ADS)Ø  Clickhouse核心原理及实战Ø  Clickhouse engine详解Ø  SparkClickhouse导入简历数据,进行数据聚合分析Ø  catboost训练房价预测机器学习模型Ø  基于Clickhouse构建机器学习模型利用SQL进行房价预测Ø  Clickhouse集群监控,Nginx反向代理Grafana+Prometheus+Clickhouse+node_exporterØ  Spark性能优化Ø  Spark工程师面试宝典       课程组件:集群监控:福利:本课程凡是消费满359的学员,一律送出价值109元的实体书籍.
Hive是一个基于Hadoop的数据仓库基础设施,而ClickHouse则是俄罗斯搜索引擎Yandex开发的用于分布式数据分析的列式数据库管理系统。将Hive中的数据导出ClickHouse可以实现数据的高效查询和分析。 实现Hive数据导出ClickHouse的一种方法是通过Hive的外部表特性。首先,需要安装ClickHouse并创建相应的表结构以匹配Hive中的数据。然后,通过Hive创建外部表,指定ClickHouse表作为目标表。接下来,使用INSERT INTO语句将Hive中的数据导入到外部表,从而实现将Hive数据导出ClickHouse的目的。 具体步骤如下: 1. 在ClickHouse中创建目标表,以与Hive中的数据结构相匹配,包括数据类型、列名和约束等。 2. 在Hive中创建外部表,通过指定ClickHouse表的URL、用户名和密码等连接信息,将ClickHouse表作为目标表。 3. 使用INSERT INTO语句将Hive中的数据插入到外部表中,触发数据导出和传输过程。 在执行导出过程时,需要注意以下几点: 1. 需要确保HiveClickHouse之间的网络连接畅通。 2. 导出过程可能会消耗一定的时间和资源,特别是当数据量较大时,需要评估系统资源的使用情况。 3. 需要注意数据类型的兼容性,确保Hive中的数据类型与ClickHouse中的数据类型一致或能够进行转换。 4. 对于导出数据的频率和间隔,可以根据需求设置合适的调度策略,以定期或实时导出数据。 通过以上步骤和注意事项,可以实现将Hive中的数据导出ClickHouse,进而在ClickHouse中进行高效的数据查询和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值