hudi-hive-sync

2023-11-20

hudi-hive-sync

Syncing to Hive 有两种方式:

  1. 在hudi 写时同步
  2. 使用run_sync_tool.sh 脚本进行同步
1. 代码同步

改方法最终会同步元数据,但是会抛出异常

val spark = SparkSession
      .builder()
      .config(sparkConf)
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .getOrCreate()

    val insertData = spark.read.parquet(inputDir)

    //非分区表
    // 设置主键列名
    var data = insertData.write.format("org.apache.hudi")
      //copy_on_writer or merge_on_read
      .option(DataSourceWriteOptions.TABLE_TYPE_OPT_KEY, allHudiConfig("hoodie.datasource.write.storage.type"))
      .option(DataSourceWriteOptions.RECORDKEY_FIELD_OPT_KEY, allHudiConfig("hoodie.datasource.write.recordkey.field"))
      // 设置数据更新时间的列名
      .option(DataSourceWriteOptions.PRECOMBINE_FIELD_OPT_KEY, allHudiConfig("hoodie.datasource.write.precombine.field"))
      //merge逻辑class
      .option(DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY, allHudiConfig("hoodie.datasource.write.payload.class"))
      //是否开启hive同步
      .option(DataSourceWriteOptions.HIVE_SYNC_ENABLED_OPT_KEY, "true")
      //hive库
      .option(DataSourceWriteOptions.HIVE_DATABASE_OPT_KEY, databaseName)
      //hive表
      .option(DataSourceWriteOptions.HIVE_TABLE_OPT_KEY, tableName)
      //hive连接jdbcurl,我这边的环境存在kerberos认证,所以url要加一些配置
      .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY, "jdbc:hive2://master:10000/xh;principal=hive/master@HADOOP.COM")


    //1.判断当前表是否为分区表
    if ("true".equals(flag)) {
      //该表为分区表
      data
        //hudi表分区字段
        .option(DataSourceWriteOptions.PARTITIONPATH_FIELD_OPT_KEY, "year")
        //表数据发生变更时,分区是否发生变更
        .option(HoodieIndexConfig.BLOOM_INDEX_UPDATE_PARTITION_PATH, "true")
        //设置全局索引
        .option(HoodieIndexConfig.INDEX_TYPE_PROP, HoodieIndex.IndexType.GLOBAL_BLOOM.name())
        //hudi表主键生成
        .option(DataSourceWriteOptions.KEYGENERATOR_CLASS_OPT_KEY, classOf[SimpleKeyGenerator].getName)
        //hive表分区列名
        .option(DataSourceWriteOptions.HIVE_PARTITION_FIELDS_OPT_KEY, "dt")
        //hive_sync.partition_extractor_class
        .option(DataSourceWriteOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY, classOf[MultiPartKeysValueExtractor].getName)
    } else {
      //分区表与非分区表的主键生成策略不同,需要注意
      data.option(DataSourceWriteOptions.KEYGENERATOR_CLASS_OPT_KEY, classOf[NonpartitionedKeyGenerator].getName)
      //hive_sync.partition_extractor_class
      .option(DataSourceWriteOptions.HIVE_PARTITION_EXTRACTOR_CLASS_OPT_KEY, classOf[NonPartitionedExtractor].getName)
    }

    // 表名称设置
    data
      // 并行度参数设置
      .option("hoodie.insert.shuffle.parallelism", allHudiConfig("hoodie.insert.shuffle.parallelism"))
      .option("hoodie.upsert.shuffle.parallelism", allHudiConfig("hoodie.insert.shuffle.parallelism"))
      .option(HoodieWriteConfig.TABLE_NAME, tableName)
      .mode(if (exists) SaveMode.Append else SaveMode.Overwrite)
      // 写入路径设置
      .save(writePath)

上面代码可以同步 hive表,最终的数据是没问题的。但是会抛出如下信息,后面有一篇更详细的博客描述如何使用第一种方式进行同步,请点击使用代码进行hudi hive sync

36516 [main] ERROR org.apache.hudi.hive.HiveSyncTool  - Got runtime exception when hive syncing
org.apache.hudi.hive.HoodieHiveSyncException: Failed to get update last commit time synced to 20200918091211
	at org.apache.hudi.hive.HoodieHiveClient.updateLastCommitTimeSynced(HoodieHiveClient.java:658)
	at org.apache.hudi.hive.HiveSyncTool.syncHoodieTable(HiveSyncTool.java:128)
	at org.apache.hudi.hive.HiveSyncTool.syncHoodieTable(HiveSyncTool.java:87)
	at org.apache.hudi.HoodieSparkSqlWriter$.syncHive(HoodieSparkSqlWriter.scala:229)
	at org.apache.hudi.HoodieSparkSqlWriter$.checkWriteStatus(HoodieSparkSqlWriter.scala:279)
	at org.apache.hudi.HoodieSparkSqlWriter$.write(HoodieSparkSqlWriter.scala:184)
	at org.apache.hudi.DefaultSource.createRelation(DefaultSource.scala:91)
	at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:45)
	at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:70)
	at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:68)
	at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:86)
	at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:131)
	at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:127)
	at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:155)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
	at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
	at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
	at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:80)
	at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:80)
	at org.apache.spark.sql.DataFrameWriter$$anonfun$runCommand$1.apply(DataFrameWriter.scala:676)
	at org.apache.spark.sql.DataFrameWriter$$anonfun$runCommand$1.apply(DataFrameWriter.scala:676)
	at org.apache.spark.sql.execution.SQLExecution$$anonfun$withNewExecutionId$1.apply(SQLExecution.scala:78)
	at org.apache.spark.sql.execution.SQLExecution$.withSQLConfPropagated(SQLExecution.scala:125)
	at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:73)
	at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:676)
	at org.apache.spark.sql.DataFrameWriter.saveToV1Source(DataFrameWriter.scala:285)
	at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:271)
	at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:229)
	at com.clb.utils.HoodieImportHelper$.hudiUpsert(HoodieImportHelper.scala:159)
	at com.clb.HoodieImportHandler$$anonfun$importDataToHudi$1.apply$mcV$sp(HoodieImportHandler.scala:103)
	at scala.util.control.Breaks.breakable(Breaks.scala:38)
	at com.clb.HoodieImportHandler$.importDataToHudi(HoodieImportHandler.scala:65)
	at com.clb.HoodieImportHandlerTest.testImportDataToHudiPartition(HoodieImportHandlerTest.scala:48)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: NoSuchObjectException(message:hid0101_cache_xdcs_pacs_hj.merge_test13 table not found)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.get_table_core(HiveMetaStore.java:1808)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.get_table(HiveMetaStore.java:1778)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.invoke(RetryingHMSHandler.java:107)
	at com.sun.proxy.$Proxy39.get_table(Unknown Source)
	at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.getTable(HiveMetaStoreClient.java:1208)
	at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.getTable(SessionHiveMetaStoreClient.java:131)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.invoke(RetryingMetaStoreClient.java:156)
	at com.sun.proxy.$Proxy40.getTable(Unknown Source)
	at org.apache.hudi.hive.HoodieHiveClient.updateLastCommitTimeSynced(HoodieHiveClient.java:654)
	... 53 more
36551 [main] INFO  org.apache.hadoop.hive.metastore.HiveMetaStore  - 0: Shutting down the object store...
2. 脚本同步

下载hudi源码,编译打包

git clone https://github.com/apache/hudi.git && cd hudi
mvn clean package -DskipTests -DskipITs

打包结束后查看脚本位置

cd hudi/hudi-hive-sync/
# 可以看见存在:run_sync_tool.sh脚本

因为我本地的hadoop环境是CDH-6.2.0,run_sync_tool.sh 不适合我使用,我修改了某些内容

将下列内容添加或修改部分配置

  1. 添加环境变量:HADOOP_HOME,HIVE_HOME
export HADOOP_HOME=/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop
export HIVE_HOME=/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hive
  1. 修改 :HADOOP_HIVE_JARS
# 大概在脚本的55行
#HADOOP_HIVE_JARS=${HIVE_JARS}:${HADOOP_HOME}/share/hadoop/common/*:${HADOOP_HOME}/share/hadoop/mapreduce/*:${HADOOP_HOME}/share/hadoop/hdfs/*:${HADOOP_HOME}/share/hadoop/common/lib/*:${H    ADOOP_HOME}/share/hadoop/hdfs/lib/*
HADOOP_HIVE_JARS=${HIVE_JARS}:/opt/cloudera/parcels/CDH-6.2.01.cdh6.2.0.p0.967373/lib/hadoop/client/*

​ 这样配置后,启动shell脚本,会报错:

Exception in thread "main" java.lang.NoClassDefFoundError: com/facebook/fb303/FacebookService$Iface
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:348)
	at org.apache.hadoop.hive.metastore.MetaStoreUtils.getClass(MetaStoreUtils.java:1739)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:128)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:101)
	at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3815)
	at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3867)
	at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3847)
	at org.apache.hadoop.hive.ql.metadata.Hive.getAllFunctions(Hive.java:4101)
	at org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:254)
	at org.apache.hadoop.hive.ql.metadata.Hive.registerAllFunctionsOnce(Hive.java:237)
	at org.apache.hadoop.hive.ql.metadata.Hive.<init>(Hive.java:394)
	at org.apache.hadoop.hive.ql.metadata.Hive.create(Hive.java:338)
	at org.apache.hadoop.hive.ql.metadata.Hive.getInternal(Hive.java:318)
	at org.apache.hadoop.hive.ql.metadata.Hive.get(Hive.java:294)
	at org.apache.hudi.hive.HoodieHiveClient.<init>(HoodieHiveClient.java:105)
	at org.apache.hudi.hive.HiveSyncTool.<init>(HiveSyncTool.java:65)
	at org.apache.hudi.hive.HiveSyncTool.main(HiveSyncTool.java:207)
Caused by: java.lang.ClassNotFoundException: com.facebook.fb303.FacebookService$Iface
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 30 more

​ 原因是没有:libfb303-0.9.3.jar

​ 本地全局搜索:find / -name libfb303-0.9.3.jar

​ 如果存在,将其复制到一个文件夹里面:

cp xxx/xxx/xx/libfb303-0.9.3.jar /opt/lib

# 重新修改run_sync_tool.sh脚本
HADOOP_HIVE_JARS=${HIVE_JARS}:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop/client/*:/opt/lib/*
  1. 启动脚本

    1. 分区表同步

      sh /opt/hudi/hudi-hive-sync/run_sync_tool.sh 
      --base-path /test/sys001/xh/partition  #hudi表路径
      --database xh 	#hive库名
      --table test # hive表名
      --partitioned-by dt
      --jdbc-url 'jdbc:hive2://master:10000/xh;principal=hive/master@HADOOP.COM' #jdbcurl 
      --partition-value-extractor org.apache.hudi.hive.MultiPartKeysValueExtractor # hive_sync.partition_extractor_class
      --user hive #hive user
      --pass hive #hive pass
      --partitioned-by dt # hive 表分区
      
    2. 非分区表同步

      sh /opt/hudi/hudi-hive-sync/run_sync_tool.sh 
      --base-path /test/sys001/xh/partition  #hudi表路径
      --database xh 	#hive库名
      --table test2 # hive表名
      --jdbc-url 'jdbc:hive2://master:10000/xh;principal=hive/master@HADOOP.COM' #jdbcurl 
      --partition-value-extractor org.apache.hudi.hive.NonPartitionedExtractor # hive_sync.partition_extractor_class
      --user hive #hive user
      --pass hive #hive pass
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hudi-hive-sync 的相关文章

  • 使用Gradle命令查看项目中库的依赖关系

    在Terminal中 可以通过 gradle 的命令查看项目中所使用库的版本 并且可以更加直观看到库之间的依赖关系 同时它们可以帮助您跟踪并解决与库版本冲突有关的任何问题 Building Android apps dependencies
  • P1719 Let‘s play a game!

    include
  • 海外SD-WAN服务商助力企业快速发展

    随着全球化的推进 越来越多的企业开始涉足海外市场 面临着跨国网络建设的挑战 在这个过程中 SD WAN Software Defined Wide Area Network 技术得到了广泛应用 SD WAN通过软件定义网络和云技术 可以实现
  • SQL太慢如何进行优化

    1 慢SQL优化思路 慢查询日志记录慢SQL explain分析SQL的执行计划 profile 分析执行耗时 Optimizer Trace分析详情 确定问题并采用相应的措施 1 1 慢查询日志记录慢SQL 如何定位慢SQL呢 我们可以通
  • 大数据工具软件安装失败问题是怎么解决的

    大数据所要安装的软件 python 可以在python的官网下载最新的python程序 pycharm 很好用的一款python编译工具 Anaconda3 集成了很多的大数据工具在里边 出现的问题 不能成功安装python 提示缺少win
  • python 随机生成不重复的6位数_随机生成6位数、随机生成不重复的6位数

    随机生成一个几位数 这种比较常见的操作今天我们来看一下 例如随机生成6位数 直接来简单明了的吧 int num int Math random 9 1 100000 最终num就是需要的6位随机数 同理要是想得到随机的五位数和七位数呢 随机

随机推荐

  • 非常详尽的 Linux 中 WEB服务器配置与管理 (通过例子来讲解)

    Apache服务器的安装与启动 检查是否已经安装了APACHE并启动它 这是已安装好的状态 root root rpm qa grep httpd httpd tools 2 2 15 53 el6 x86 64 httpd 2 2 15
  • Blender相关学习笔记

    blender m idea mm 0 1 2 5 0 4 10 0 24 6 1 环选 alt 左键 2 分离 V 3 从两个边中创建面 选择两条 或多条 边 然后按F 4 复制 shift D 复制某一个模型 或部分 到另一个图层 编辑
  • 国际软件项目经理的七大素质

    国际软件项目经理的七大素质 1 在一个或多个应用领域内使用整合了道德 法律和经济问题的工程方法来设计合适的解决方案 2 懂得确定客户需求并将其转换成软件需求的过程 3 履行项目经理的职责 善于处理技术和管理方面的事务 4 懂得并使用有用的项
  • 人脸特征点检测

    CVPR2016刚刚落下帷幕 本文对面部特征点定位的论文做一个简单总结 让大家快速了解该领域最新的研究进展 希望能给读者们带来启发 CVPR2016相关的文章大致可以分为三大类 处理大姿态问题 处理表情问题 处理遮挡问题 1 姿态鲁棒的人脸
  • 描述性能测试工作中的完整过程?

    有简单接触 采用的工具是Jmeter 进行轻量级的压力测试 1 确定好压力测试的功能模块 首先用Jmeter录制脚本 然后对脚本进行优化 2 对一些数据进行参数化 利用CSV导入存在txt文档里面的数据 3 设计测试场景 4 执行压力测试
  • 如何在windows的DOS窗口中正常显示中文(UTF-8字符)

    打开CMD exe命令行窗口 通过 chcp命令改变代码页 UTF 8的代码页为65001 ANSI OEM 简体中文 GBK为936 window default OEM 美国为437 如果chcp命令得到437 那么一定不能显示中文 此
  • 无法安装vmnet8虚拟网络适配器、vmware network editor未响应、注册失败,请检查账号数据库配置是否正确的解决

    文章目录 虚拟网络适配器安装 vmware network editor未响应 注册失败 请检查账号数据库配置是否正确的解决 关于第一次安装虚拟机的 全文约 423 字 预计阅读时长 2分钟 虚拟网络适配器安装 vmware network
  • rol/ror in c++

    template
  • 20天拿下华为OD笔试之【BFS】2023Q1A-微服务的集成测试【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解

    BFS 2023Q1A 微服务的集成测试 题目描述与示例 题目描述 现在有 n 个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身启动加载会消耗一些时间 给你一个 nxn 的二维矩阵 useTime 其中 useT
  • simulink仿真adc采样和epwm输出基础知识讲解

    F28027 12位ADC 2的y次方 tbclk 计数时钟的频率 tprd 一个周期内记得个数 1 tbclk 每次计一个数的时间 一个pwm周期的时间 pwm的周期 时基计数器 CRT 计数时钟由系统时钟分频来的 比较寄存器 CMR 决
  • 大数据、数据分析和数据挖掘的区别

    大数据 数据分析 数据挖掘的区别是 大数据是互联网的海量数据挖掘 而数据挖掘更多是针对内部企业行业小众化的数据挖掘 数据分析就是进行做出针对性的分析和诊断 大数据需要分析的是趋势和发展 数据挖掘主要发现的是问题和诊断 1 大数据 big d
  • 软件项目管理的平衡原则和高效原则

    1 平衡原则 在我们讨论软件项目为什么会失败时 列出了很多的原因 答案有很多 如管理问题 技术问题 人员问题等等 但是 有一个根本的问题是最容易被忽视的 也是软件系统的用户 软件开发商 销售代理商最不愿证实的 那就是 需求 资源 工期 质量
  • 计算机网络 网络层——IP数据报 详记

    IP 数据报的格式 一个 IP 数据报由首部和数据两部分组成 首部的前一部分是固定长度 共 20 字节 是所有 IP 数据报必须具有的 在首部的固定部分的后面是一些可选字段 其长度是可变的 IP数据报首部的固定部分中的各字段 版本 占4位
  • 信号量机制

    简介 信号量是一种数据结构 信号量的值与相应资源的使用情况有关 信号量的值由P V操作改变 常用信号量 整型信号量 整型信号量S的等待 唤醒机制 P V操作 wait S while S lt 0 do no op s signal S S
  • python字符串与列表

    字符串 字符串定义 输入输出 定义 切片是指对操作的对象截取其中一部分的操作 适用范围 字符串 列表 元组都支持切片操作 切片的语法 起始下标 结束 步长 字符串中的索引是从 0 开始的 最后一个元素的索引是 1 字符串的常见操作 查找 f
  • centos7搭建ftp服务器及ftp配置讲解

    ftp 即文件传输 它是INTERNET上仍然常用的最老的网络协议之一 它为系统提供了通过网络与远程服务器传输的简单方法 FTP服务器包的名称为vsftpd 一 vsftpd安装 并简单配置启动 安装 很简单 一句话 yum install
  • Socket接收数据耗时

    1 遇到问题 首先说明一下我遇到的问题 服务端传递Byte数组 长度在900w 客户端接收时会耗时10s 我的代码是这样的 2 Socket缓冲区 http t zoukankan com bigberg p 7747419 html 每个
  • 即刻掌握python格式化输出的三种方式 (o゜▽゜)o☆

    目录 1 f 转化的格式化输出方式 2 格式化输出的方法 3 format 格式化输出的方法 1 f 转化的格式化输出方式 只需要在我们要格式化输出的内容开头引号的前面加上 f 在字符串内要转义的内容用 括起来即可 模板 print f x
  • 企业微信登录-前端实现

    企业微信登录 企业微信登录 前端具体实现 下面代码中配置项的字段具体用途说明可以阅读企业微信开发者说明文档 我们通过提供的企业微信登录组件来进行站内登录 下面是我封装的登录组件以及使用方法 weChatLogin vue 封装的组件
  • hudi-hive-sync

    hudi hive sync Syncing to Hive 有两种方式 在hudi 写时同步 使用run sync tool sh 脚本进行同步 1 代码同步 改方法最终会同步元数据 但是会抛出异常 val spark SparkSess