首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【九】Hadoop3.3.4HA高可用配置

【九】Hadoop3.3.4HA高可用配置

作者头像
火之高兴
发布于 2024-08-06 02:24:17
发布于 2024-08-06 02:24:17
35300
代码可运行
举报
运行总次数:0
代码可运行

1.高可用基本原理

1.NameNode 高可用性

Hadoop 生态系统中,NameNode 是文件系统的中心管理器,负责管理 HDFS 的元数据。为了避免单点故障(Single Point of Failure,SPOF),Hadoop 引入了 NameNode 的高可用性架构。主要组件包括:

主备 NameNode
  • Active NameNode:当前负责处理客户端请求并管理 HDFS 元数据。
  • Standby NameNode:处于热备状态,与 Active NameNode 保持同步,但不处理客户端请求。当 Active NameNode 故障时,Standby NameNode 会接管。
JournalNode
  • 作用:JournalNode 充当共享存储的角色,记录 NameNode 的编辑日志(edits log)。
  • 机制:当 Active NameNode 接收到客户端请求时,它会将操作记录到 JournalNode 集群中。Standby NameNode 也会从 JournalNode 中读取这些编辑日志,以保持元数据的同步。

2.Zookeeper 协调

Zookeeper 在 Hadoop HA 架构中用于管理 NameNode 的选主(leader election)和状态协调。它帮助确定当前哪个 NameNode 是 Active 的,并在故障发生时进行切换。

3.Quorum Journal Manager (QJM)

QJM 是管理 JournalNode 的组件,确保在集群中至少一半以上的 JournalNode 写入成功后,操作才被认为是持久化成功的。

4.Failover 控制器

Hadoop HA 中的 Failover 控制器(比如 ZKFailoverController)用于自动化主备 NameNode 的切换。它监控 Active NameNode 的健康状态,当检测到故障时,会自动切换到 Standby NameNode。

5.元数据共享

  • 共享编辑日志:通过 JournalNode,所有 NameNode 共享同一个编辑日志,以保持一致性。
  • 共享的状态(Namespace):Active 和 Standby NameNode 共享相同的命名空间,Standby NameNode 通过读取 JournalNode 的日志来不断更新其命名空间,以保持与 Active NameNode 的一致性。

6.检查点机制

Standby NameNode 会定期从 JournalNode 读取编辑日志,并将它们应用到自己的内存中。与此同时,它还会创建新的检查点(checkpoint),以减少系统重启时的恢复时间。

7.切换过程

  • 故障检测:如果 Active NameNode 出现故障,Zookeeper 和 Failover 控制器会检测到并启动切换过程。
  • 切换到 Standby NameNode:Standby NameNode 被激活并接管所有客户端请求。
  • 恢复过程:故障的 Active NameNode 恢复后,会被设置为新的 Standby NameNode,等待下次切换。

这种 HA 架构确保了即使一个 NameNode 发生故障,另一个 NameNode 也能迅速接管,保证 HDFS 的高可用性和数据可靠性。

2.Hadoop高可用配置

1.环境背景

当前高可用在以下三台节点组成的hadoop3.3.4集群中进行配置,当前已经完成了集群安装,hdfs的验证,并且zookeeper组件已经安装完成。

hostname

ip

ubuntu1

172.16.167.131

ubuntu2

172.16.167.132

ubuntu3

172.16.167.133

2.hdfs-site.xml

这是我当前配置 Hadoop HA(高可用)集群的hdfs-site.xml配置文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>

  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>ubuntu2:9868</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hadoop/dfs/name</value>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hadoop/dfs/data</value>
  </property>

  
  <property>
    <name>dfs.namenode.rpc-address</name>
    <value>ubuntu1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address</name>
    <value>ubuntu2:8020</value>
  </property>



  <!-- 高可用配置开始 -->
  <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>ubuntu1:8020</value>
  </property>

  <property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>ubuntu2:8020</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>ubuntu1:50070</value>
  </property>

  <property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>ubuntu2:50070</value>
  </property>

  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/usr/local/hadoop/data/journalnode</value>
  </property>

  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://ubuntu1:8485;ubuntu2:8485;ubuntu3:8485/mycluster</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>/root/.ssh/id_rsa</value>
  </property>

  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <!-- 高可用配置结束 -->

</configuration>
基本配置
  • dfs.replication:设置 HDFS 中文件的默认副本数。这里设置为 2,意味着每个文件会存储两个副本。
  • dfs.namenode.secondary.http-address:配置 Secondary NameNode 的 HTTP 地址(在 HA 配置中通常不需要)。
  • dfs.namenode.name.dir:NameNode 存储元数据的本地路径。
  • dfs.datanode.data.dir:DataNode 存储数据块的本地路径。
  • dfs.namenode.rpc-address:NameNode 的 RPC 地址。在 HA 配置中应通过服务名和节点标识来定义。
高可用配置
  • dfs.nameservices:定义 HDFS 集群的逻辑名称,这里为 mycluster
  • dfs.ha.namenodes.mycluster:定义 mycluster 集群中包含的 NameNode,这里为 nn1nn2
  • dfs.namenode.rpc-address.mycluster.nn1nn1 的 RPC 地址,提供 HDFS 服务。
  • dfs.namenode.rpc-address.mycluster.nn2nn2 的 RPC 地址。
  • dfs.namenode.http-address.mycluster.nn1nn1 的 HTTP Web 界面地址。
  • dfs.namenode.http-address.mycluster.nn2nn2 的 HTTP Web 界面地址。
  • dfs.journalnode.edits.dir:JournalNode 存储编辑日志的本地路径。
  • dfs.namenode.shared.edits.dir:共享编辑日志的路径,这里使用的是 QJM(Quorum Journal Manager)方式,路径格式为 qjournal://{host1:port};{host2:port};{host3:port}/clustername
  • dfs.client.failover.proxy.provider.mycluster:设置客户端的 failover 代理提供者类,这里使用 ConfiguredFailoverProxyProvider,用于在 NameNode 之间自动切换。
  • dfs.ha.fencing.methods:配置切断失效的 Active NameNode 的方法。这里使用 sshfence,即通过 SSH 命令来隔离失效的 NameNode。
  • dfs.ha.fencing.ssh.private-key-files:指定用于 SSH 连接的私钥文件路径。
  • dfs.ha.automatic-failover.enabled:启用自动故障转移。

3.core-site.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<configuration>
 <property>
   <name>fs.defaultFS</name>
   <value>hdfs://mycluster</value>
 </property>
 <!--2.指定hadoop 数据的存储目录默认为/tmp/hadoop-${user.name} -->
 <property>
	 <name>hadoop.tmp.dir</name>
	 <value>/home/hadoop/tmp</value>
 </property>
 <!--hive.hosts 允许 root 代理用户访问 Hadoop 文件系统设置 -->
 <property>
   <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
 </property>
 <!--hive.groups 允许 Hive 代理用户访问 Hadoop 文件系统设置 -->
 <property>
   <name>hadoop.proxyuser.root.groups</name>
   <value>*</value>
 </property>
<!-- 配置 HDFS 网页登录使用的静态用户为 root -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
  </property>
<!--配置缓存区的大小,实际可根据服务器的性能动态做调整-->
  <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
  </property>
<!--开启hdfs垃圾回收机制,可以将删除数据从其中回收,单位为分钟-->
  <property>
    <name>fs.trash.interval</name>
    <value>10080</value>
  </property>

  <!--zookeeper-->
 <property>
    <name>ha.zookeeper.quorum</name>
    <value>ubuntu1:2181,ubuntu2:2181,ubuntu3:2181</value>
 </property>


</configuration>

core-site.xml 基于高可用的配置,主要用于配置 Hadoop 的核心设置,这里重点是zookeeper的配置项要加上。以下是每个配置项的解释:

基本配置
  • fs.defaultFS
    • 设定 HDFS 的默认文件系统。这里指定为 hdfs://mycluster,表示使用高可用集群 mycluster 的 HDFS 作为默认文件系统。
  • hadoop.tmp.dir
    • 指定 Hadoop 临时数据的存储目录。默认情况下,这些数据会存储在 /tmp/hadoop-${user.name} 目录中,这里指定为 /home/hadoop/tmp
代理用户配置
  • hadoop.proxyuser.root.hosts
    • 允许 root 用户代理其他用户访问 Hadoop 文件系统的主机。* 表示允许所有主机。
  • hadoop.proxyuser.root.groups
    • 允许 root 用户代理其他用户访问 Hadoop 文件系统的用户组。* 表示允许所有用户组。
HTTP 静态用户配置
  • hadoop.http.staticuser.user
    • 配置 HDFS 网页界面的静态用户为 root。这意味着访问 HDFS Web UI 时将默认使用 root 用户身份。
I/O 配置
  • io.file.buffer.size
    • 配置文件系统 I/O 操作的缓存区大小。这里设置为 4096 字节,可根据服务器性能进行调整。
垃圾回收配置
  • fs.trash.interval
    • 开启 HDFS 垃圾回收机制的时间间隔,单位为分钟。这里设置为 10080 分钟(即 7 天)。在该时间段内删除的数据可以从回收站中恢复。
ZooKeeper 配置
  • ha.zookeeper.quorum
    • 指定用于 Hadoop HA 配置的 ZooKeeper 集群的主机和端口。这里指定的三个 ZooKeeper 实例分别运行在 ubuntu1ubuntu2ubuntu3 上,端口号为 2181。

3.分发配置文件

修改完hdfs-site.xmlcore-site.xml一定要向集群中所有节点分发。

4.启动集群

由于更改了配置文件,所以要关闭集群再重启才能使高可用生效。

1.关闭集群

将hadoop集群所有组件停止服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stop-all.sh

2.zookeeper的启动

要保证zookeeper进程在后台运行,QuorumPeerMain需要在三台节点都运行。 在三台节点执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zkServer.sh start

查看zookeeper状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zkServer.sh status

成功显示leaderfollower

3.启动HDFS服务

  • 启动journalnode

在三台节点上都要启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hdfs --daemon start journalnode

如果因为启动失败而重新配置,需要将目录中的数据删除,再次启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm -rf /usr/local/hadoop/data/journalnode/mycluster/*
  • HDFS NameNode的格式化,如果是第一次配置启动hadoop则需要格式化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hdfs namenode -format
  • 在ubuntu1共享日志文件初初始化
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hdfs namenode -initializeSharedEdits
  • 启动hdfs
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start-dfs.sh
# 或者使用群起命令
start-all.sh

如果启动时没有datanode进程,则应删除hdfs数据文件,避免clusterID冲突:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm -rf /home/hadoop/dfs/data/*
  • 在ubuntu2同步镜像数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hdfs namenode -bootstrapStandby
  • zookeeper FailerController格式化

在主节点ubuntu1执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hdfs zkfc -formatZK
  • 全部组建启动成功:

有多个ZooKeeperMain是因为我开启了一个zookeeper客户端连接,所以会有多个进程在后台。

5.测试高可用

1.检查节点状态

通过以下命令可以看到,ubuntu1为standby,ubuntu2为active

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu1:/home/guoyachao# hdfs haadmin -getServiceState nn1
2024-07-28 17:13:09,214 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
standby
root@ubuntu1:/home/guoyachao# hdfs haadmin -getServiceState nn2
2024-07-28 17:13:11,292 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
active

2.kill掉active节点

注意查看jps进程,我将ubuntu2的namenode进程kill掉,造成节点故障的现象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu2:/usr/local/hadoop/etc/hadoop# jps
89712 NameNode
63362 ZooKeeperMain
89799 DataNode
90152 Jps
88796 NodeManager
89900 JournalNode
90015 DFSZKFailoverController
66399 QuorumPeerMain
root@ubuntu2:/usr/local/hadoop/etc/hadoop# jps|grep NameNode|awk '{print $1}'|xargs kill -9
root@ubuntu2:/usr/local/hadoop/etc/hadoop# jps
63362 ZooKeeperMain
90180 Jps
89799 DataNode
88796 NodeManager
89900 JournalNode
90015 DFSZKFailoverController
66399 QuorumPeerMain

此时查看节点状态,无法连接到Ubuntu2的namenode

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu2:/usr/local/hadoop/etc/hadoop# hdfs haadmin -getServiceState nn1
2024-07-28 17:16:20,249 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
standby
root@ubuntu2:/usr/local/hadoop/etc/hadoop# hdfs haadmin -getServiceState nn2
2024-07-28 17:16:25,256 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2024-07-28 17:16:26,292 INFO ipc.Client: Retrying connect to server: ubuntu2/172.16.167.132:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From ubuntu2/172.16.167.132 to ubuntu2:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

再次启动ubuntu2的namenode,并查看高可用状态,此时ubuntu1已经完成了状态切换。回显表示ubuntu2已经切换为了standby

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@ubuntu2:/usr/local/hadoop/etc/hadoop# hdfs --daemon start namenode
root@ubuntu2:/usr/local/hadoop/etc/hadoop# hdfs haadmin -getServiceState nn2
2024-07-28 17:19:14,086 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
standby

也可以在web界面查看,ubuntu1自动完成了active的切换:

参考资料

  1. 【尚硅谷HA教程(大数据ha快速入门)】 https://www.bilibili.com/video/BV1zb411P7KY/?share_source=copy_web&vd_source=bde27502bfa0838cc98c5cf2835884aa
  2. 【CSDN HDFS高可用】:http://t.csdnimg.cn/9TkdQ
  3. 【Hadoop官方文档】https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
  4. 【Hadoop 3.3.4 HA(高可用)原理与实现(QJM)】https://www.cnblogs.com/liugp/p/16607424.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
在Win10(NT10.0系统我还试了Server2019)安装UG NX 10.0.0.24踩坑和平坑
西门子35亿欧元收购了美国UGS公司,同时把UG更名为NX,但是业界还是习惯称为UG。
Windows技术交流
2022/10/26
2.3K0
UG编程手册
准备几何(Prepare Geometry)-------------------------------(2)
用户7505898
2020/09/28
2.5K0
UG编程手册
UG编程精讲
初学者首先把每个指令特有的图标熟记,因为仔细观察,会发现图标已经将命令自身的含义表述的非常清楚,理解后更容易学习。
用户7505898
2020/09/23
1.7K0
UG编程精讲
UG编程基本操作及加工工艺
肄本章主要介绍UG编程的基本操作及相关加工工艺知识,读者学习完本章后将会对UG编程知识有一个总体的认识,懂得如何设置编程界面及编程的加工参数。另外,为了使读者在学习UG编程前具备一定的加工工艺基础,本章还介绍了数控加工工艺的常用知识。
用户7505898
2020/09/22
2.1K0
UG编程基本操作及加工工艺
FANUC-加工中心编程
通过编程并运行这些程序而使数控机床能够实现的功能我们称之为可编程功能。一般可编程功能分为两类:一类用来实现刀具轨迹控制即各进给轴的运动,如直线/圆弧插补、进给控制、坐标系原点偏置及变换、尺寸单位设定、刀具偏置及补偿等,这一类功能被称为准备功能,以字母G以及两位数字 组成,也被称为G代码。另一类功能被称为辅助功能,用来完成程序的执行控制、主轴控制、刀具控制、辅助设备控制等功能。在这些辅助功能中,Tx x用于选刀,Sx x x x用于控制主轴转速。其它功能由以字母M与两位数字组成的M代码来实现。有缘学习更多:fu置内容¥PHUX1Er9kkI¥打楷τao寶【奉献教育】知识店铺
用户7505898
2020/08/02
3K0
FANUC-加工中心编程
基于Metasploit的软件渗透测试
Windows 2000 Professional 链接:https://pan.baidu.com/s/13OSz_7H1mIpMKJMq92nEqg?pwd=upsm 提取码:upsm Win
顾翔
2022/09/23
4K0
基于Metasploit的软件渗透测试
使用计算机视觉实战项目精通 OpenCV:6~8
非刚性人脸跟踪是视频流每一帧中一组准密集的人脸特征的估计,这是一个难题,现代方法从许多相关领域借鉴了思想,包括计算机视觉,计算几何 ,机器学习和图像处理。 这里的非刚性指的是以下事实:人脸特征之间的相对距离在面部表情和整个人群之间变化,并且不同于人脸检测和跟踪,后者仅旨在在每个帧中查找面部的位置,而不是配置人脸特征。 非刚性人脸跟踪是一个流行的研究主题,已经有二十多年的历史了,但是直到最近,各种方法才变得足够鲁棒,处理器也足够快,这使得构建商业应用成为可能。
ApacheCN_飞龙
2023/04/27
1.5K0
使用计算机视觉实战项目精通 OpenCV:6~8
Oracle 错误总结及问题解决 ORA「建议收藏」
英文解析:resource busy and acquire with NOWAIT specified
全栈程序员站长
2022/09/03
24.2K0
Oracle 错误总结及问题解决 ORA「建议收藏」
c#实战教程_ps初学者入门视频
大家好,又见面了,我是你们的朋友全栈君。 C#基础教程-c#实例教程,适合初学者。 第一章 C#语言基础 本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言,还需要认真阅读有关C#语言的专著。 1.1 C#语言特点 Microsoft.NET(以下简称.NET)框架是微软提出的新一代Web软件开发模型,C#语言是.NET框架中新一代的开发工具。C#语言是一种现代、面向对象的语言,它简化了C++语言在类、命名空间、方法重载和异常处理等方面的操作,它摒弃了C++的复杂性,更易使用,更少出错。它使用组件编程,和VB一样容易使用。C#语法和C++和JAVA语法非常相似,如果读者用过C++和JAVA,学习C#语言应是比较轻松的。 用C#语言编写的源程序,必须用C#语言编译器将C#源程序编译为中间语言(MicroSoft Intermediate Language,MSIL)代码,形成扩展名为exe或dll文件。中间语言代码不是CPU可执行的机器码,在程序运行时,必须由通用语言运行环境(Common Language Runtime,CLR)中的既时编译器(JUST IN Time,JIT)将中间语言代码翻译为CPU可执行的机器码,由CPU执行。CLR为C#语言中间语言代码运行提供了一种运行时环境,C#语言的CLR和JAVA语言的虚拟机类似。这种执行方法使运行速度变慢,但带来其它一些好处,主要有:  通用语言规范(Common Language Specification,CLS):.NET系统包括如下语言:C#、C++、VB、J#,他们都遵守通用语言规范。任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,由CLR负责执行。只要为其它操作系统编制相应的CLR,中间语言代码也可在其它系统中运行。  自动内存管理:CLR内建垃圾收集器,当变量实例的生命周期结束时,垃圾收集器负责收回不被使用的实例占用的内存空间。不必象C和C++语言,用语句在堆中建立的实例,必须用语句释放实例占用的内存空间。也就是说,CLR具有自动内存管理功能。  交叉语言处理:由于任何遵守通用语言规范的语言源程序,都可编译为相同的中间语言代码,不同语言设计的组件,可以互相通用,可以从其它语言定义的类派生出本语言的新类。由于中间语言代码由CLR负责执行,因此异常处理方法是一致的,这在调试一种语言调用另一种语言的子程序时,显得特别方便。  增加安全:C#语言不支持指针,一切对内存的访问都必须通过对象的引用变量来实现,只允许访问内存中允许访问的部分,这就防止病毒程序使用非法指针访问私有成员。也避免指针的误操作产生的错误。CLR执行中间语言代码前,要对中间语言代码的安全性,完整性进行验证,防止病毒对中间语言代码的修改。  版本支持:系统中的组件或动态联接库可能要升级,由于这些组件或动态联接库都要在注册表中注册,由此可能带来一系列问题,例如,安装新程序时自动安装新组件替换旧组件,有可能使某些必须使用旧组件才可以运行的程序,使用新组件运行不了。在.NET中这些组件或动态联接库不必在注册表中注册,每个程序都可以使用自带的组件或动态联接库,只要把这些组件或动态联接库放到运行程序所在文件夹的子文件夹bin中,运行程序就自动使用在bin文件夹中的组件或动态联接库。由于不需要在注册表中注册,软件的安装也变得容易了,一般将运行程序及库文件拷贝到指定文件夹中就可以了。  完全面向对象:不象C++语言,即支持面向过程程序设计,又支持面向对象程序设计,C#语言是完全面向对象的,在C#中不再存在全局函数、全局变量,所有的函数、变量和常量都必须定义在类中,避免了命名冲突。C#语言不支持多重继承。 1.2 编写控制台应用程序 使用SDK命令行工具编写控制台程序 第一个程序总是非常简单的,程序首先让用户通过键盘输入自己的名字,然后程序在屏幕上打印一条欢迎信息。程序的代码是这样的: using System;//导入命名空间。//为C#语言新增解释方法,解释到本行结束 class Welcome//类定义,类的概念见下一节 { /*解释开始,和C语言解释用法相同 解释结束*/ static void Main()//主程序,程序入口函数,必须在一个类中定义 { Console.WriteLine(“请键入你的姓名:”);//控制台输出字符串 Console.ReadLine();//从键盘读入数据,输入回车结束 Console.WriteLine(“欢迎!”); } } 可以用任意一种文本编辑软件完成上述代码的编写,然后把文件存盘,假设文件名叫做welcome.c
全栈程序员站长
2022/09/30
16.3K0
socket默认端口号(socket和端口的关系)
from: http://www.iana.org/assignments/port-numbers
全栈程序员站长
2022/08/01
9.4K0
xp的终极优化
为了达到这个目的,我们主要从四个方面入手: 1、减少磁盘空间占用 2、终止不常用的系统服务 3、安全问题 4、另外一些技巧
全栈程序员站长
2022/11/10
5.8K0
笨办法学 Java(一)
我已经教了超过 15 年的初学者如何编码。超过 2000 名学生参加了我的课程,离开时知道如何编写简单的程序。有些人只学会了一点,而其他人在短短几年内获得了令人难以置信的技能。
ApacheCN_飞龙
2024/01/26
5250
常用电脑资料速查
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
2.6K0
硬件资料和软件资料_电脑硬件检测工具哪个好
2. BIOS报警声意义 3. BIOS自检与开机故障相关问题 5. 计算机几个常见指标的意义 6. 显卡GPU参数 7. 显示卡常见故障全面解决 8. 集成声卡常见故障及解决 9. 显示器经典故障以及处理办法 10. AMI主板代码大全(BIOS-ID)
全栈程序员站长
2022/11/01
5K0
❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】
因为AT&T(通用电气)的政策改变,在Version 7 Unix推出之后,发布新的使用条款,将UNIX源代码私有化,在大学中不再能使用UNIX源代码。Andrew S. Tanenbaum(塔能鲍姆)教授为了能在课堂上教授学生操作系统运作的实务细节,决定在不使用任何AT&T的源代码前提下,自行开发与UNIX兼容的操作系统,以避免版权上的争议。他以小型UNIX(mini-UNIX)之意,将它称为MINIX。
全栈程序员站长
2022/09/05
2.4K0
❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】
Qt5 和 OpenCV4 计算机视觉项目:1~5
计算机视觉是使计算机能够对数字图像和视频有较高了解的技术,而不仅仅是将它们视为字节或像素。 它广泛用于场景重建,事件检测,视频跟踪,对象识别,3D 姿态估计,运动估计和图像恢复。
ApacheCN_飞龙
2023/04/27
6.4K0
[PHP] 2018年终总结
========================================================================== 2018年12月29日 记录:
唯一Chat
2019/09/10
2.8K0
Python3 OpenCV4 计算机视觉学习手册:6~11
与人眼和大脑相似,OpenCV 可以检测图像的主要特征并将其提取到所谓的图像描述符中。 然后可以将这些特征用作数据库,从而启用基于图像的搜索。 此外,我们可以使用关键点将图像拼接在一起并组成更大的图像。 (请考虑将许多图片组合在一起以形成 360° 全景图。)
ApacheCN_飞龙
2023/04/27
4.6K0
Python3 OpenCV4 计算机视觉学习手册:6~11
实施运维企业面试题-5「建议收藏」
NETW 参考答案 A 类 255.0.0.0 B 类 255.255.0.0 C 类 255.255.255.0 4 请描述预留给企业
全栈程序员站长
2022/08/22
3.4K0
OpenCV3 和 Qt5 计算机视觉:1~5
在最基本的形式和形状中,“计算机视觉”是一个术语,用于标识用于使数字设备具有视觉感觉的所有方法和算法。 这意味着什么? 好吧,这就是听起来的确切含义。 理想情况下,计算机应该能够通过标准相机(或与此相关的任何其他类型的相机)的镜头看到世界,并且通过应用各种计算机视觉算法,它们应该能够检测甚至识别并计数人脸。 图像中的对象,检测视频馈送中的运动,然后执行更多操作,这些操作乍一看只能是人类的期望。 因此,要了解计算机视觉的真正含义,最好知道计算机视觉旨在开发方法以实现所提到的理想,使数字设备具有查看和理解周围环境的能力。 值得注意的是,大多数时间计算机视觉和图像处理可以互换使用(尽管对这个主题的历史研究可能证明应该相反)。 但是,尽管如此,在整本书中,我们仍将使用“计算机视觉”一词,因为它是当今计算机科学界中更为流行和广泛使用的术语,并且因为正如我们将在本章稍后看到的那样,“图像处理”是 OpenCV 库的模块,我们还将在本章的后续页面中介绍,并且还将在其完整的一章中介绍它。
ApacheCN_飞龙
2023/04/27
6.5K0
相关推荐
在Win10(NT10.0系统我还试了Server2019)安装UG NX 10.0.0.24踩坑和平坑
更多 >
LV.0
腾讯高级后台开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验