PySpark写入数据到Hbase的辛酸经历

Python3读取kafka消息写入HBASE kafka消息格式为(None,[json串])利用Python有以下2种方式实现sparkstreaming将kafka消息的往HBASE写入1、使用spark的方法直接将RDD往HBASE写:2、取出RDD数据往HBASE写:#!/usr/bin/env python3 from pyspark import SparkConf, SparkContext from pyspark.stre... 阅读详情

Pyspark + Hbase

环境配置:
Python:3.7.4
Spark:2.4.4
Hbase:2.2.3


前言:
首先,本人建议使用scala来做有关spark的开发,这是和前辈讨论他们给的建议,或者你们可以参考一下这篇文章.
这个真的折磨了我好久(中途还接到需求,断断续续弄了好久,多久就不告诉你们了,免得你们笑我菜),真的辛酸。里面我的做法肯定有很多漏洞,而且还没完全解决,我会持续更新。另外,各位大神,如果友好的建议,评论区提点一下,万分感谢。
另外,本篇可能会有点长,不喜勿喷。。。。


数据格式:
一天一个压缩包(ZIP),然后里面都是很多个TXT文件,分隔符是 “|” ,每个TXT文件大概是9000条数据这样。


前言

我不知道大家有没有这种感觉,反正我是有,就是随着版本的迭代升级,大数据的组件对Python越来越不友好,学习java和scala对于大数据开发来说真的很重要。对于我这种只会python的菜鸡还真的是刺激。。。
使用spark写入hbase有两个方法,一个是使用hortonworks的开源框架shc,另一个是使用RDD自带的方法saveAsNewAPIHadoopDataset存入到hbase中。

hortonworks的开源框架shc

先说说这个。
首先你需要下载个shc的依赖包shc-core-1.1.1-2.1-s_2.11.jar:spark hbase connect.
版本的选择自己判断把,这个链接往前翻能找到其他版本。
如果你想自行编译这个包,也可以,从这里找到源码下载自己打包:github源码网址.
我已经忘记我怎么找到的了,应该是这一个没错。
代码:

from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

conf = SparkConf()
config = (("spark.executor.memory", "8g"),
          ("spark.executor.cores", "4"))
conf.setAll(config)
spark = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate()

def read_txt(sc):
    # input = sc.textFile("file:///home/data/demodata").map(lambda x: x.split('|'))
    # a_rdd = sc.textFile("file:///home/data/20200302").map(lambda x: x.split('|'))
    # df = input.toDF()
    df = spark.read.csv("file:///home/data/demodata", sep="|")
    return df

def write_to_hbase1(df):

    rename_df = df. \
        withColumnRenamed("_1", "PLA_INFO").\
        withColumnRenamed("_2", "DATE_TIME").\
        withColumnRenamed("_3", "KKJ").\
        withColumnRenamed("_4", "KKW").\
        withColumnRenamed("_5", "SPEED").\
        withColumnRenamed("_6", "SPEED_EX").\
        withColumnRenamed("_7", "ALTITUDE").\
        withColumnRenamed("_8", "STATUS").\
        withColumnRenamed("_9", "COLOUR").\
        withColumnRenamed("_10", "MILEAGE").\
        withColumnRenamed("_11", "WAY")

    id_df = rename_df.withColumn("V_ID", monotonically_increasing_id())
    id_df = id_df.withColumn("V_ID", id_df.V_ID.cast(StringType()))

    dep = "org.apache.spark.sql.execution.datasources.hbase"
    # 创建schema
    catalog = """{
                  "table":{"namespace":"default", "name":"test", "tableCoder":"PrimitiveType"},
                  "rowkey":"key",
                  "columns":{
                           "V_ID":{"cf":"rowkey", "col":"key", "type":"string"},
                           "PLATE":{"cf":"car_info", "col":"PLA_INFO", "type":"string"},
                           "DATE_TIME":{"cf":"car_info", "col":"DATE_TIME", "type":"int"},
                           "KKJD":{"cf":"car_info", "col":"KKJ","type":"int"},
                           "KKWD":{"cf":"car_info", "col":"KKW","type":"string"},
                           "SPEED":{"cf":"car_info", "col":"SPEED", "type":"string"},
                           "SPEED_EX":{"cf":"car_info", "col":"SPEED_EX","type":"string"},
                           "ALTITUDE":{"cf":"car_info", "col":"ALTITUDE","type":"string"},
                           "STATUS":{"cf":"car_info", "col":"STATUS","type":"string"},
                           "COLOUR":{"cf":"car_info", "col":"COLOUR","type":"string"},
                           "MILEAGE":{"cf":"car_info", "col":"MILEAGE","type":"string"},
                           "WAY":{"cf":"car_info", "col":"WAY","type":"string"}
                             }
                } """

    id_df.write.options(catalog=catalog).format(dep).save()
    print('***************************************************************')
    print('*******************        写 入 成 功       ******************')
    print('***************************************************************')

def main():
    sc = spark.sparkContext

    df = read_txt(sc)
    write_to_hbase1(df)
    sc.stop()
if __name__ == '__main__':
    main()

然后报错了。。。。
在这里插入图片描述
给个文字版吧,主要是这一句:

java.lang.NoSuchMethodError: org.json4s.jackson.JsonMethods$.parse(Lorg/json4s/JsonInput;Z)Lorg/json4s/JsonAST$JValue;

简单来说就是在保存的时候,发生了jar包冲突的错,冲突的是org.json4s.jackson.JsonMethods对应的是spark里的json4s-core_2.11-3.5.3.jar。
我用上面的网址下载源码,下载的对用的包,pom里只引用了一个包,应该是引用里面又引用了json4s这个包,我在包里搜索了一下还真的有。。我就不截图了,其实也就是说把这个包去掉重新编译就行了。于是乎,我让我同事帮忙在pom里加了个忽略json4s包的代码(因为没成功,我就删了,没能贴出来),但是打包的时候一堆错误,所以我放弃了。
网上遇到我上面这个错的都是建议把shc jar包里的剔除了再重新编译就可以了,建议大家试试,应该是可以成功的。

saveAsNewAPIHadoopDataset

这个我直接上代码吧。
代码:

from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *

conf = SparkConf()
config = (("spark.executor.memory", "8g"),
          ("spark.executor.cores", "4"))
conf.setAll(config)
spark = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate()

def read_txt(sc):
    # input = sc.textFile("file:///home/data/demodata").map(lambda x: x.split('|'))
    # a_rdd = sc.textFile("file:///home/data/20200302").map(lambda x: x.split('|'))
    # df = input.toDF()
    df = spark.read.csv("file:///home/data/demodata", sep="|")
    return df
    
def write_to_hbase2(df):
    """
    将Spark DataFrame 数据写入Hbase
    """
    rename_df = df. \
        withColumnRenamed("_1", "PLA_INFO").\
        withColumnRenamed("_2", "DATE_TIME").\
        withColumnRenamed("_3", "KKJ").\
        withColumnRenamed("_4", "KKW").\
        withColumnRenamed("_5", "SPEED").\
        withColumnRenamed("_6", "SPEED_EX").\
        withColumnRenamed("_7", "ALTITUDE").\
        withColumnRenamed("_8", "STATUS").\
        withColumnRenamed("_9", "COLOUR").\
        withColumnRenamed("_10", "MILEAGE").\
        withColumnRenamed("_11", "WAY")

    id_df = rename_df.withColumn("V_ID", monotonically_increasing_id())
    id_df = id_df.withColumn("V_ID", id_df.V_ID.cast(StringType()))
    host = "192.168.0.111"
    table = "test"
    keyConv = "org.apache.spark.examples.pythonconverters.StringToImmutableBytesWritableConverter"
    valueConv = "org.apache.spark.examples.pythonconverters.StringListToPutConverter"
    conf = {"hbase.zookeeper.quorum": host, "hbase.mapred.outputtable": table,
            "zookeeper.znode.parent": "/hbase-unsecure",
            "mapreduce.outputformat.class": "org.apache.hadoop.hbase.mapreduce.TableOutputFormat",
            "mapreduce.job.output.key.class": "org.apache.hadoop.hbase.io.ImmutableBytesWritable",
            "mapreduce.job.output.value.class": "org.apache.hadoop.io.Writable"}

    # DataFrame转换为rdd写入hbase
    col_list = id_df.columns
    print(col_list)
    rdd_data = id_df.rdd.map(lambda x:(x["V_ID"],((i,x[i]) for i in col_list[1:])))
    rdd_data = rdd_data.flatMapValues(lambda x:x)
    rrd2 = rdd_data.map(lambda x:(x[0],[x[0],'info',x[1][0],x[1][1]]))
    print(rrd2.take(10))
	rrd2.saveAsNewAPIHadoopDataset(conf=conf,keyConverter=keyConv,valueConverter=valueConv)

def main():
    sc = spark.sparkContext

    df = read_txt(sc)
    write_to_hbase2(df)
    sc.stop()
if __name__ == '__main__':
    main()

这个方法有个值得注意的地方,如果你在配置的代码中没有配置zookeeper.znode.parent,你就会遇到以下错误:

20/04/29 09:28:14 WARN ConnectionImplementation: Retrieve cluster id failed
java.util.concurrent.ExecutionException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase/hbaseid

然后你会一头雾水,因为这个问题你可能在使用hbase shell的时候应该遇到过,而且你应该已经解决了,然后再往下拉,你就又看到一句:

Caused by: java.io.IOException: org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /hbase

如果你百度的这些错的话,你能看到的都不是说spark连接Hbase遇到这个问题。。这就很无语。。
其实这里简单来说就是,找不到hbase在zookeeper的路径(不知道我这样表述有没有问题)。所以你只要在配置里指定好zookeeper.znode.parent就可以了。
这个配置我试过,在scala的代码里不写,也是报一样的错,但是很奇怪的是网上的代码基本都不写这个配置。。可能是我环境配的有问题吧。

好的,配置完之后不报这个错了,又报另一个错:

20/05/07 15:37:18 ERROR Utils: Aborting task
java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.Put.add([B[B[B)Lorg/apache/hadoop/hbase/client/Put;

这里简单来讲就是org.apache.hadoop.hbase.client里put.add有问题。。。
那么我上网查过,反正意思就是2.0版本之后这个方法改了
解决办法看看这几篇:
https://blog.youkuaiyun.com/sinat_37992109/article/details/98735188.
https://www.cnblogs.com/cssdongl/p/7347167.html.
https://blog.youkuaiyun.com/cssdongl/article/details/77750515.

简单来讲就是要不呢,你就换版本(spark降低到2.0版本以下),要不呢,你就重新编译spark-exmaple的jar包(怎么又重新编译。。)

我觉得太过于麻烦。。所以我还是写scala吧
由于文章太长,所以我再分一篇把。。。

使用spark将数据写入Hbase --------------组装xml并捕获异常------------------- package wondersgroup_0628.com import java.io.{IOException, PrintWriter, StringReader, StringWriter} import java.util.Base64 import com.wonders.TXmltmp im... 阅读详情

相关推荐

shc-core-1.1.1-2.1-s_2.11.jar

Apache Spark - Apache HBase Connector 可以使用此jar包基于shc框架使用spark读写hbase

spark 操作 hbase 之写入 hbase

1 概述 在大数据的应用场景中,hbase常用在实时读写。 写入 HBase 的方法大致有以下几种: ​ 1)Java 调用 HBase 原生 API,HTable.add(List(Put))。 ​ 2)使用 TableOutputFormat 作为输出。 ​ 3)Bulk Load,先将数据按照 HBase 的内部数据格式生成持久化的 HFile 文件,然后复制到合适的位置并通知 RegionServer ,即完成海量数据的入库。其中生成 Hfile 这一步可以选择 MapReduce

heqingcool的博客 4535

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

Spark写入数据到Hbase(hdfs bulkload方式)

hbase同步数据到hdfs程序设计思路基于spark数据处理引擎

多头注意力探索Now 1863

别再只盯着内存溢出了!从Unity崩溃日志中揪出AssetBundle.LoadAsset_Internal的真凶

本文深入解析Unity崩溃日志中AssetBundle.LoadAsset_Internal错误的真实原因,帮助开发者超越内存溢出的表象,识别文件损坏、热更新陷阱等核心问题。通过日志分析技巧、最佳实践和高级调试方法,提供系统化的解决方案,确保Unity资源加载的稳定性。

weixin_42676824的博客 251

PC微信(3.9.2.23)逆向实战:定位并Hook消息接收函数

本文详细介绍了PC微信(3.9.2.23)逆向分析中定位并Hook消息接收函数的完整实战流程。通过Cheat Engine动态定位未读消息数内存地址,结合OllyDbg分析代码上下文,最终找到稳定的Hook点,并分享了实战中的关键注意事项与踩坑经验。

lll78的博客 473

pyspark 读取 hbase

本文推荐两种读写 HBase 的方式:1、相关依赖:将 的 目录下的一些jar文件拷贝到Spark中,这些都是编程时需要引入的jar包,需要拷贝的jar文件包括: 在 目录中新建一个目录 ,并将 拷贝进去: 2、修改 文件:设置 的 文件,告诉Spark可以在哪个路径下找到HBase相关的jar文件,命令如下: 1.2 读取 HBase 1.3 向 HBase 写入数据 2. happybase + Thrift 服务读写 HBase 2.1 依赖安装 由于需要安装第三方库 ,所以需要

hj1993的博客 1505

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8246

使用spark写数据到Hbase的三种方式

方式一:直接使用HBase Table的PUT方法 import org.apache.hadoop.hbase.{HBaseConfiguration, TableName} import org.apache.hadoop.hbase.client.{ConnectionFactory, Put, Table} import org.apache.hadoop.hbase.util.B...

freeRoad 1万+

避坑指南:STM32定时器测PWM频率占空比时,那些CubeMX没告诉你的细节(蓝桥杯真题衍生)

本文深入解析STM32定时器测量PWM频率和占空比时的关键细节,揭示CubeMX配置中未明确的时钟树原理和输入捕获机制。针对蓝桥杯嵌入式赛题中的常见问题,提供动态调整预分频器、多采样数字滤波等实战解决方案,帮助开发者避免测量误差,提升PWM测量精度和稳定性。

weixin_28692153的博客 339

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

pyspark使用hbase详解

pyspark使用hbase详解 一、测试代码: def write2hbase(): from pyspark.sql import SparkSession from pyspark import SparkContext, SparkConf spark = SparkSession.builder.appName("nlp").getOrCreate() # 创建spark对象 print('spark对象已创建') host = 'emr1:2181,e

zll_1234的博客 2206

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 320

Spark读HBASE - shc方案

shc是hortonworks出品的开源方案,基于spark的特性,分片处理,并通过谓词下推,提高处理性能。 1. 引入依赖包 <dependency> <groupId>com.hortonworks</groupId> <artifactId>shc-core</artifactId> <versi...

Bugs那些事儿 657

SmartFusion从FPGA到ARM系列教程

前言 本系列教程,将会以Microsemi SmartFusion一代芯片A2F200M3F为例,简单介绍片上ARM Cortex-M3 硬核 MCU 基本外设的使用,及其与FPGA逻辑模块进行交互的示例。 在学习片上硬核ARM Cortex-M3 MCU的开发之前,要先熟悉Microsemi Libero SoC开发环境的使用,可以参考:Microsemi Libero SoC系列教程 关于Microsemi SmartFusion混合型FPGA的介绍,可以参考:Microsemi SmartFusio.

whik1194的博客 8293

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

pyspark连接hbase的三种方式

第一种方式 通过thrift接口,这种方式是最简单的,但是访问速度慢,而且thrift接口socket是由超时的 用Python操作HBase之HBase-Thrift 通过happybase增强thrift接口 安装happyhbase 安装过程失败,尝试修正方法,centos7 yum install python-devel 安装happybase也失败了。看了只有使用原生的thrift接口...

sunseaxhj的博客 3837

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Pyspark以DataFrame格式读写Hbase

Pyspark以DataFrame格式读写Hbase 本文代码参考了__miss的博客,特别感谢,原文地址如下 链接:https://blog.youkuaiyun.com/u011412768/article/details/93404921 我使用的环境:CDH集群,资源监控使用的yarn, spark2.3,hbase1.6 。 读写方式:Hbase默认API 默认环境大家都已配置好。代码可以...

w271255278的专栏 1995

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

maven本地jar包导入

今天用到第三方一个库,在spark中将数据导入到hbase,使用了shc-core,但将maven配置上去无法下载,那只能另找方法了。先从https://mvnrepository.com/artifact/com.hortonworks/shc-core/1.1.1-2.1-s_2.11好面将jar包下载下来,开始想在maven的仓库中手动配置目录结构的,在google上查了下结果发现有更加简单...

goodstudy168的专栏 808

python中,用pyspark读取Hbase数据,并转换为dataframe格式

需要完成的关键三个点分别是,设置好连接spark的配置,通过spark从hbase中将数据读进来为rdd格式,然后将rdd格式的数据转换成dataframe的格式。 1、首先需要设置pyspark连接spark的配置,spark连接有sparkcontext和sparksession这两种方式,同时这两种方式之间可以互相转换,连接代码如下: (1)通过SparkConf和SparkContex...

木东的博客 2152

aop 多数据源

此方法是在需要使用的地方加上自定义注解@DataSource 根据注解下这个方法的传参 注意: (规定参数命名) 配置文件yml spring: datasource: type: com.zaxxer.hikari.HikariDataSource hikari: minimum-idle: 5 maximum-pool-size: 15 auto-commit: true idle-timeout: 30000 poo

TimeShare1的博客 355

spark 存入hbase_Spark 写入HBase

我们将Spark处理完的数据一般吸入外部存储系统中,常见的外部存储系统有HBase,MySQL,ElasticSearch,redis,HDFS等。现在我们主要介绍Spark写入HBase的方法。废话不多说,先贴代码:result.foreachPartition(it=>{//创建HBase连接val conn: client.Connection = HBaseUtil.getConne...

weixin_39811478的博客 398

spark 存入hbase_Spark DataFrame写入HBase的常用方式

Spark是目前最流行的分布式计算框架,而HBase则是在HDFS之上的列式分布式存储引擎,基于Spark做离线或者实时计算,数据结果保存在HBase中是目前很流行的做法。例如用户画像、单品画像、推荐系统等都可以用HBase作为存储媒介,供客户端使用。因此Spark如何向HBase中写数据就成为很重要的一个环节了。本文将会介绍三种写入的方式,其中一种还在期待中,暂且官网即可...代码在spark ...

weixin_40004057的博客 556

Spark Streaming实时写入HBase(十分稳定,不会导致宕机)

文章目录Spark Streaming实时写入HBase0--适用框架1-代码解析1-1 Kafka部分1-2 Hbase部分2-代码源码3-pom.xml Spark Streaming实时写入HBase 0–适用框架 1-代码解析 1-1 Kafka部分 //定义一个主题数组,内可包含多个主题,此处只有一个 val kafkaTopic = Array("mytopic") //bootstrap.servers kafka的服务节点和端口号,用于连接kafka //key.deserializer

咸鱼的博客 861

pyspark实战(六)pyspark+happybase批量写入hbase操作

pyspark和happyhase操作hbase需要提前部署和安装pyspark和happyhbase的python包,具体的安装过程可看靠前面章节,这里不再赘述。 1、引入相关包 from pyspark import SparkContext,SparkConf #pyspark包,v2.2.0 import happybase #ha...

luoye4321的专栏 3748

pyspark写入hbase2.*的坑

目录前言测试过程问题1 找不到类StringToImmutableBytesWritableConverter问题2:找不到方法: org.apache.hadoop.hbase.client.Put.add([B[B[B)Lorg/apache/hadoop/hbase/client/Put参考: 前言 日前笔者尝试使用pyspark 2.4.3访问问hbase 2.1并进行读写,遇到以下一些坑...

chensongjian的技术博客 2179

Spark 读写 HBase 的两种方式(RDD、DataFrame)

Spark 读写 HBase 的两种方式(RDD、DataFrame)

修行修心 2万+
上一篇: 读取TXT文件写入数据到Hbase
下一篇: Spark写入数据到Hbase(上)
铲子挖数据
博客等级 码龄8年 24粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值