Windows VS2008 使用 protobuf(version2.5.0) 的实例

本文详细介绍如何搭建Protobuf开发环境,包括下载安装、编译配置等步骤,并通过示例代码演示如何使用C++进行序列化与反序列化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


示例代码下载地址:http://download.youkuaiyun.com/detail/jff316948714/7510243


第一步:下载 protobuf-2.5.0.zip  地址:http://download.youkuaiyun.com/detail/jff316948714/7510231


第二步:解压 并 打开 路径下的 protobuf-2.5.0\vsprojects\protobuf.sln 工程


第三步:运行 extract_includes.bat 文件,生成 include 文件夹


第四步:编译其中的 libprotobuf 和 protoc 工程(编译 protoc 工程时,如果有误,请注意观察错误原因,我这里报错缺少 libprotoc.lib ,所以编译完 libprotoc 后在编译一遍 protoc ,成功),生成 Debug 文件夹

 


第四步:新建一个 pbtest 的 控制台工程,并将上面生成的 include文件夹、 Debug 文件夹下 的  libprotobuf.lib 和 protoc.exe 三个文件放到我们新建的工程目录下。


第五步:新建一个 build.bat 文件 和 person.proto 文件 (notepad++ 创建、保存、添加后缀名即可   根据个人爱好,工具自选),并放到我们的工程目录下,与 protoc.exe 在同一路径下。 build.bat 文件 和 person.proto 文件文件内容如下:

                               

这个应该很好理解吧! 运行build.bat 文件 protoc.exe 会编译 person.proto 文件 --cpp_out 是生成文件的类型为 C++ 类型,除此之外还可以生成 java 类型 , python 类型, =../ 是输出路径,他会输出到 build.bat 的上一层目录下。

运行build.bat文件,将会在build.bat的上层目录下生成 perso.pb.h 和 person.pb.cc 两个文件。


至此,我们的工程目录下的文件应该有 如下内容:看图 



第六步:配置我们的工程属性信息:

项目右击 ---> 属性 ---> 链接器 ---> 输入 ---> 附加依赖项 ---> 添加 libprotobuf.lib

项目右击 ---> 属性 --->C/C++ ---> 附加包含目录 ---> 引入 我们添加的 include 文件(例:D:\VisualProject_08\pbtest\pbtest\include)


第七步:完事具备,只差代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "person.pb.h"

using namespace std;

#pragma comment (lib, "libprotobuf.lib")


int _tmain(int argc, _TCHAR* argv[])
{
	//GOOGLE_PROTOBUF_VERIFY_VERSION;

	Person person;
	person.set_id(8888);
	person.set_name("Kobe");
	person.set_email("1990@qq.com");

	//将数据写到person.pb文件
	fstream out("person.xml", ios::out | ios::binary | ios::trunc);
	person.SerializeToOstream(&out);
	out.close();

	//从person.pb文件读取数据
	fstream in("person.xml", ios::in | ios::binary);
	if (!person.ParseFromIstream(&in)) {
		cerr << "Failed to parse person.xml." << endl;
		exit(1);
	}

	cout << "ID: " << person.id() << endl;
	cout << "name: " << person.name() << endl;
	if (person.has_email()) {
		cout << "e-mail: " << person.email() << endl;
	}

	getchar();

	return 0;
}


编译无误,运行输出:



protocol Buffer 概述请查看:

http://baike.baidu.com/link?url=FXIwsk0G0imMeqap3LAmiajkI9Rk5bhHD-YuLIwhIuXWqJl8JyBBZPNzzmwoKxLbMzkJtgAwtnlneIrBfknghK

E:\60061\6006\.venv\Scripts\python.exe -X pycache_prefix=C:\Users\60193\AppData\Local\JetBrains\PyCharm2024.3\cpython-cache "D:/app/PyCharm 2024.3.2/plugins/python-ce/helpers/pydev/pydevd.py" --multiprocess --qt-support=auto --client 127.0.0.1 --port 52064 --file E:\60061\6006\main.py 已连接到 pydev 调试器(内部版本243.23654.177)Ivy Default Cache set to: C:\Users\60193\.ivy2\cache The jars for the packages stored in: C:\Users\60193\.ivy2\jars :: loading settings :: url = jar:file:/E:/60061/6006/.venv/Lib/site-packages/pyspark/jars/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml org.elasticsearch#elasticsearch-spark-30_2.12 added as a dependency :: resolving dependencies :: org.apache.spark#spark-submit-parent-83c4dc50-e480-436a-860b-83a4536b8e9b;1.0 confs: [default] found org.elasticsearch#elasticsearch-spark-30_2.12;7.17.13 in central found org.scala-lang#scala-reflect;2.12.8 in central found org.slf4j#slf4j-api;1.7.6 in central found commons-logging#commons-logging;1.1.1 in central found javax.xml.bind#jaxb-api;2.3.1 in central found com.google.protobuf#protobuf-java;2.5.0 in central found org.apache.spark#spark-yarn_2.12;3.0.1 in central :: resolution report :: resolve 289ms :: artifacts dl 10ms :: modules in use: com.google.protobuf#protobuf-java;2.5.0 from central in [default] commons-logging#commons-logging;1.1.1 from central in [default] javax.xml.bind#jaxb-api;2.3.1 from central in [default] org.apache.spark#spark-yarn_2.12;3.0.1 from central in [default] org.elasticsearch#elasticsearch-spark-30_2.12;7.17.13 from central in [default] org.scala-lang#scala-reflect;2.12.8 from central in [default] org.slf4j#slf4j-api;1.7.6 from central in [default] --------------------------------------------------------------------- | | modules || artifacts | | conf | number| search|dwnlded|evicted|| number|dwnlded| --------------------------------------------------------------------- | default
最新发布
03-22
<think>好的,我现在需要解决用户关于PySpark、elasticsearch-spark和Scala之间的依赖解析及版本信息的问题。首先,用户提供的pom文件里使用的是elasticsearch-spark-30_2.12版本7.12.0,但遇到了Provider类无法实例化的错误。我需要分析可能的原因,并给出正确的依赖配置建议。 首先,我应该确认各个组件之间的版本兼容性。Elasticsearch Spark连接器的版本需要与Spark和Scala的版本匹配。例如,用户使用的是Spark 3.0和Scala 2.12,所以对应的elasticsearch-spark连接器应该是针对Spark 3.0和Scala 2.12编译的。用户当前的依赖是elasticsearch-spark-30_2.12:7.12.0,这看起来是正确的,因为版本号中的30代表Spark 3.02.12是Scala版本,而7.12.0是连接器的版本。但用户遇到了问题,可能需要检查是否有版本冲突或者依赖的其他库不兼容。 接下来,我需要回忆Elasticsearch官方文档中的兼容性说明。根据引用[1],Elasticsearch Hadoop的版本需要与Elasticsearch服务器版本一致。用户使用的是ES 7.3,但连接器版本是7.12.0,这可能会导致兼容性问题。建议将连接器版本调整为与ES服务器相同的7.3.x版本,或者升级ES到7.12.x以确保兼容。 然后,检查用户提供的错误信息:“Provider org.apache.hadoop.hdfs.DistributedFileSystem could not be instantiated”。这可能与Hadoop的依赖有关。用户的项目中可能缺少Hadoop相关的库,或者版本不匹配。需要确认是否添加了正确的Hadoop客户端依赖,并且版本与Spark和Elasticsearch连接器兼容。例如,Spark 3.0通常与Hadoop 3.2或更高版本兼容,可能需要添加对应的依赖。 对于PySpark用户,虽然主应用是用Python写的,但底层依赖仍然涉及Scala和Java库。因此,必须确保elasticsearch-spark的Scala版本(如2.12)与Spark的Scala版本一致。用户的环境是Scala 2.12,所以连接器的_2.12后缀正确。 另外,用户提到引用[3]中使用了Python将Spark数据导入ES的例子,这时候需要确保Python环境中通过PySpark正确加载了相关的JAR包。可能需要通过--packages参数指定elasticsearch-spark的坐标,或者在spark-submit时包含该JAR。 总结可能的解决方案步骤:首先确认Elasticsearch服务器和连接器版本一致;检查Hadoop依赖是否正确添加;确保Scala版本匹配;在PySpark中正确配置依赖。此外,用户问题中的pom文件是Scala项目的配置,但用户可能同时在使用PySpark,需要注意两者依赖的一致性。 最后,生成相关问题,帮助用户深入理解依赖管理和解决类似问题。</think>在PySpark项目中集成Elasticsearch时,依赖解析需要确保以下组件版本兼容: ### 1. 核心依赖关系 - **Spark 3.0.x** 需要对应 `elasticsearch-spark-30` 前缀的连接器 - **Scala 2.12** 需体现在依赖的`_2.12`后缀中 - **Elasticsearch Server版本** 应与连接器主版本一致(如ES 7.x对应7.x连接器) 正确Maven依赖示例: ```xml <!-- Spark 3.0 + Scala 2.12 + ES 7.3 推荐配置 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-30_2.12</artifactId> <version>7.3.2</version> <!-- 需与ES服务端版本对齐 --> </dependency> ``` ### 2. 版本匹配原则 | 组件 | 要求 | 用户当前配置 | 推荐修正 | |--------------------|-----------------------------|-------------------|--------------------| | Spark版本 | 3.0.x | ✅ 3.0 | 保持 | | Scala版本 | 2.12 | ✅ 2.12 | 保持 | | ES连接器版本 | 与ES服务端主版本一致 | ❌ 7.12.0(ES7.3) | 改为7.3.x系列 | | Hadoop依赖 | 需显式声明兼容版本 | ❌ 未明确声明 | 添加Hadoop 3.2依赖 | ### 3. 常见问题解析 **问题现象**: `Provider org.apache.hadoop.hdfs.DistributedFileSystem could not be instantiated`[^2] **解决方案**: 1. 添加显式Hadoop依赖: ```xml <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.0</version> </dependency> ``` 2. 检查依赖冲突: ```bash mvn dependency:tree -Dverbose ``` ### 4. PySpark特殊配置 在Python环境中使用时,需通过`--packages`加载JAR: ```bash pyspark --packages org.elasticsearch:elasticsearch-spark-30_2.12:7.3.2 ``` 或通过`spark.jars.packages`配置: ```python spark = SparkSession.builder \ .config("spark.jars.packages", "org.elasticsearch:elasticsearch-spark-30_2.12:7.3.2") \ .getOrCreate() ``` ### 5. 版本兼容对照表 | ES服务端版本 | 连接器版本 | Spark支持 | Scala版本 | |-------------|-------------|------------------|-----------| | 7.3.x | 7.3.2 | Spark 3.0-3.2 | 2.12 | | 7.12.x | 7.12.0 | Spark 3.0+ | 2.12 | | 8.x | 8.5.0 | Spark 3.3+ | 2.12/2.13 | 建议优先采用官方验证过的组合,如ES 7.3.x搭配连接器7.3.x系列[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值