`
sunbin
  • 浏览: 356353 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hadoop高可用集群搭建-1

 
阅读更多

一、服务器访问环境

hadoop服务器4台主机,均使用ubuntu18-live-server版本,

本地localhost免密登录

ssh localhost步骤

1、ssh-keygen -t rsa

免密码登录

使用下面的命令即可免密码登录localhost

 

2、ssh-copy-id localhost

但是到了这里执行ssh localhost的时候依然提示我输入密码。我仔细分析了原因,一般来讲失败的原因有两个。

 

服务器之间免密登录

1、根据路径复制公钥到免密登录的主机

  scp id_rsa.pub 账号@hostip:/rootpath/.ssh/zkhd1

2、复制公钥到authorized_key

 cat zkhd1 >>authorized_keys

也可用ssh-copy-id -i ~/.ssh/id_rsa.pub  root@spark1

 

所有文件放置在/opt/sgb内

1、先授权4台主机opt所有权限 sudo chmod 777 /opt

2、第一台主机操作 cd /opt

3、第一台主机操作 mkdir sgb

 

hosts文件配置

注意注意注意

注释掉  #127.0.1.1 zkhd1 否则通过器名本机外机器不能访问服务

四台主机内网名称设置

 

192.168.2.161  zkhd1
192.168.2.162  zkhd2
192.168.2.163  zkhd3
192.168.2.164  zkhd4
 

 

 

 

 

二、java/hadoop环境搭建、以下先配置一台主机

 

1、解压hadoop-2.6.5.tar.gz  jdk-7u67-linux-x64.tar.gz文件

   tar xf hadoop-2.6.5.tar.gz

   tar xf jdk-7u67-linux-x64.tar.gz

2、配置环境变量

sudo vi /etc/profile

配置以下参数

 

export JAVA_HOME=/opt/sgb/jdk1.7.0_67
export JRE_HOME=/opt/sgb/jdk1.7.0_67/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export HADOOP_PREFIX=/opt/sgb/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
 

 

source  /etc/profile

输入命令行下查看配置是否生效

hdfs

java

 

三、hadoop伪分布式

hadoop-env.sh

yarn-env.sh

mapred-env.sh

export JAVA_HOME=/opt/sgb/jdk1.7.0_67

 

hdfs-site.xml

 

<configuration>

    <property>

        <name>dfs.replication</name>

        <value>1</value>

    </property>

</configuration>
 

 

 

core-site.xml

 

<configuration>

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://zkhd1:9000</value>

    </property>

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/opt/dd</value>

    </property>

</configuration>
 

 

 

格式化

$ bin/hdfs namenode -format

启动服务

$ sbin/start-dfs.sh

查看进程

$ jps

  NameNode

  DataNode

  SecondaryNameNode

 

新建文件夹

$ bin/hdfs dfs -mkdir /user

上传文件

$ bin/hdfs dfs -put etc/hadoop input

运行任务

$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar grep input output 'dfs[a-z.]+'

下载运行结果

$  bin/hdfs dfs -get output output

关闭服务

$ sbin/stop-dfs.sh

 

 

三、分布式配置

1、备份目前的hadoop目录文件夹至hadoop-2.6.5-bk,开发可以使用伪分布式测试

cp -rf   /opt/sgb/hadoop-2.6.5    /opt/sgb/hadoop-2.6.5-bk

 

 

2、修改slaves 配置datanode从节点、zkhd1不需要配置

zkhd2

zkhd3

zkhd4

 

3、修改hdfs-site.xml配置secondnamenode,副本数2

 

 

<property>

        <name>dfs.namenode.secondary.http-address</name>

        <value>zkhd2:50090</value>

    </property>

<property>

        <name>dfs.replication</name>

        <value>2</value>

    </property>
 

 

4、删除已格式化节点/opt/dd

rm -rf  /opt/dd

 

5、分发服务器

    A、分发sgb文件夹  包含java、hadoop目录

scp -rf sgb skhd2:/opt/

scp -rf sgb skhd3:/opt/

scp -rf sgb skhd4:/opt/

B、分发配置文件,每台机器均要添加

 

sudo vi /etc/profile

配置以下参数

 

export JAVA_HOME=/opt/sgb/jdk1.7.0_67
export JRE_HOME=/opt/sgb/jdk1.7.0_67/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export HADOOP_PREFIX=/opt/sgb/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin
 

 

source  /etc/profile

输入命令行下查看配置是否生效

hdfs

java

 

6、主服务器格式化

$ bin/hdfs namenode -format

启动服务

$ sbin/start-dfs.sh

 

 

至此本地集群方式的hadoop hdfs可以使用

 

四、高可用hadoop集群改造

 

 

 hosts     NameNode-1   NameNode-2    DataNode         ZK   ZKFC     JNN
zkhd1         有                                             有      有
zkhd2                     有            有             有    有      有 
zkhd3                                   有             有            有
zkhd4                                   有             有                
 

 

 

1、zookeeper配置

1.1、解压zookeeper到/opt/sgb文件夹

tar xf zookeeper-3.4.6.tar.gz

1.2、修改/zookeeper-3.4.6/conf/zoo.cfg

dataDir=/opt/sgb/zk

server.1=zkhd2:2888:3888

server.2=zkhd3:2888:3888

server.3=zkhd4:2888:3888

1.3、在/opt/sgb/zk路径执行以下命令,id根据服务器id做调整

   mkdir zk

   echo 1 > myid

   zkhd2上执行echo 2 > myid

   zkhd3上执行 echo 3 > myid

   

1.4、环境变量配置   sudo vi /etc/profile

export JAVA_HOME=/opt/sgb/jdk1.7.0_67

export JRE_HOME=/opt/sgb/jdk1.7.0_67/jre

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export HADOOP_PREFIX=/opt/sgb/hadoop-2.6.5

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$PATH

export ZOOKEEPER_HOME=/opt/sgb/zookeeper-3.4.6

export ZOOBINDIR=$ZOOKEEPER_HOME/bin

export PATH=$ZOOBINDIR:$PATH

 

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

2、hadoop配置修改

     2.1、hdfs-site.xml

 <configuration>
		<property>
			<name>dfs.replication</name>
			<value>2</value>
		</property>
	<property>
		<name>dfs.data.dir</name>
		<value>/opt/sgb/ha/data</value> 
		<final>true</final> 
    </property> 
    <property> 
		<name>dfs.name.dir</name>
		<value>/opt/sgb/ha/name</value> 
		<final>true</final> 
	</property>
//////////////////////////namenode配置
		<property>
			<name>dfs.nameservices</name>
			<value>mycluster</value>
		</property>
		<property>
			<name>dfs.ha.namenodes.mycluster</name>
			<value>nn1,nn2</value>
		</property>
		<property>
			<name>dfs.namenode.rpc-address.mycluster.nn1</name>
			<value>zkhd1:8020</value>
		</property>
		<property>
			<name>dfs.namenode.rpc-address.mycluster.nn2</name>
			<value>zkhd2:8020</value>
		</property>
		<property>
			<name>dfs.namenode.http-address.mycluster.nn1</name>
			<value>zkhd1:50070</value>
		</property>
		<property>
			<name>dfs.namenode.http-address.mycluster.nn2</name>
			<value>zkhd2:50070</value>
		</property>
///////////////////////////jnn配置
		<property>
			<name>dfs.namenode.shared.edits.dir</name>
			<value>qjournal://zkhd1:8485;zkhd2:8485;zkhd3:8485/mycluster</value>
		</property>
		<property>
			<name>dfs.journalnode.edits.dir</name>
			<value>/opt/sgb/jn</value>
		</property>
		<property>
			<name>dfs.client.failover.proxy.provider.mycluster</name>
			<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
		</property>
		<property>
			<name>dfs.ha.fencing.methods</name>
			<value>sshfence</value>
		</property>
///////////////////////免密登录
		<property>
			<name>dfs.ha.fencing.ssh.private-key-files</name>
			<value>/home/hadoop/.ssh/id_rsa</value>
		</property>
///////////////////////集群自动恢复
		<property>
			<name>dfs.ha.automatic-failover.enabled</name>
			<value>true</value>
		</property>
	</configuration>
 

 

 

============================================================================================

2.2、 core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/sgb/ha</value>
</property>
////////////////////////zookeeper集群配置
<property>
<name>ha.zookeeper.quorum</name>
<value>zkhd2:2181,zkhd3:2181,zkhd4:2181</value>
</property>
</configuration>

 

 

3、集群分发

 sudo scp -r sgb hadoop@zkhd2:/opt/

 sudo scp -r sgb hadoop@zkhd3:/opt/

 sudo scp -r sgb hadoop@zkhd4:/opt/

配置文件分发

export JAVA_HOME=/opt/sgb/jdk1.7.0_67

export JRE_HOME=/opt/sgb/jdk1.7.0_67/jre

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export HADOOP_PREFIX=/opt/sgb/hadoop-2.6.5

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$HADOOP_PREFIX/sbin:$PATH

export ZOOKEEPER_HOME=/opt/sgb/zookeeper-3.4.6

export ZOOBINDIR=$ZOOKEEPER_HOME/bin

export PATH=$ZOOBINDIR:$PATH

 

 

4、zookeepr配置zkhd2:zkhd3:zkhd4启动zookeeper集群

zkServer.sh start   ||   zkServer.sh status

5、按qjournal://zkhd1:8485;zkhd2:8485;zkhd3:8485/mycluster配置依次执行,启动journalnode

   ./sbin/hadoop-daemon.sh start journalnode

6、主namenode 执行格式化

    hdfs namenode  -format

7、启动主节点 ./sbin/hadoop-deamon.sh start namenode

8、同步副节点  hdfs namenode  -bootstrapStandby

9、注册hdfs到zookee,执行   hdfs zkfc -formatZK

10、启动集群 start-dfs.sh

11、其他操作

stop-dfs.sh && start-dfs.sh  ||  hadoop-daemon.sh start zkfc

------------------------------------------------------------------------------------------------------------------

mapreduce集群

 

 

      nn-1   nn-2  dn  zk  zkfc  jnn   rs  nm

1           *                            *       *

2                     *     *    *     *       *            *                    

3                            *    *              *     *     *                  

4                            *    *                     *     *                

 

1、配置文件修改mapred-site.xml:

 

<configuration>

    <property>

        <name>mapreduce.framework.name</name>

        <value>yarn</value>

    </property>

</configuration>

 

2、配置文件修改etc/hadoop/yarn-site.xml:

<configuration>

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

  <property>

   <name>yarn.resourcemanager.ha.enabled</name>

   <value>true</value>

 </property>

 <property>

   <name>yarn.resourcemanager.cluster-id</name>

   <value>cluster1</value>

 </property>

 <property>

   <name>yarn.resourcemanager.ha.rm-ids</name>

   <value>rm1,rm2</value>

 </property>

 <property>

   <name>yarn.resourcemanager.hostname.rm1</name>

   <value>zkhd3</value>

 </property>

 <property>

   <name>yarn.resourcemanager.hostname.rm2</name>

   <value>zkhd4</value>

 </property>

 <property>

   <name>yarn.resourcemanager.zk-address</name>

   <value>zkhd2:2181,zkhd3:2181,zkhd4:2181</value>

 </property>

</configuration>

 3、分发

scp   mapred-site.xml yarn-site.xml    zkhd2:`pwd`

scp   mapred-site.xml yarn-site.xml    zkhd3:`pwd`

scp   mapred-site.xml yarn-site.xml    zkhd4:`pwd`

4、启动服务

  $ sbin/start-yarn.sh  //nodemanager

  $ yarn-deamon.sh start resourcemanager   // resourcemanager

  $ sbin/stop-yarn.sh

 

 

 

hadoop jar hadoop-mapreduce-examples.jar wordcount   /user/test/txt  /wordout 

 

------------------------------------------------------

集群重启

1、2/3/4  zkServer start

2、1  start-all.sh

3、3/4  yarn-daemon.sh start resourcemanager/nodemanager

-----------------------------------------------------

 

eclipse hadoop访问异常:

org.apache.hadoop.security.AccessControlException: Permission denied: user=hadoop, access=WRITE

解决方法:在hdfs-site.xml里加入下面的
    dfs.permissions 
 

 

   false 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    平原型生活垃圾填埋场扩容措施研究及应用_刘志刚.pdf

    平原型生活垃圾填埋场扩容措施研究及应用_刘志刚.pdf

    跨模型迁移指南:将OpenAI项目快速适配DeepSeekAPI.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    智能推荐系统实战:DeepSeekAPI在电商场景的个性化排序应用.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    成本控制秘籍:DeepSeekAPI计费机制与优化方案全解.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    Wallpaper Engine 壁纸一键提取

    Wallpaper Engine 是一款广受欢迎的动态壁纸软件,允许用户将各种动态、交互式壁纸应用到桌面上。其丰富的创意工坊内容让用户可以轻松下载和分享个性化的壁纸。而“一键提取”功能则是 Wallpaper Engine 中一个非常实用的工具,能够帮助用户快速提取和保存壁纸资源,方便后续使用或分享。

    性价比革命:DeepSeekAPI成本仅为GPT-4的3%的技术揭秘.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    本地部署DeepSeek模型:API调用与自有算力结合的混合架构设计.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    这是一份非常有意义的实习报告

    这是一份非常有意义的实习报告

    用Python玩转DeepSeek:代码生成接口的10个实战案例.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    爱华AIWA HS-J9磁带随身听维修服务手册 说明书电路原理图PCB图

    爱华AIWA HS-J9磁带随身听维修服务手册 说明书电路原理图PCB图

    从ChatGPT到DeepSeek:API迁移指南与参数映射对照表.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    房屋租赁合同[示范文本].doc

    房屋租赁合同[示范文本].doc

    智能体开发:将DeepSeekAPI集成到知识库系统的全流程.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    单片机 入门学习视频教程 自学资料

    单片机 入门学习视频教程 自学资料

    模型定制化实战:基于DeepSeek的行业术语微调教程.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    5个提升DeepSeekAPI生成质量的调参技巧,开发者必看!.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    参数调优手册:temperature和top_p对输出结果的影响实验.pdf

    在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!

    auto_gptq-0.5.1.tar.gz

    auto_gptq-0.5.1.tar.gz

    贪心算法7日速成:LeetCode经典题型+华为机考真题.pdf

    # 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!

    结构体 struct关键字用来定义结构体

    结构体 struct关键字用来定义结构体

Global site tag (gtag.js) - Google Analytics