gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

月度归档6月 2024

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  2024   /  
  • 6月
Kafka, 运维 6月 27,2024

CDH6.3.2一台服务器宕机后kafka集群无法选举leader

cdh6.3.2集群有一台服务器宕机了,重新恢复后,发现kafka集群无法正常启动,报错日志如下,其中 TopicRunData 是kafka消费的topic。

1、错误分析

[Controller id=469 epoch=67] Controller 469 epoch 67 failed to change state for partition TopicRunData-2 from OfflinePartition to OnlinePartition kafka.common.StateChangeFailedException: Failed to elect leader for partition
TopicRunData -2 under strategy OfflinePartitionLeaderElectionStrategy at kafka.controller.PartitionStateMachine$$anonfun$doElectLeaderForPartitions$3.apply(PartitionStateMachine.scala:390) at kafka.controller.PartitionStateMachine$$anonfun$doElectLeaderForPartitions$3.apply(PartitionStateMachine.scala:388) at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48) at kafka.controller.PartitionStateMachine.doElectLeaderForPartitions(PartitionStateMachine.scala:388) at kafka.controller.PartitionStateMachine.electLeaderForPartitions(PartitionStateMachine.scala:315) at kafka.controller.PartitionStateMachine.doHandleStateChanges(PartitionStateMachine.scala:225) at kafka.controller.PartitionStateMachine.handleStateChanges(PartitionStateMachine.scala:141) at kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala:123) at kafka.controller.PartitionStateMachine.triggerOnlinePartitionStateChange(PartitionStateMachine.scala:109) at kafka.controller.KafkaController.kafka$controller$KafkaController$$onBrokerStartup(KafkaController.scala:382) at kafka.controller.KafkaController$BrokerChange$.process(KafkaController.scala:1318) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply$mcV$sp(ControllerEventManager.scala:94) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply(ControllerEventManager.scala:94) at kafka.controller.ControllerEventManager$ControllerEventThread$$anonfun$doWork$1.apply(ControllerEventManager.scala:94) at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:31) at kafka.controller.ControllerEventManager$ControllerEventThread.doWork(ControllerEventManager.scala:93) at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:82)

从提供的错误信息来看,Kafka Broker中存在4个离线分区(offline partitions),并且在尝试将其中一个分区
TopicRunData -2从OfflinePartition状态转换到OnlinePartition状态时失败了。具体原因是未能为该分区选举出领导者(leader)。这个异常是由kafka.common.StateChangeFailedException引发的,并指出在使用OfflinePartitionLeaderElectionStrategy策略下无法选出分区领导者。

结合上面的场景, 这是由于服务器宕机造成分区的数据不完整或元数据损坏 。

使用kafka-topics.sh命令检查主题状态:

kafka-topics.sh --describe --topic TopicRunData --bootstrap-server cdh01:9092

看到信息如下:

Topic:TopicRunData	PartitionCount:3	ReplicationFactor:1	Configs:min.insync.replicas=1,segment.bytes=1073741824,retention.ms=604800000,max.message.bytes=1000000,min.cleanable.dirty.ratio=0.5,unclean.leader.election.enable=false,retention.bytes=-1,delete.retention.ms=604800000
Topic: TopicRunData	Partition: 0	Leader: 299	Replicas: 299	Isr: 299
Topic: TopicRunData	Partition: 1	Leader: 384	Replicas: 384	Isr: 384
Topic: TopicRunData	Partition: 2	Leader: none	Replicas: 298	Isr:

这意味着每个分区的数据只在一个broker上保存,没有副本。这样如果该broker发生故障,相应的分区数据将不可用,从而影响到数据的高可用性。通常建议至少设置Replication Factor为3以确保高可用。 可惜之前由于存储压力等原因只有1个副本。

分区2显示没有Leader(Leader: none),且ISR(In-Sync Replicas)列表为空。这表明分区2目前处于未分配状态,可能是由于负责该分区的broker(Replicas: 298)出现故障或者与ZooKeeper的通信出现问题。这种情况下,该分区的数据无法被消费或生产

2、手动选举leader

为
TopicRunData 主题中无leader的分区手动分配并重新选举leader。执行以下命令:

kafka-preferred-replica-election.sh --bootstrap-server cdh01:9092 --path-to-json-file partition.json

创建一个名为partition.json的文件,其中包含以下内容:

{
  "partitions": [
    {
      "topic": "TopicRunData",
      "partition": 2
    }
  ]
}

这将触发platformMutiRunData主题第2分区的leader重新选举。

partition.json 有可能需要更多参数,请根据实际情况调整或找更详细的教程。

3、清空Topic来解决问题

由于无法手动选择,解决时间又紧迫,根据分析可能丢失数据少,所以想清空TopicRunData 主题的数据,从外部重新导入数据到 TopicRunData 。

注意:这将删除
TopicRunData 主题的所有数据。在执行此操作之前,请确保您了解此操作的后果,并备份好相关数据。

清空 TopicRunData 主题的数据:

kafka-topics.sh --delete --topic
TopicRunData --bootstrap-server cdh01:9092

然后重新创建该主题(如果需要):

kafka-topics.sh --create --topic
TopicRunData --bootstrap-server cdh01:9092 --replication-factor 1 --partitions 3

检查Kafka集群状态:

kafka-consumer-groups.sh --bootstrap-server cdh01:9092 --describe --group

your_consumer_group请将your_consumer_group替换为您要检查的实际消费者组ID。

确保所有Kafka broker正常运行。

作者 east
mysql, 运维 6月 27,2024

centos离线安装mysql客户端(亲测可用)

由于项目的需要,需要在内网的centos服务器,有mysql客户端远程访问mysql服务器。

1. 下载MySQL客户端

首先,你需要下载MySQL客户端软件包。你可以从MySQL官方网站下载,或者使用CentOS的软件仓库。

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar

2. 安装MySQL客户端

解压缩下载的文件,并安装RPM包:

tar xvf mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-client-5.7.34-1.el7.x86_64.rpm

用命令 which mysql 看到下面结果时说明安装成功了:

/usr/bin/mysql

3. 连接到远程MySQL服务器

使用以下命令连接到远程MySQL服务器:

mysql -u your_username -p -h remote_server_ip

注意事项:

  • 确保远程MySQL服务器允许来自你的CentOS服务器的连接。你可能需要在远程服务器的MySQL配置文件(通常是my.cnf)中设置bind-address为0.0.0.0,并在mysql.user表中授予远程访问权限。
  • 确保防火墙规则允许两个服务器之间的3306端口(MySQL默认端口)的流量。
  • 如果你使用的是较新或较旧的MySQL版本,请下载相应的安装包。
作者 east
Hive, 数据仓库 6月 25,2024

在大数据如何检测源数据中的脏数据和异常数据

在大数据Hive中,检测源数据中的脏数据和异常数据可以通过以下几个步骤来实现:

  1. 数据质量检查规则定义:
    首先,需要根据业务需求和数据特点,定义一系列数据质量检查规则。这些规则可以包括:
    • 字段值域检查:例如,性别字段只允许有”男”、”女”或”未知”等值。
    • 字段必填性检查:确保某些字段不能为空。
    • 字段唯一性检查:确保某些字段(如身份证号)具有唯一性。
    • 日期范围检查:确保日期字段在合理的范围内。
    • 数值范围检查:确保数值字段在合理的范围内。
    • 格式检查:例如,电话号码、邮箱地址等字段需要符合特定的格式。
  2. 使用Hive SQL和UDF进行数据质量检查:
    根据定义的数据质量检查规则,使用Hive SQL查询和用户自定义函数(UDF)来检测脏数据和异常数据。以下是一些示例:
    • 字段值域检查:SELECT * FROM your_table WHERE gender NOT IN ('男', '女', '未知');
    • 字段必填性检查:SELECT * FROM your_table WHERE name IS NULL;
    • 字段唯一性检查:SELECT id, COUNT(*) as cnt FROM your_table GROUP BY id HAVING cnt > 1;
    • 日期范围检查(假设有一个名为date_column的日期字段):SELECT * FROM your_table WHERE date_column < '2000-01-01' OR date_column > '2099-12-31';
    • 数值范围检查(假设有一个名为age的数值字段):SELECT * FROM your_table WHERE age < 0 OR age > 120;
    • 格式检查(使用正则表达式):SELECT * FROM your_table WHERE NOT (email RLIKE '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
  3. 创建自定义函数(UDF):
    如果需要进行复杂的格式检查或计算,可以使用Java或Python编写自定义函数(UDF),然后在Hive SQL查询中调用这些函数。
  4. 定期执行数据质量检查:
    为了确保数据的持续质量,可以定期(如每天、每周或每月)执行数据质量检查任务。这可以通过设置定时任务(如使用Cron Job)或使用调度工具(如Apache Airflow)来实现。
  5. 数据清洗和处理:
    对于检测到的脏数据和异常数据,可以采取以下措施进行处理:
    • 删除:直接删除不符合要求的数据行。
    • 修正:根据业务需求修正错误的数据。
    • 填充缺失值:对于缺失的数据,可以根据业务规则填充合适的默认值或通过插值方法进行填充。
    • 记录日志:记录检测到的脏数据和异常数据,以便后续分析和处理。
作者 east
海豚调度器 6月 24,2024

用海豚调度器api启动工作流错误排查

在海豚调度器用api启动工作流,在海豚调度器的工作流实例看到是启动失败,但在任务失例又没看到。看启动工作流的代码觉得好像没问题,一时不得其解。

后来找到海豚调度器的日志dolphinscheduler-master.log, 看到日志如下:

[ERROR] 2024-06-24 12:27:24.466 org.apache.dolphinscheduler.dao.utils.DagHelper:[101] - start node name [ads_bigdata_xxxx] is not in task node list [[TaskNode{id='tasks-71533', name='ads_bigdata_battery_warning_detail.sh', desc='null', type='SHELL', runFlag='NORMAL', loc='null', maxRetryTimes=0, retryInterval=1, params='{"rawScript":"sh cnsaas/ads_bigdata_battery_warning_detail.sh ${complement_date}","localParams":[],"resourceList":[{"res":"cnsaas/ads_bigdata_xxxx.sh","name":"ads_bigdata_xxxx.sh","id":6},{"res":"cnsaas/ads_bigdata_xxxx.sql","name":"ads_bigdata_xxxx.sql","id":102}]}', preTasks='[]', extras='null', depList=[], dependence='{}', taskInstancePriority=MEDIUM, timeout='{"enable":false,"strategy":""}', workerGroup='default'}]] 
[ERROR] 2024-06-24 12:27:24.466 org.apache.dolphinscheduler.server.master.runner.MasterExecThread:[347] - processDag is null
[INFO] 2024-06-24 12:27:24.468 org.apache.dolphinscheduler.server.master.runner.MasterExecThread:[315] - prepare process :10712 end
[ERROR] 2024-06-24 12:27:24.468 org.apache.dolphinscheduler.server.master.runner.MasterExecThread:[184] - master exec thread exception
java.lang.NullPointerException: null
	at org.apache.dolphinscheduler.dao.utils.DagHelper.parsePostNodes(DagHelper.java:284)
	at org.apache.dolphinscheduler.server.master.runner.MasterExecThread.submitPostNode(MasterExecThread.java:482)
	at org.apache.dolphinscheduler.server.master.runner.MasterExecThread.runProcess(MasterExecThread.java:832)
	at org.apache.dolphinscheduler.server.master.runner.MasterExecThread.executeProcess(MasterExecThread.java:200)
	at org.apache.dolphinscheduler.server.master.runner.MasterExecThread.run(MasterExecThread.java:181)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
[ERROR] 2024-06-24 12:27:24.468 org.apache.dolphinscheduler.server.master.runner.MasterExecThread:[185] - process execute failed, process id:10712

原来启动节点名称(ads_bigdata_xxx)不在任务节点列表中。这意味着在DAG定义中,可能没有包含这个节点,或者节点的名称有误 。认真检查一下,果然是启动工作流时,任务节点的名称写得有问题,重新修改后果然正常启动工作流了。

作者 east
Flink 6月 19,2024

Apache Flink处理IoT复杂数据流程案例

使用Apache Flink处理IoT复杂数据是一项涉及多个步骤和组件的任务,包括数据接入、数据清洗、实时处理、状态管理、窗口计算、以及结果输出等。以下是一个全面且详细的Flink流处理框架,结合理论和实际应用,以处理IoT数据为主线。

1. 引入依赖和设置环境

首先,需要在你的项目中引入Flink所需的依赖。

<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_2.12</artifactId>
        <version>1.14.0</version>
    </dependency>
</dependencies>
xmlCopy Code<dependencies>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-java</artifactId>
        <version>1.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-streaming-java_2.12</artifactId>
        <version>1.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-connector-kafka_2.12</artifactId>
        <version>1.14.0</version>
    </dependency>
</dependencies>

2. 创建Flink执行环境

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        // 创建执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 设置并行度
        env.setParallelism(4);

        // 其他环境配置...
    }
}
javaCopy Codeimport org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        // 创建执行环境
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 设置并行度
        env.setParallelism(4);

        // 其他环境配置...
    }
}

3. 数据接入

通常,IoT数据会通过Kafka或其他消息队列接入。假设使用Kafka作为数据源:

import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.util.Properties;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        Properties properties = new Properties();
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "flink-group");
        properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("iot-topic", new SimpleStringSchema(), properties);
        DataStream<String> input = env.addSource(kafkaConsumer);

        // 进一步处理...
    }
}




4. 数据清洗和解析

实际的IoT数据通常是JSON格式的字符串,需要进行解析和清洗:

import org.apache.flink.api.common.functions.MapFunction;
import com.fasterxml.jackson.databind.ObjectMapper;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Kafka consumer setup...

        DataStream<String> input = env.addSource(kafkaConsumer);

        DataStream<IoTEvent> parsedStream = input.map(new MapFunction<String, IoTEvent>() {
            private ObjectMapper mapper = new ObjectMapper();

            @Override
            public IoTEvent map(String value) throws Exception {
                return mapper.readValue(value, IoTEvent.class);
            }
        });

        // 进一步处理...
    }

    public static class IoTEvent {
        public String deviceId;
        public long timestamp;
        public double temperature;
        public double humidity;
        // 其他字段和构造方法...
    }
}
javaCopy Codeimport org.apache.flink.api.common.functions.MapFunction;
import com.fasterxml.jackson.databind.ObjectMapper;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Kafka consumer setup...

        DataStream<String> input = env.addSource(kafkaConsumer);

        DataStream<IoTEvent> parsedStream = input.map(new MapFunction<String, IoTEvent>() {
            private ObjectMapper mapper = new ObjectMapper();

            @Override
            public IoTEvent map(String value) throws Exception {
                return mapper.readValue(value, IoTEvent.class);
            }
        });

        // 进一步处理...
    }

    public static class IoTEvent {
        public String deviceId;
        public long timestamp;
        public double temperature;
        public double humidity;
        // 其他字段和构造方法...
    }
}

5. 定义时间窗口和处理函数

import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.util.Collector;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Kafka consumer and parsing setup...

        DataStream<IoTEvent> parsedStream = input.map(new MapFunction<String, IoTEvent>() {
            private ObjectMapper mapper = new ObjectMapper();

            @Override
            public IoTEvent map(String value) throws Exception {
                return mapper.readValue(value, IoTEvent.class);
            }
        });

        DataStream<AggregatedResult> resultStream = parsedStream
            .keyBy(event -> event.deviceId)
            .timeWindow(Time.minutes(1))
            .process(new AggregateTemperatureHumidity());

        // 进一步处理...
    }

    public static class AggregateTemperatureHumidity extends ProcessWindowFunction<IoTEvent, AggregatedResult, String, TimeWindow> {
        @Override
        public void process(String key, Context context, Iterable<IoTEvent> elements, Collector<AggregatedResult> out) {
            double sumTemp = 0;
            double sumHumidity = 0;
            int count = 0;

            for (IoTEvent event : elements) {
                sumTemp += event.temperature;
                sumHumidity += event.humidity;
                count++;
            }

            double avgTemp = sumTemp / count;
            double avgHumidity = sumHumidity / count;

            out.collect(new AggregatedResult(key, context.window().getStart(), context.window().getEnd(), avgTemp, avgHumidity));
        }
    }

    public static class AggregatedResult {
        public String deviceId;
        public long windowStart;
        public long windowEnd;
        public double avgTemperature;
        public double avgHumidity;

        public AggregatedResult(String deviceId, long windowStart, long windowEnd, double avgTemperature, double avgHumidity) {
            this.deviceId = deviceId;
            this.windowStart = windowStart;
            this.windowEnd = windowEnd;
            this.avgTemperature = avgTemperature;
            this.avgHumidity = avgHumidity;
        }
    }
}

6. 输出结果到外部系统

处理后的数据通常需要写到数据库、文件系统或者其他外部系统。以写入到Kafka为例:

import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.apache.flink.streaming.util.serialization.SimpleStringSchema;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Kafka consumer, parsing, and processing setup...

        DataStream<AggregatedResult> resultStream = parsedStream
            .keyBy(event -> event.deviceId)
            .timeWindow(Time.minutes(1))
            .process(new AggregateTemperatureHumidity());

        resultStream.map(result -> result.toString())
            .addSink(new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), properties));

        env.execute("IoT Data Processing with Flink");
    }
}
javaCopy Codeimport org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.apache.flink.streaming.util.serialization.SimpleStringSchema;

public class IoTDataProcessing {
    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Kafka consumer, parsing, and processing setup...

        DataStream<AggregatedResult> resultStream = parsedStream
            .keyBy(event -> event.deviceId)
            .timeWindow(Time.minutes(1))
            .process(new AggregateTemperatureHumidity());

        resultStream.map(result -> result.toString())
            .addSink(new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), properties));

        env.execute("IoT Data Processing with Flink");
    }
}

7. 完整代码示例

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.apache.flink.util.Collector;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.flink.streaming.util.serialization.SimpleStringSchema;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Properties;

public class IoTDataProcessing {

    public static void main(String[] args) throws Exception {
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(4);

        Properties properties = new Properties();
        properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "flink-group");
        properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>("iot-topic", new SimpleStringSchema(), properties);
        DataStream<String> input = env.addSource(kafkaConsumer);

        DataStream<IoTEvent> parsedStream = input.map(new MapFunction<String, IoTEvent>() {
            private ObjectMapper mapper = new ObjectMapper();

            @Override
            public IoTEvent map(String value) throws Exception {
                return mapper.readValue(value, IoTEvent.class);
            }
        });

        DataStream<AggregatedResult> resultStream = parsedStream
            .keyBy(event -> event.deviceId)
            .timeWindow(Time.minutes(1))
            .process(new AggregateTemperatureHumidity());

        resultStream.map(result -> result.toString())
            .addSink(new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), properties));

        env.execute("IoT Data Processing with Flink");
    }

    public static class IoTEvent {
        public String deviceId;
        public long timestamp;
        public double temperature;
        public double humidity;

        // constructor, getters, setters...
    }

    public static class AggregateTemperatureHumidity extends ProcessWindowFunction<IoTEvent, AggregatedResult, String, TimeWindow> {
        @Override
        public void process(String key, Context context, Iterable<IoTEvent> elements, Collector<AggregatedResult> out) {
            double sumTemp = 0;
            double sumHumidity = 0;
            int count = 0;

            for (IoTEvent event : elements) {
                sumTemp += event.temperature;
                sumHumidity += event.humidity;
                count++;
            }

            double avgTemp = sumTemp / count;
            double avgHumidity = sumHumidity / count;

            out.collect(new AggregatedResult(key, context.window().getStart(), context.window().getEnd(), avgTemp, avgHumidity));
        }
    }

    public static class AggregatedResult {
        public String deviceId;
        public long windowStart;
        public long windowEnd;
        public double avgTemperature;
        public double avgHumidity;

        public AggregatedResult(String deviceId, long windowStart, long windowEnd, double avgTemperature, double avgHumidity) {
            this.deviceId = deviceId;
            this.windowStart = windowStart;
            this.windowEnd = windowEnd;
            this.avgTemperature = avgTemperature;
            this.avgHumidity = avgHumidity;
        }

        @Override
        public String toString() {
            return "AggregatedResult{" +
                    "deviceId='" + deviceId + '\'' +
                    ", windowStart=" + windowStart +
                    ", windowEnd=" + windowEnd +
                    ", avgTemperature=" + avgTemperature +
                    ", avgHumidity=" + avgHumidity +
                    '}';
        }
    }
}
作者 east
Spark 6月 18,2024

Deequ教程来监控Spark/Hive离线数仓的数据质量实用教程

第一部分:Deequ简介与环境搭建

1. Deequ是什么?

Deequ是AWS开源的一款基于Apache Spark的库,用于定义和验证数据质量规则。它通过声明式API允许用户定义一系列数据质量检查,并自动执行这些检查来评估数据集的质量,特别适合大数据处理场景,如Spark和Hive数据仓库。

2. 安装与配置

  • 依赖管理:在你的Spark项目中加入Deequ的依赖。如果你使用sbt,可以在build.sbt文件中添加如下依赖:Scala1libraryDependencies += "com.amazon.deequ" %% "deequ" % "latestVersion"其中latestVersion应替换为当前的稳定版本号。
  • 环境准备:确保你的开发环境已经安装并配置好了Apache Spark和相关依赖(如Hadoop客户端,如果使用Hive的话)。

第二部分:Deequ核心概念

1. 数据质量规则

Deequ支持多种数据质量检查,包括但不限于:

  • Completeness: 检查列是否完整(非空)。
  • Uniqueness: 确保列值唯一。
  • Domain Constraints: 检查数据是否符合特定域,如数值范围、正则表达式匹配等。
  • Size Constraints: 检查数据集大小是否在预期范围内。
  • Dependency Checks: 验证列间的关系,如引用完整性。

2. 声明式API

Deequ采用Scala的声明式API来定义数据质量规则,使得规则定义变得直观且易于维护。

第三部分:实战操作指南

1. 初始化Deequ

在SparkSession中初始化Deequ:

import com.amazon.deequ.analyzers._
import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
    .appName("Deequ Data Quality")
    .getOrCreate()

import spark.implicits._

val analyzerContext = new AnalyzerContext(spark)
Scala1import com.amazon.deequ.analyzers._
2import org.apache.spark.sql.SparkSession
3
4val spark = SparkSession.builder()
5    .appName("Deequ Data Quality")
6    .getOrCreate()
7
8import spark.implicits._
9
10val analyzerContext = new AnalyzerContext(spark)

2. 定义数据质量检查

定义一套数据质量规则,例如检查某列是否非空且值唯一:

val checks = Seq(
  Completeness("column_name").isComplete, // 检查column_name列是否完整
  Uniqueness("unique_column").isUnique // 检查unique_column列是否唯一
)
Scala1val checks = Seq(
2  Completeness("column_name").isComplete, // 检查column_name列是否完整
3  Uniqueness("unique_column").isUnique // 检查unique_column列是否唯一
4)

3. 执行数据质量检查

应用定义好的规则到数据集上:

val dataset = spark.read.parquet("path/to/your/dataset")

val result = VerificationSuite()
    .onData(dataset)
    .addChecks(checks)
    .run()
Scala1val dataset = spark.read.parquet("path/to/your/dataset")
2
3val result = VerificationSuite()
4    .onData(dataset)
5    .addChecks(checks)
6    .run()

4. 分析结果与报告

检查结果包含了每个规则的通过与否及具体详情,可以通过以下方式查看:

result.checkResults.foreach { case (check, checkResult) =>
  println(s"${check.description} --> ${checkResult.status}")
}
Scala1result.checkResults.foreach { case (check, checkResult) =>
2  println(s"${check.description} --> ${checkResult.status}")
3}

Deequ还提供了生成HTML报告的功能,便于分享和存档:

result.writeReports("path/to/reports")

第四部分:高级用法与优化策略

1. 集成Hive

  • 使用Spark的Hive支持读取表数据:
  • val hiveDataset = spark.sql("SELECT * FROM your_hive_table")

2. 自定义检查与约束

Deequ允许用户自定义数据质量检查,以满足特定需求。

3. 性能优化

  • 分区处理:对于大型数据集,考虑按分区或子集处理数据。
  • 资源调整:根据Spark集群资源状况合理分配内存和CPU资源。
作者 east
chatgpt 6月 18,2024

腾讯云 AI 代码助手保姆级使用教程

腾讯云 AI 代码助手是一款基于先进的代码大模型开发的智能编码辅助工具,它能够帮助开发者提高编码效率,实现技术沟通、代码补全、自动生成单元测试等功能。

  • 基于腾讯混元代码模型:腾讯表示内部超过 50% 的研发在使用
  • 支持多种语言:支持 Python, JavaScript / TypeScript, Java, C / C++, Go, C#, Rust, Swift, Lua, Kotlin, TSX / JSX, Vue, Proto, PHP 等语言 / 框架
  • 支持主流 IDE:支持 VS Code 和 JetBrains 全家桶
  • 提升研发效率:通过技术对话与代码补全,辅助生成业务代码、注释、单元测试等内容,提高开发效率
  • 加速开发流程:辅助补全、BUG 诊断、生成测试,释放机械性工作,专注代码创作
  • 体验开发无障碍:对话学习、快速理解、规范编写、缩短学习曲线, 开发少走弯路

支持的IDE

  • Visual Studio Code
  • JetBrains IDEs(如 IntelliJ IDEA、PyCharm 等)

下载与安装

从 Visual Studio Code 插件市场安装

  1. 打开 Visual Studio Code。
  2. 点击左侧导航栏上的扩展图标,或使用快捷键 Ctrl+Shift+X(在 macOS 上是 Cmd+Shift+X)。
  3. 在搜索框中输入“腾讯云 AI 代码助手”。
  4. 找到插件后,点击“Install”按钮进行安装。
  5. 安装完成后,重启 Visual Studio Code。

从 JetBrains IDEs 安装

  1. 打开 JetBrains IDE(例如 IntelliJ IDEA)。
  2. 转到 “File” > “Settings”(Windows/Linux)或 “IntelliJ IDEA” > “Preferences”(macOS)。
  3. 在设置窗口中,选择 “Plugins”。
  4. 点击 “Marketplace” 标签,搜索“腾讯云 AI 代码助手”。
  5. 找到插件后,点击 “Install” 按钮进行安装。
  6. 安装完成后,重启 IDE。


腾讯云AI代码助手需要登录,并在腾讯云安全实名认证才可以使用。



二、核心功能介绍及实战演示

1. 代码补全:加速编码流程

功能说明: 基于上下文理解,腾讯云AI代码助手能够自动推荐最可能的代码片段,包括但不限于方法调用、变量声明、循环结构等,显著减少键盘敲击次数。

实例演示:

假设我们正在编写一个Python程序,用于计算两个数的和:

def add_numbers(a, b):
    return a + 

当键入到return a +时,腾讯云AI代码助手会立即提示补全为b,实现如下:

def add_numbers(a, b):
    return a + b
2. 优化代码:提升执行效率与可读性

功能说明: 该功能能够分析现有代码,提出重构建议,如循环优化、变量重命名、冗余代码删除等,确保代码既高效又易于维护。

实例演示:

原始代码存在循环内重复计算问题:

numbers = [1, 2, 3, 4, 5]
sum = 0
for num in numbers:
    sum += num * num
print(sum)

腾讯云AI代码助手建议优化为:

numbers = [1, 2, 3, 4, 5]
squared_sum = sum(x*x for x in numbers)
print(squared_sum)

通过列表推导式直接计算平方和,减少了计算步骤,提高了代码效率。

3. 补全注释:自动化文档生成

功能说明: 自动根据函数或模块的逻辑生成详细的注释说明,帮助团队成员理解代码逻辑,促进知识共享。

实例演示:

对于函数add_numbers,只需在函数定义下方添加注释起始符号""",AI助手即能自动生成注释:

def add_numbers(a, b):
    """
    Calculate the sum of two numbers.

    Args:
        a (int): The first number.
        b (int): The second number.

    Returns:
        int: The sum of `a` and `b`.
    """
    return a + b
Python1def add_numbers(a, b):
2    """
3    Calculate the sum of two numbers.
4
5    Args:
6        a (int): The first number.
7        b (int): The second number.
8
9    Returns:
10        int: The sum of `a` and `b`.
11    """
12    return a + b
4. 解释代码:新手友好,快速上手

功能说明: 鼠标选择代码行上时,右键选择腾讯云AI助手的解释代码,就能提供当前行代码的功能解释,特别适合新人学习和理解代码逻辑。

5. 生成单元测试:自动化测试框架构建

功能说明: 根据现有代码结构,自动生成对应的单元测试案例,确保代码变更时功能的稳定性。

实例演示:

对于上面的add_numbers函数,AI助手能生成如下单元测试代码:

import unittest
from my_module import add_numbers

class TestAddNumbers(unittest.TestCase):
    def test_add_positive_numbers(self):
        self.assertEqual(add_numbers(2, 3), 5)

    def test_add_negative_numbers(self):
        self.assertEqual(add_numbers(-1, -1), -2)

if __name__ == '__main__':
    unittest.main()
Python1import unittest
2from my_module import add_numbers
3
4class TestAddNumbers(unittest.TestCase):
5    def test_add_positive_numbers(self):
6        self.assertEqual(add_numbers(2, 3), 5)
7
8    def test_add_negative_numbers(self):
9        self.assertEqual(add_numbers(-1, -1), -2)
10
11if __name__ == '__main__':
12    unittest.main()
6. 定位代码缺陷:提前发现潜在错误

功能说明: 实时分析代码,标记潜在的语法错误、逻辑漏洞或不符合最佳实践的地方,防患于未然。

实例演示:

考虑下面的错误代码片段:

if x > y:
    result = divide(x, y)
else:
    print("y should be greater than x.")
Python1if x > y:
2    result = divide(x, y)
3else:
4    print("y should be greater than x.")

如果divide函数未定义,腾讯云AI代码助手将高亮显示divide(x, y),并提示“未定义的名称‘divide’”。

作者 east
Flink 6月 14,2024

Flink实时开发添加水印的案例分析

在Flink中,处理时间序列数据时,通常需要考虑事件时间和水印(watermarks)的处理。以下是修改前后的代码对比分析:

修改前的代码:

val systemDS = unitDS.map(dp => {
  dp.setDeviceCode(DeviceCodeEnum.fromPidToSystem(dp.getDeviceCode))
  dp
}).keyBy(_.getDeviceCode)
.window(TumblingEventTimeWindows.of(Time.seconds(60)))
.process(new MySystemWinF)
  1. unitDS 经过一个 map 操作,将每个元素的 deviceCode 转换为系统设备码。
  2. 使用 keyBy(_.getDeviceCode) 对转换后的设备码进行分组。
  3. 定义了一个基于事件时间的滚动窗口,窗口大小为60秒。
  4. 使用 process 操作应用自定义的窗口函数 HPageSystemWinF 来处理每个窗口中的数据。

注意:修改前的代码没有显示地处理水印(watermarks),这可能导致在处理乱序数据或延迟数据时出现问题。

修改后的代码:

val systemDS = unitDS.map(dp => {
  dp.setDeviceCode(DeviceCodeEnum.fromPidToSystem(dp.getDeviceCode))
  dp
}).keyBy(_.getDeviceCode)
.assignTimestampsAndWatermarks(
  WatermarkStrategy
    .<boundedOutOfOrdernessDaysPower>forBoundedOutOfOrderness(Duration.ofSeconds(5)) // 假设这里应该是.forBoundedOutOfOrderness而不是.forBoundedOutOfOrdernessDaysPower
    .withIdleness(Duration.ofSeconds(5))
    .withTimestampAssigner(new SerializableTimestampAssigner[DaysPower] {
      override def extractTimestamp(element: DaysPower, recordTimestamp: Long): Long = {
        Math.max(element.getEventTime, recordTimestamp)
      }
    })
).keyBy(_.getDeviceCode)
.window(TumblingEventTimeWindows.of(Time.seconds(60)))
.process(new MySystemWinF)
  1. 与修改前相同的部分:map, keyBy, 和 window 操作。
  2. 添加了 assignTimestampsAndWatermarks 方法来处理事件时间和水印:
    • 使用 WatermarkStrategy.forBoundedOutOfOrderness 允许一定程度的乱序数据(这里是5秒)。
    • .withIdleness(Duration.ofSeconds(5)) 设置了空闲超时时间为5秒,用于处理不活跃的键。
    • 使用 withTimestampAssigner 自定义了时间戳分配器,确保使用的事件时间是元素中的 eventTime 和记录的 recordTimestamp 中的较大值。

不同点和适用场景:

  • 事件时间和水印处理:修改后的代码显式地处理了事件时间和水印,这对于处理乱序数据、延迟数据以及确保正确的时间窗口计算是非常重要的。如果您的数据流中存在乱序或延迟数据,或者您希望更严格地保证处理时间窗口的正确性,那么应该使用修改后的代码。
  • 空闲超时:通过设置空闲超时,可以处理那些长时间不活跃的键,避免因为某些键长时间没有新数据而导致整个程序挂起。
  • 延迟数据处理:如果数据有可能晚到,但仍然需要被纳入正确的窗口进行计算,水印可以帮助界定数据的“迟到”界限。
    精确的时间窗口分析:对于需要基于事件实际发生时间而非数据处理时间进行分析的场景,如实时监控、金融交易分析等,事件时间模型是必须的。

作者 east
海豚调度器 6月 14,2024

海豚调度器执行impla工作流成功但没跑出数据原因和解决方案

在海豚调度器(DolphinScheduler)中执行Impala离线脚本时出现执行状态成功但实际上未产出数据,之后重跑又能成功的情况,可能是由多种因素引起的。下面是一些可能的原因及对应的解决方案:

可能原因及解决方案

  1. 资源限制或并发冲突
    • 原因:在执行脚本时,如果系统资源(如CPU、内存或I/O)紧张,或者与其他任务并发执行时产生资源竞争,可能导致Impala查询或作业执行虽成功但因资源不足未正确完成。
    • 解决方案:监控资源使用情况,适当调整任务的执行时间窗口以避免高峰时段,增加资源限制或优化资源分配策略。
  2. Impala缓存问题
    • 原因:Impala使用缓存来加速查询,有时候缓存中的数据可能已过期或不完整,导致查询结果不准确。
    • 解决方案:在执行重要查询前,考虑清空或刷新Impala的查询缓存,或在查询语句中使用INVALIDATE METADATA命令来强制重新加载表的元数据。
  3. 数据一致性问题
    • 原因:如果数据在查询执行过程中被其他任务修改(尤其是在分布式环境下),可能导致查询结果不一致。
    • 解决方案:确保数据操作的原子性和一致性,使用事务控制,或在查询时锁定表(如果适用)以避免数据并发修改问题。
  4. Impala版本或配置问题
    • 原因:特定的Impala版本或配置设置可能导致某些查询行为不符合预期。
    • 解决方案:检查Impala的版本和配置,确保使用的是稳定且支持当前查询特性的版本,并根据官方文档或社区反馈调整相关配置。
  5. 网络或连接问题
    • 原因:瞬时的网络波动或连接问题可能导致查询虽然提交成功,但在数据传输阶段出现问题。
    • 解决方案:检查网络连接稳定性,确保Impala服务端和客户端之间的通信没有问题。优化网络配置,如增加超时时间,使用更稳定的网络连接方式。
  6. 脚本逻辑问题
    • 原因:离线脚本自身可能存在逻辑缺陷,比如依赖的数据源在某些条件下为空,导致查询看似成功但实际上没有返回数据。
    • 解决方案:审查脚本逻辑,增加必要的错误处理和日志记录,确保脚本在各种数据情况下都能正确执行。进行单元测试或集成测试以验证脚本逻辑的健壮性。

综合建议

  • 增加日志记录:在Impala脚本和DolphinScheduler任务中增加详细的日志记录,以便于问题发生时追踪问题根源。
  • 监控与报警:实施全面的系统和任务执行监控,设置合理的报警机制,一旦发现异常及时介入。
  • 定期维护与检查:定期检查系统配置、资源使用情况和软件版本,进行必要的维护和升级。

综合解决方案可参照:
海豚调度器自动监测每日报表及自动重跑异常工作流(综合应用可用代码

作者 east
Impala 6月 14,2024

如何查看Impala集群的状态和日志

查看Impala集群状态

  1. 使用Impala Shell
    • 登录到任何集群节点,通过Impala Shell可以查询集群状态。执行命令 invalidate metadata; 可以强制Impala重新加载元数据,有助于识别任何元数据同步问题。此外,可以运行简单的SQL查询(如 SELECT * FROM some_table LIMIT 1;)来测试连接和查询功能。
  2. Impala Web UI
    • 访问Impala的Web界面可以直观地查看集群状态、查询历史、性能指标等。
    • 访问Catalogd UI:在EMR控制台或直接通过集群IP和端口访问Catalogd组件的Web UI。通常端口号可能是25020,具体取决于你的集群配置。进入 /metrics 标签页查看详细信息。
    • Impala Daemon UI:如果有配置,也可以通过Impalad的Web界面(通常端口是25000或25005)查看特定节点的运行状态。
  3. Statestored状态
    • 通过Statestored守护进程的状态可以了解所有Impalad实例的健康状况。尽管直接访问Statestored的Web UI不太常见,但可以通过Impala的管理命令或日志来间接判断其状态。

查看Impala日志

  1. 日志文件位置
    • Impala的日志文件通常位于每个节点的特定目录下,例如 /var/log/impala/。具体路径可能因安装配置不同而有所差异。
    • 主要有三类日志:Impalad(Impala守护进程)、Statestored(状态存储守护进程)和Catalogd(元数据服务)的日志。
  2. 查看日志内容
    • 使用SSH登录到集群中的任一节点,然后使用文本编辑器(如vim或less)查看相关日志文件。
    • 例如,查看Impalad的日志可以使用 less /var/log/impala/impalad.INFO,具体文件名可能包含日期和时间戳,如 impalad.INFO.20240614。
  3. 日志分析
    • 日志中通常包含了查询执行的详细信息、错误消息、警告和其他诊断信息。如果遇到问题,可以搜索关键词如 “ERROR”、“WARN” 或具体的错误码来定位问题。
    • 使用grep、awk等命令行工具可以帮助快速筛选和分析日志内容。

实用命令和工具

  • impala-admin 工具:Impala提供了一些管理命令,如 impala-admin 可以用来收集诊断信息,运行健康检查等。
  • impala-shell 的 SHOW 命令:在Impala Shell中使用 SHOW 命令可以查看集群的许多信息,如 SHOW DATABASES;, SHOW TABLES;, SHOW FUNCTIONS; 等。
作者 east
海豚调度器 6月 14,2024

海豚调度器(DolphinScheduler)修改时区为东八区

海豚调度器设置了定时,执行的时间和设置时间不同,后来排查发现是时区问题。可以用下面方法和步骤来修改:

修改DolphinScheduler服务器时区

  1. 登录服务器:首先,通过SSH或其他方式登录到运行DolphinScheduler服务的服务器上。
  2. 查看当前时区:执行以下命令查看服务器当前的时区设置:Bash1timedatectl或Bash1date
  3. 修改时区:如果需要修改,可以使用以下命令将时区设置为您所需的时区。例如,要设置为上海时区(Asia/Shanghai),执行:sudo timedatectl set-timezone Asia/Shanghai或对于较旧的系统,可能需要使用:sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  4. 重启服务:修改时区后,可能需要重启DolphinScheduler以及相关依赖服务(如MySQL)以确保新时区生效。

修改DolphinScheduler界面配置时区

  1. 登录DolphinScheduler Web UI:使用管理员账号登录DolphinScheduler的Web界面。
  2. 访问系统设置:导航至系统管理 > 系统设置。
  3. 修改时区:在系统设置页面中,找到“时区设置”部分,从下拉菜单中选择正确的时区。确保这个时区设置与您之前在服务器上设置的时区相匹配。
  4. 保存设置:修改完成后,记得点击“保存”按钮使更改生效。

如果是一些老版本的海豚调度器,是没有上面的设置的,需要修改配置文件:

  1. 找到application.properties配置文件:
    • 在海豚调度器的部署目录中,找到conf文件夹。
    • 在conf文件夹中,找到名为application.properties的配置文件。
  2. 编辑application.properties文件:
    • 使用文本编辑器打开application.properties文件。
    • 在文件中找到以下行:spring.jackson.time-zone=Asia/Shanghai这一行表示默认的时区设置为亚洲/上海时区。根据您的需求,将其更改为所需的时区。例如,如果您想使用美国东部标准时间,可以将其更改为:spring.jackson.time-zone=America/New_York
    • 保存并关闭文件。
  3. 重启海豚调度器服务:
    • 为了使时区设置立即生效,您需要重启海豚调度器的服务。
    • 根据您的部署方式(如Docker、Kubernetes或手动部署),执行相应的命令来重启海豚调度器服务。
  4. 验证时区设置:
    • 重启服务后,重新登录到海豚调度器管理界面。
    • 创建一个新的定时任务,并设置一个未来的执行时间。
    • 观察并记录任务实际执行的时间,以确保时区设置已正确应用。
作者 east
python 6月 14,2024

python2.7格式化数据库返回日期字段

数据库不同表的日期字段格式多种多样,有的日期字段定义为date、datetime,有的定义varchar(16)返回unicode类型,有的是yyyyMMdd格式,有的是yyyy-MM-dd格式,要统一格式化为
yyyy-MM-dd格式 。
在Python 2.7中,str 和 unicode 是两种不同的字符串类型。 但在
 Python 3,那么 unicode 类型已经被移除,str 类型现在就是 Unicode 字符串,因此不需要对 unicode 进行特殊处理。在 Python 3 中,你可以直接使用 str 来检查所有字符串类型。 参考源代码如下:

def format_date(date_input):
    # 首先尝试最常见的预期格式
    if isinstance(date_input, unicode):  # Python 2.7特有的检查
        date_input = date_input.encode('utf-8')  # 转换unicode为str
    if isinstance(date_input, datetime):
        return date_input.strftime('%Y-%m-%d')
    elif isinstance(date_input, date):
        return date_input.strftime('%Y-%m-%d')
    elif isinstance(date_input, str):  # 在Python 2.7中使用basestring
        try:
            return datetime.strptime(date_input, '%Y-%m-%d').strftime('%Y-%m-%d')
        except ValueError:
            return datetime.strptime(date_input, '%Y%m%d').strftime('%Y-%m-%d')
        except ValueError:
            # 如果常见的格式不匹配,尝试去掉可能的前后空格再次匹配
            # 注意:这里没有提供额外的格式匹配,因为表结构明确了'%Y-%m-%d'
            # 如果确实需要处理其他格式,请在此处添加额外的尝试逻辑
            raise TypeError("Unsupported date type: %s with value %s" % (type(date_input), date_input))
    else:
        raise TypeError("Unsupported date type: %s with value %s" % (type(date_input), date_input))
作者 east

1 2 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.