命令行登录linux服务器

打开cmd命令窗口(windows+r):
域名进入:

  ssh root@ota.swm.cloudalbum.site

 

ip进入:

ssh root@122.112.246.108

 

root为服务器账户,之后还要验证密码如图:

%title插图%num

之后就可以为所欲为了。。。。。。。。。。。。。。。也可用工具SecureCRT

 

搭建自己的存储服务器NAS

啥是NAS

NAS,全称Network Attached Storage,即“网络附属存储”。按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。说人话,就是私有云。

装机硬件清单

%title插图%num

所需软件清单

%title插图%num

教程

一、查看U盘VID PID并记录;
%title插图%num
二、查看主板MAC地址并记录;

进入BIOS,查看MAC地址并记录。

三、使用Win32DiskImage将synoboot.img写入U盘制作引导盘;

建议使用synoboot-ds918
点击Write

%title插图%num
写入成功

%title插图%num

四、使用DiskGenius导出grub.cfg文件;
打开DiskGenius(需要断网使用),找到U盘引导盘所在的盘符,选择*个分区,找到\grub\grub.cfg,然后复制到桌面或者我的文档,然后使用NotePad++打开(必须使用NotePad++打开),用查出的实际pid, vid值替换(这里替换的时候一定要记得把前面那个0x留着,要不后面安装会出现很多问题),同时使用查出的MAC替换U盘里grub.cfg的mac1值,然后保存修改,右键复制文件到当前分区,把修改好的grub.cfg文件复制进去DiskGenius覆盖即可。

%title插图%num

五、必须使用NotePad++修改grub.cfg文件;
六、将U盘插入装好的服务器,从U盘启动,先使用第二个选项reinstall,然后使用*个选项启动;
七、在另一台处于同一网段下的电脑进行群晖的配置,使用synology-assistant查找服务器或电脑输入https://find.synology.cn查找新安装的群晖系统,自动安装即可。

私有云构建成功,需要考虑以下十个要素

私有云让企业能够保护并控制应用程序和数据,同时让开发团队能够更快速、更顺畅地提供业务价值。但是虽然构建私有云有望彻底改变IT,要是没有认真的规划和准备,它也无异于是一次成本高昂的科学试验。下面这十个要点有助于确保成功。

  1. 让利益相关者参与进来。私有云并不是纯粹的IT项目。将来实际使用的各个业务部门都应该参与进来,搞清楚规范和可交付成果。云改变了IT部门和业务部门之间的关系。双方都要参与其中,搞清楚并接受这种关系因私有云而发生怎样的变化。
  2. 考虑使用场合。不用说,你需要认真考虑私有云的使用场合。如果说云的使用者没有准备好使用自助服务,仍需要IT部门插手资源的配置和使用,这表明他们还没有准备好云。构建私有云的一个必要前提通常是,用户答应,私有云建成后,就使用它。不过,要确保需求没有过于单单针对某一个项目,那样它可以扩大范围,支持企业的其余部门。
  3. 度量指标是关键。参与云项目的所有利益相关者都应该就可度量的指标达成一致,这些度量指标将定义项目的可交付成果和成功。常常很难量化公司获得的敏捷性具有的好处。然而,评估私有云项目时,从提升生产力或缩短时间方面来确定可度量的目标很有用。
  4. 避免复制公共云。如果团队决意在本地环境复制公共云(AWS、Azure或GCE等),通常不会成功。私有云的设计、架构和实施应该取决于业务部门及应用软件的要求,而不是公共云中的功能特性。公共云旨在服务于一大批客户,提供对某家企业来说可能毫无用处的数百个服务。目标应该是确保目标项目的必要条件得到了满足。
  5. 专注于敏捷性。要考虑云如何为你的团队带来敏捷性,设计云时让这个好处*大化。IT部门和业务部门之间的关系应当得到简化,并为云用户提供便利。这种便利从业务部门开发及/或部署应用程序的速度方面来看应当具有实实在在的好处。
  6. 着眼应用程序而不是工作负载。传统的IT项目通常基于来自针对某个应用程序的资源配置*后阶段的需求。在私有云中,设计应用程序架构时着眼于上游为构建合适的云提供了*大的成功保障。应用程序的架构其实可以设计成云原生,这就能大大提高私有云项目的成功几率。
  7. 避免格格不入。私有云是一种非常灵活的资源池。然而,不是每个应用程序都很适合。专注于评估应用程序的需求,之后再将传统的整体式应用程序迁移到私有云。一个经验法则是,如果应用程序在物理机上运行,它可能还没有准备好迁移到云端。关注的*个应用程序应该能够按需扩展,能够处理随机的基础设施部件或应用程序组件偶尔出现的故障。
  8. 云移植性必不可少。混合之道才是云的未来。每个团队都要考虑自己想不想要应用程序能够在私有云和公共云之间移植,甚至能够跨多个公共云移植。私有云的设计和应用程序的设计都影响能否实现可移植性。一个简单的经验法则是,如果应用程序能够跨多个公共云移植,那么将来可以跨私有云和公共云移植的可能性相当大。
  9. 使用应用程序*佳实践。开发团队得认识到开发云原生应用程序方面的*佳实践,以便提高私有云项目的成功几率。12因子应用程序准则就是这样一套*佳实践,有助于开发出云原生应用程序。
  10. 为导入和迁移作好规划。并不习惯于云的传统开发团队在开发的各个阶段需要帮助,以便使用私有云。将团队导入到云需要规划和投入资源,私有云项目应考虑到这方面。将应用程序迁移到私有云是开发团队需要完成的一项重要工作;只要开发团队将这方面计入到了时间表中,项目才会成功。

私有云是企业的一条转型道路。但是就像任何转变一样,私有云需要全面考虑、认真投入和坚持不懈。如果企业能关注上述几条实践,就能顺利实现转型,让业务部门可以更快速地提供价值,将IT部门视作这场转变的推手。

IaaS私有云解决方案对比分析

1 IBM
IBM软件部的云计算服务自动化管理平台(TSAM)当时是IBM软件部的云计算解决方案的核心产品,用于对服务的生命周期进行管理,该产品只支持对于虚拟机的管理,如果完整的云平台功能,包括对物理机和存储进行管理、资源计量等,需要部署ISDM整体解决方案,将涉及到IBM Tivoli产品线的多个产品。同时IBM系统部还有另一个云计算平台ISF,ISF是针对私有基础设施云管理的软件平台,对于各类虚拟化平台、物理服务器均提供完整的云平台功能,对于存储的管理较差。ISF对于资源调度和物理服务器的管理具有优势,但是应用案例较少。
2 天云科技
天云科技位于北京亦庄云基地,云基地是由宽带资本投资,北京市政府支持的一个高科技企业孵化器,里面的企业*大多数从事与云有关的产品、技术、服务等。天云科技是其中*大的云解决方案供应商,拥有自有知识产权的云管理平台,并作为总集成商承建过多个国内公有云平台。其云平台集成经验较为丰富。天云科技拥有自有知识产权的云管理平台SkyForm。该产品支持虚拟机、物理机、存储基础设施的全面管理,有一定的资源调度能力,但是在该产品的成功应用案例中,x86服务器*大多数为云基地自行开发的超云服务器,案例中均没有物理服务器管理,所管理的存储产品仅支持NetApp,且均为服务标准统一的云平台(公有云或应用系统结构较为一致的私有云)。
3 HP
HP的IaaS私有云解决方案基于HP的网络自动化产品NA、操作自动化产品OO和服务器自动化产品SA,可对虚拟和物理服务器进行了自动化和流程化的管理,完成了资源池管理、资源需求审批和自动化交付功能,但不支持资源配额管理、资源智能部署和计量管理。其中,NA用于将网络管理工作自动化、OO用于将系统软件部署工作自动化,SA用于将裸机部署功能自动化。这些软件是HP云解决方案的核心,其优点为自动化能力强并积累了丰富的自动化脚本。
4 BMC
与HP类似,BMC的云计算产品CLM其实是其先后收购的一系列软件产品的整合:流程平台Remedy、自动化平台BladeLogic、容量管理平台、存储管理平台、监控平台、CMDB等。其完整的IT管理产品线是其云解决方案仅在配额管理上有所欠缺。CLM各个环节上的功能,实际上就是其各软件产品的功能。从功能本身和集成度上看,产品是比较完善的,具体情况仍有待PoC验证。
5 Citrix
Citirx的云计算产品cloudstack原来是比较重要的开源IAAS产品,2011年7月被Citrix收购。与其他开源云计算产品一样,cloudstack只对虚拟机进行管理,无法直接管理物理服务器和存储相关设备。Citrix XenServer中包含Provision Server组件可以对物理服务器进行管理。与Vmware相比,Citrix XenServer在高级功能上有所欠缺(包括storage vmotion功能),性能基本相同,成本的比例大约在1:2.5至1:3之间。
6 EMC
EMC提供的是云计算咨询服务,其咨询服务将重心放在了虚拟化上,对于云计算平台的理解处于相对早期的理解上,但是可以提供在虚拟化落地方面较成熟的理论指导。EMC的虚拟化管理平台仅能管理虚拟化资源,虽然其架构的设计是可以扩展的,但是目前已实现的部分属于开源云平台的水平(即仅对各虚拟化平台进行管理)。
7 CISCO
由于其自身的技术特点,CISCO仍然将云计算重心放在了新型的网络设备产品和网络结构设计上,提出的建设方案是首先改造网络,通过网络整合和购买CISCO的服务器设备达到数据中心基础设施的统一化,进而基于其云计算平台CIAC进行云服务。CISCO对于云的策略理所当然的以卖设备(网络设备和刀片服务器)为重点。
8 VMware
VMware的云计算产品(vCloud)默认不支持除VMware之外的虚拟化产品和物理资源,但是其业界*好的虚拟化平台(vSphere)几乎是商业化产品范围内的必然选择。
9 BMC/HP/IBM案例分析和产品比较

 

%title插图%num

BMC的CLM是商业化IaaS产品中*适合企业进行私有云建设的产品,*终笔者选择了它,并相对较成功的完成了私有云建设,但事后看起来,数据中心管理是个太复杂的事情,没有哪个产品能够让人顺风顺水的完成全部工作,于是,在那儿之后,要进行PaaS建设时,笔者曾一度要自己进行开发,不过,*终的结果却是另一个故事,在后面关于Cloud Foundry的文章,笔者会给出PaaS建设的答案。

如何解决Greenplum pg_dump备份时的分布策略缺失等问题

Greenplum的元数据错误也会影响到数据备份过程,在使用pg_dump进行数据结构备份时,会由于分布策略的缺失导致备份失败,本文介绍此错误的解决办法。

现象
使用pg_dump命令备份整个Greenplum数据库的数据结构时:

pg_dump -f /data/dailybak/dw-nodata-$(date +%Y%m%d%H%M%S) -v -F c -p 5432 -h masterhostname -C -d databasename -s
1
报出如下错误后,备份进程终止:

pg_dump: query to obtain distribution policy of table “table1” returned no data
1
分析
出现此错误后,从pg_class元数据表中找到此relation的oid:

psql databasename -c “select oid,* from pg_class where relname=’table1′;”
1
假定输出的oid为1234,relnamespace为5678,如果有多条,就逐条处理,从gp_distribution_policy中查找localoid为此oid的记录:

psql databasename -c “select oid,* from gp_distribution_policy where localoid=1234;”
1
此查询应返回0条记录,从pg_namespace中找到此表所属namespace名称:

psql databasename -c “select * from pg_namespace where oid=5678;”
1
假定nspname为ns1,至此,证明ns1.table1没有分布策略,因此备份失败

解决
基本思路是为ns1.table1设置分布策略:

root登陆master host
切换到Greenplum的管理员用户,比如gpadmin:
su – gpadmin
1
使用psql连接数据库:
psql databasename
1
设置随机分布策略
alter table ns1.table1 set distributed randomly;
1
或者设置指定列为分布依据

databasename=# alter table ns1.table1 set distributed by (column1);
1
如果此修改报错:

ERROR: SET DISTRIBUTED BY not supported on non-distributed tables
1
则放弃下一步重分布,drop掉ns1.table1重建吧

重分布
databasename=# alter table ns1.table1 set with(reorganize=true);
1
重建完或重分布完,查看修改结果:
databasename=# \d ns1.table1
1
应返回表的基本信息

databasename=# select oid,* from pg_class where relname=’table1′;
1
如重建过,假定返回的oid为12345,否则就是1234

databasename=# select oid,* from gp_distribution_policy where localoid=12345;
1
应返回这个表的分布策略

pg_dump是个讨厌的家伙,它一遇到错误就停止,解决了它才会继续向下,如果再遇到错误再停止,为了避免此类型的错误继续出现,可使用如下命令查询ns1中没有分布键值的表,此输出中可能包含视图,挑选需要处理的用户表按照上面的步骤进行处理:
databasename=# select relname from pg_class where relnamespace=5678 and oid not in (select localoid from gp_distribution_policy);
1
其他
附送两个pg_dump的其他问题:

提示pg_class.oid是不存在的字段,如果遇上了,去查一下错误信息中只是的namespace里是不是有叫pg_class的用户自定义表,如果有,重命名或drop它吧,为什么要建也system catalog一样名字的表呢。。。三天啊,整整三天。。。
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: column c.oid does not exist
LINE 1: …spname=’dataservice’ AND c.relnamespace=n.oid AND c.oid = p….
^
pg_dump: The command was: SELECT attrnums from pg_namespace as n, pg_class as c, gp_distribution_policy as p WHERE c.relname = ‘table1′ AND n.nspname=’ns1’ AND c.relnamespace=n.oid AND c.oid = p.localoid
pg_dump: *** aborted because of error
1
2
3
4
5
6
在使用-o参数进行pg_dump时,提示某些表不存在,但是这些表在任何节点的pg_class中都不存在,也无法drop,办法是把丫创建出来
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: relation “ns1.table1” does not exist
pg_dump: The command was: LOCK TABLE ns1.table1IN ACCESS SHARE MODE
pg_dump: *** aborted because of error

hadoop三个配置文件的参数含义说明

1       获取默认配置

配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知道这些配置文件有哪些配置可以生效,上网找的配置可能因为各个hadoop版本不同,导致无法生效。浏览更多的配置,有两个方法:

1.选择相应版本的hadoop,下载解压后,搜索*.xml,找到core-default.xml,hdfs-default.xml,mapred-default.xml,这些就是默认配置,可以参考这些配置的说明和key,配置hadoop集群。

2.浏览apache官网,三个配置文件链接如下:

http://hadoop.apache.org/common/docs/current/core-default.html

http://hadoop.apache.org/common/docs/current/hdfs-default.html

http://hadoop.apache.org/common/docs/current/mapred-default.html

这里是浏览hadoop当前版本号的默认配置文件,其他版本号,要另外去官网找。其中*个方法找到默认的配置是*好的,因为每个属性都有说明,可以直接使用。另外,core-site.xml是全局配置,hdfs-site.xml和mapred-site.xml分别是hdfs和mapred的局部配置。

2       常用的端口配置

2.1  HDFS端口

 

参数 描述 默认 配置文件 例子值
fs.default.name namenode namenode RPC交互端口 8020 core-site.xml hdfs://master:8020/
dfs.http.address NameNode web管理端口 50070 hdfs- site.xml 0.0.0.0:50070
dfs.datanode.address datanode 控制端口 50010 hdfs -site.xml 0.0.0.0:50010
dfs.datanode.ipc.address datanode的RPC服务器地址和端口 50020 hdfs-site.xml 0.0.0.0:50020
dfs.datanode.http.address datanode的HTTP服务器和端口 50075 hdfs-site.xml 0.0.0.0:50075

 

2.2  MR端口

参数 描述 默认 配置文件 例子值
mapred.job.tracker job-tracker交互端口 8021 mapred-site.xml hdfs://master:8021/
job tracker的web管理端口 50030 mapred-site.xml 0.0.0.0:50030
mapred.task.tracker.http.address task-tracker的HTTP端口 50060 mapred-site.xml 0.0.0.0:50060

 

 

2.3  其它端口

参数 描述 默认 配置文件 例子值
dfs.secondary.http.address secondary NameNode web管理端口 50090 hdfs-site.xml 0.0.0.0:50090
         
         

 

3       三个缺省配置参考文件说明

3.1  core-default.html

序号 参数名 参数值 参数说明
1 hadoop.tmp.dir /tmp/hadoop-${user.name} 临时目录设定
2 hadoop.native.lib true 使用本地hadoop库标识。
3 hadoop.http.filter.initializers   http服务器过滤链设置
4 hadoop.security.group.mapping org.apache.hadoop.security.ShellBasedUnixGroupsMapping 组内用户的列表的类设定
5 hadoop.security.authorization false 服务端认证开启
6 hadoop.security.authentication simple 无认证或认证设置
7 hadoop.security.token.service.use_ip true 是否开启使用IP地址作为连接的开关
8 hadoop.logfile.size 10000000 日志文件*大为10M
9 hadoop.logfile.count 10 日志文件数量为10个
10 io.file.buffer.size 4096 流文件的缓冲区为4K
11 io.bytes.per.checksum 512 校验位数为512字节
12 io.skip.checksum.errors false 校验出错后是抛出异常还是略过标识。True则略过。
13 io.compression.codecs org.apache.hadoop.io.compress.DefaultCodec,

org.apache.hadoop.io.compress.GzipCodec,

org.apache.hadoop.io.compress.BZip2Codec,

org.apache.hadoop.io.compress.SnappyCodec

压缩和解压的方式设置
14 io.serializations org.apache.hadoop.io.serializer.WritableSerialization 序例化和反序列化的类设定
15 fs.default.name file:/// 缺省的文件URI标识设定。
16 fs.trash.interval 0 文件废弃标识设定,0为禁止此功能
17 fs.file.impl org.apache.hadoop.fs.LocalFileSystem 本地文件操作类设置
18 fs.hdfs.impl org.apache.hadoop.hdfs.DistributedFileSystem HDFS文件操作类设置
19 fs.s3.impl org.apache.hadoop.fs.s3.S3FileSystem S3文件操作类设置
20 fs.s3n.impl org.apache.hadoop.fs.s3native.NativeS3FileSystem S3文件本地操作类设置
21 fs.kfs.impl org.apache.hadoop.fs.kfs.KosmosFileSystem KFS文件操作类设置.
22 fs.hftp.impl org.apache.hadoop.hdfs.HftpFileSystem HTTP方式操作文件设置
23 fs.hsftp.impl org.apache.hadoop.hdfs.HsftpFileSystem HTTPS方式操作文件设置
24 fs.webhdfs.impl org.apache.hadoop.hdfs.web.WebHdfsFileSystem WEB方式操作文件类设置
25 fs.ftp.impl org.apache.hadoop.fs.ftp.FTPFileSystem FTP文件操作类设置
26 fs.ramfs.impl org.apache.hadoop.fs.InMemoryFileSystem 内存文件操作类设置
27 fs.har.impl org.apache.hadoop.fs.HarFileSystem 压缩文件操作类设置.
28 fs.har.impl.disable.cache true 是否缓存har文件的标识设定
29 fs.checkpoint.dir ${hadoop.tmp.dir}/dfs/namesecondary 备份名称节点的存放目前录设置
30 fs.checkpoint.edits.dir ${fs.checkpoint.dir} 备份名称节点日志文件的存放目前录设置
31 fs.checkpoint.period 3600 动态检查的间隔时间设置
32 fs.checkpoint.size 67108864 日志文件大小为64M
33 fs.s3.block.size 67108864 写S3文件系统的块的大小为64M
34 fs.s3.buffer.dir ${hadoop.tmp.dir}/s3 S3文件数据的本地存放目录
35 fs.s3.maxRetries 4 S3文件数据的偿试读写次数
36 fs.s3.sleepTimeSeconds 10 S3文件偿试的间隔
37 local.cache.size 10737418240 缓存大小设置为10GB
38 io.seqfile.compress.blocksize 1000000 压缩流式文件中的*小块数为100万
39 io.seqfile.lazydecompress true 块是否需要压缩标识设定
40 io.seqfile.sorter.recordlimit 1000000 内存中排序记录块类*小为100万
41 io.mapfile.bloom.size 1048576 BloomMapFiler过滤量为1M
42 io.mapfile.bloom.error.rate 0.005  
43 hadoop.util.hash.type murmur 缺少hash方法为murmur
44 ipc.client.idlethreshold 4000 连接数据*小阀值为4000
45 ipc.client.kill.max 10 一个客户端连接数*大值为10
46 ipc.client.connection.maxidletime 10000 断开与服务器连接的时间*大为10秒
47 ipc.client.connect.max.retries 10 建立与服务器连接的重试次数为10次
48 ipc.server.listen.queue.size 128 接收客户连接的监听队例的长度为128
49 ipc.server.tcpnodelay false 开启或关闭服务器端TCP连接算法
50 ipc.client.tcpnodelay false 开启或关闭客户端TCP连接算法
51 webinterface.private.actions false Web交互的行为设定

 

52 hadoop.rpc.socket.factory.class.default org.apache.hadoop.net.StandardSocketFactory 缺省的socket工厂类设置
53 hadoop.rpc.socket.factory.class.ClientProtocol   与dfs连接时的缺省socket工厂类
54 hadoop.socks.server   服务端的工厂类缺省设置为SocksSocketFactory.
55 topology.node.switch.mapping.impl org.apache.hadoop.net.ScriptBasedMapping  
56 topology.script.file.name    
57 topology.script.number.args 100 参数数量*多为100
58 hadoop.security.uid.cache.secs 14400  

 

 

 

 

 

3.2  hdfs-default.html

 

序号 参数名 参数值 参数说明
1 dfs.namenode.logging.level info 输出日志类型
2 dfs.secondary.http.address 0.0.0.0:50090 备份名称节点的http协议访问地址与端口
3 dfs.datanode.address 0.0.0.0:50010 数据节点的TCP管理服务地址和端口
4 dfs.datanode.http.address 0.0.0.0:50075 数据节点的HTTP协议访问地址和端口
5 dfs.datanode.ipc.address 0.0.0.0:50020 数据节点的IPC服务访问地址和端口
6 dfs.datanode.handler.count 3 数据节点的服务连接处理线程数
7 dfs.http.address 0.0.0.0:50070 名称节点的http协议访问地址与端口
8 dfs.https.enable false 支持https访问方式标识
9 dfs.https.need.client.auth false 客户端指定https访问标识
10 dfs.https.server.keystore.resource ssl-server.xml Ssl密钥服务端的配置文件
11 dfs.https.client.keystore.resource ssl-client.xml Ssl密钥客户端的配置文件
12 dfs.datanode.https.address 0.0.0.0:50475 数据节点的HTTPS协议访问地址和端口
13 dfs.https.address 0.0.0.0:50470 名称节点的HTTPS协议访问地址和端口
14 dfs.datanode.dns.interface default 数据节点采用IP地址标识
15 dfs.datanode.dns.nameserver default 指定DNS的IP地址
16 dfs.replication.considerLoad true 加载目标或不加载的标识
17 dfs.default.chunk.view.size 32768 浏览时的文件块大小设置为32K
18 dfs.datanode.du.reserved 0 每个卷预留的空闲空间数量
19 dfs.name.dir ${hadoop.tmp.dir}/dfs/name 存贮在本地的名字节点数据镜象的目录,作为名字节点的冗余备份
20 dfs.name.edits.dir ${dfs.name.dir} 存贮文件操作过程信息的存贮目录
21 dfs.web.ugi webuser,webgroup Web接口访问的用户名和组的帐户设定
22 dfs.permissions true 文件操作时的权限检查标识。
23 dfs.permissions.supergroup supergroup 超级用户的组名定义
24 dfs.block.access.token.enable false 数据节点访问令牌标识
25 dfs.block.access.key.update.interval 600 升级访问钥时的间隔时间
26 dfs.block.access.token.lifetime 600 访问令牌的有效时间
27 dfs.data.dir ${hadoop.tmp.dir}/dfs/data 数据节点的块本地存放目录
28 dfs.datanode.data.dir.perm 755 数据节点的存贮块的目录访问权限设置
29 dfs.replication 3 缺省的块复制数量
30 dfs.replication.max 512 块复制的*大数量
31 dfs.replication.min 1 块复制的*小数量
32 dfs.block.size 67108864 缺省的文件块大小为64M
33 dfs.df.interval 60000 磁盘空间统计间隔为6秒
34 dfs.client.block.write.retries 3 块写入出错时的重试次数
35 dfs.blockreport.intervalMsec 3600000 块的报告间隔时为1小时
36 dfs.blockreport.initialDelay 0 块顺序报告的间隔时间
37 dfs.heartbeat.interval 3 数据节点的心跳检测间隔时间
38 dfs.namenode.handler.count 10 名称节点的连接处理的线程数量
39 dfs.safemode.threshold.pct 0.999f 启动安全模式的阀值设定

 

40 dfs.safemode.extension 30000 当阀值达到量值后扩展的时限
41 dfs.balance.bandwidthPerSec 1048576 启动负载均衡的数据节点可利用带宽*大值为1M
42 dfs.hosts   可与名称节点连接的主机地址文件指定。
43 dfs.hosts.exclude   不充计与名称节点连接的主机地址文件设定
44 dfs.max.objects 0 文件数、目录数、块数的*大数量
45 dfs.namenode.decommission.interval 30 名称节点解除命令执行时的监测时间周期
46 dfs.namenode.decommission.nodes.per.interval 5 名称节点解除命令执行是否完检测次数
47 dfs.replication.interval 3 名称节点计算数据节点的复制工作的周期数.
48 dfs.access.time.precision 3600000 充许访问文件的时间精确到1小时
49 dfs.support.append false 是否充许链接文件指定
50 dfs.namenode.delegation.key.update-interval 86400000 名称节点上的代理令牌的主key的更新间隔时间为24小时
51 dfs.namenode.delegation.token.max-lifetime 604800000 代理令牌的有效时间*大值为7天
52 dfs.namenode.delegation.token.renew-interval 86400000 代理令牌的更新时间为24小时
53 dfs.datanode.failed.volumes.tolerated 0 决定停止数据节点提供服务充许卷的出错次数。0次则任何卷出错都要停止数据节点

 

 

3.3  mapred-default.html

序号 参数名 参数值 参数说明
1 hadoop.job.history.location   作业跟踪管理器的静态历史文件的存放目录。
2 hadoop.job.history.user.location   可以指定具体某个作业的跟踪管理器的历史文件存放目录
3 mapred.job.tracker.history.completed.location   已完成作业的历史文件的存放目录
4 io.sort.factor  10 排完序的文件的合并时的打开文件句柄数
5 io.sort.mb  100 排序文件的内存缓存大小为100M
6 io.sort.record.percent  0.05 排序线程阻塞的内存缓存剩余比率
7 io.sort.spill.percent  0.80 当缓冲占用量为该值时,线程需要将内容先备份到磁盘中。
8 io.map.index.skip  0 索引条目的间隔设定
9 mapred.job.tracker  local 作业跟踪管理器是否和MR任务在一个进程中
10 mapred.job.tracker.http.address 0.0.0.0:50030 作业跟踪管理器的HTTP服务器访问端口和地址
11 mapred.job.tracker.handler.count 10 作业跟踪管理器的管理线程数,线程数比例是任务管理跟踪器数量的0.04
12 mapred.task.tracker.report.address 127.0.0.1:0 任务管理跟踪器的主机地址和端口地址

 

13 mapred.local.dir ${hadoop.tmp.dir}/mapred/local MR的中介数据文件存放目录
14 mapred.system.dir ${hadoop.tmp.dir}/mapred/system MR的控制文件存放目录
15 mapreduce.jobtracker.staging.root.dir ${hadoop.tmp.dir}/mapred/staging 每个正在运行作业文件的存放区
16 mapred.temp.dir ${hadoop.tmp.dir}/mapred/temp MR临时共享文件存放区
17 mapred.local.dir.minspacestart 0 MR本地中介文件删除时,不充许有任务执行的数量值。
18 mapred.local.dir.minspacekill 0 MR本地中介文件删除时,除非所有任务都已完成的数量值。
19 mapred.tasktracker.expiry.interval 600000 任务管理跟踪器不发送心跳的累计时间间隔超过600秒,则任务管理跟踪器失效
20 mapred.tasktracker.resourcecalculatorplugin   指定的一个用户访问资源信息的类实例
21 mapred.tasktracker.taskmemorymanager.monitoring-interval 5000 监控任务管理跟踪器任务内存使用率的时间间隔
22 mapred.tasktracker.tasks.sleeptime-before-sigkill 5000 发出进程终止后,间隔5秒后发出进程消亡信号

 

23 mapred.map.tasks 2 每个作业缺省的map任务数为2
24 mapred.reduce.tasks 1 每个作业缺省的reduce任务数为1
25 mapreduce.tasktracker.outofband.heartbeat false 让在任务结束后发出一个额外的心跳信号
26 mapreduce.tasktracker.outofband.heartbeat.damper 1000000 当额外心跳信号发出量太多时,则适当阻止

 

27 mapred.jobtracker.restart.recover false 充许任务管理器恢复时采用的方式
28 mapred.jobtracker.job.history.block.size 3145728 作业历史文件块的大小为3M
29 mapreduce.job.split.metainfo.maxsize 10000000 分隔元信息文件的*大值是10M以下

 

30 mapred.jobtracker.taskScheduler org.apache.hadoop.mapred.JobQueueTaskScheduler 设定任务的执行计划实现类
31 mapred.jobtracker.taskScheduler.maxRunningTasksPerJob   作业同时运行的任务数的*大值
32 mapred.map.max.attempts 4 Map任务的重试次数
33 mapred.reduce.max.attempts 4 Reduce任务的重试次数
34 mapred.reduce.parallel.copies 5 在复制阶段时reduce并行传送的值。
35 mapreduce.reduce.shuffle.maxfetchfailures 10 取map输出的*大重试次数
36 mapreduce.reduce.shuffle.connect.timeout 180000 REDUCE任务连接任务管理器获得map输出时的总耗时是3分钟

 

37 mapreduce.reduce.shuffle.read.timeout 180000 REDUCE任务等待map输出数据的总耗时是3分钟
38 mapred.task.timeout 600000 如果任务无读无写时的时间耗时为10分钟,将被终止
39 mapred.tasktracker.map.tasks.maximum 2 任管管理器可同时运行map任务数为2
40 mapred.tasktracker.reduce.tasks.maximum 2 任管管理器可同时运行reduce任务数为2
41 mapred.jobtracker.completeuserjobs.maximum 100 当用户的完成作业数达100个后,将其放入作业历史文件中
42 mapreduce.reduce.input.limit -1 Reduce输入量的限制。
43 mapred.job.tracker.retiredjobs.cache.size 1000 作业状态为已不在执行的保留在内存中的量为1000
44 mapred.job.tracker.jobhistory.lru.cache.size 5 作业历史文件装载到内存的数量
45 mapred.child.java.opts -Xmx200m 启动task管理的子进程时的内存设置
46 mapred.child.env   子进程的参数设置
47 mapred.child.ulimit   虚拟机所需内存的设定。
48 mapred.cluster.map.memory.mb -1  
49 mapred.cluster.reduce.memory.mb -1  
50 mapred.cluster.max.map.memory.mb -1  
51 mapred.cluster.max.reduce.memory.mb -1  
52 mapred.job.map.memory.mb -1  
53 mapred.job.reduce.memory.mb -1  
54 mapred.child.tmp /tmp Mr任务信息的存放目录
55 mapred.inmem.merge.threshold 1000 内存中的合并文件数设置
56 mapred.job.shuffle.merge.percent 0.66  
57 mapred.job.shuffle.input.buffer.percent 0.70  
58 mapred.job.reduce.input.buffer.percent 0.0  
59 mapred.map.tasks.speculative.execution true Map任务的多实例并行运行标识
60 mapred.reduce.tasks.speculative.execution true Reduce任务的多实例并行运行标识
61 mapred.job.reuse.jvm.num.tasks 1 每虚拟机运行的任务数
62 mapred.min.split.size 0 Map的输入数据被分解的块数设置
63 mapred.jobtracker.maxtasks.per.job -1 一个单独作业的任务数设置
64 mapred.submit.replication 10 提交作业文件的复制级别
65 mapred.tasktracker.dns.interface default 任务管理跟踪器是否报告IP地址名的开关
66 mapred.tasktracker.dns.nameserver default 作业和任务管理跟踪器之间通讯方式采用的DNS服务的主机名或IP地址
67 tasktracker.http.threads 40 http服务器的工作线程数量
68 mapred.task.tracker.http.address 0.0.0.0:50060 任务管理跟踪器的http服务器的地址和端口
69 keep.failed.task.files false 失败任务是否保存到文件中

 

70 mapred.output.compress false 作业的输出是否压缩
71 mapred.output.compression.type RECORD 作业输出采用NONE, RECORD or BLOCK三种方式中一种压缩的写入到流式文件
72 mapred.output.compression.codec org.apache.hadoop.io.compress.DefaultCodec 压缩类的设置
73 mapred.compress.map.output false Map的输出是否压缩
74 mapred.map.output.compression.codec org.apache.hadoop.io.compress.DefaultCodec Map的输出压缩的实现类指定
75 map.sort.class org.apache.hadoop.util.QuickSort 排序键的排序类指定
76 mapred.userlog.limit.kb 0 每个任务的用户日志文件大小
77 mapred.userlog.retain.hours 24 作业完成后的用户日志留存时间为24小时
78 mapred.user.jobconf.limit 5242880 Jobconf的大小为5M
79 mapred.hosts   可与作业管理跟踪器连接的主机名
80 mapred.hosts.exclude   不可与作业管理跟踪器连接的主机名
81 mapred.heartbeats.in.second 100 作业管理跟踪器的每秒中到达的心跳数量为100
82 mapred.max.tracker.blacklists 4 任务管理跟踪器的黑名单列表的数量
83 mapred.jobtracker.blacklist.fault-timeout-window 180 任务管理跟踪器超时180分钟则訪任务将被重启
84 mapred.jobtracker.blacklist.fault-bucket-width 15  
85 mapred.max.tracker.failures 4 任务管理跟踪器的失败任务数设定
86 jobclient.output.filter FAILED 控制任务的用户日志输出到作业端时的过滤方式
87 mapred.job.tracker.persist.jobstatus.active false 是否持久化作业管理跟踪器的信息
88 mapred.job.tracker.persist.jobstatus.hours 0 持久化作业管理跟踪器的信息的保存时间
89 mapred.job.tracker.persist.jobstatus.dir /jobtracker/jobsInfo 作业管理跟踪器的信息存放目录
90 mapreduce.job.complete.cancel.delegation.tokens true 恢复时是否变更领牌
91 mapred.task.profile false 任务分析信息是否建设标志
92 mapred.task.profile.maps 0-2 设置map任务的分析范围
93 mapred.task.profile.reduces 0-2 设置reduce任务的分析范围
94 mapred.line.input.format.linespermap 1 每次切分的行数设置
95 mapred.skip.attempts.to.start.skipping 2 在跳转模式未被设定的情况下任务的重试次数
96 mapred.skip.map.auto.incr.proc.count true MapRunner在调用map功能后的增量处理方式设置
97 mapred.skip.reduce.auto.incr.proc.count true 在调用reduce功能后的增量处理方式设置
98 mapred.skip.out.dir   跳过记录的输出目录
99 mapred.skip.map.max.skip.records 0  
100 mapred.skip.reduce.max.skip.groups 0  
101 job.end.retry.attempts 0 Hadoop偿试连接通知器的次数
102 job.end.retry.interval 30000 通知偿试回应的间隔操作为30秒
103 hadoop.rpc.socket.factory.class.JobSubmissionProtocol   指定与作业跟踪管理器的通讯方式,缺省是采用rpc方式
104 mapred.task.cache.levels 2 任务缓存级别设置
105 mapred.queue.names default 分隔作业队例的分隔符设定
106 mapred.acls.enabled false 指定ACL访问控制列表
107 mapred.queue.default.state RUNNING 定义队列的状态
108 mapred.job.queue.name default 已提交作业的队列设定
109 mapreduce.job.acl-modify-job   指定可修改作业的ACL列表
110 mapreduce.job.acl-view-job   指定可浏临作业的ACL列表
111 mapred.tasktracker.indexcache.mb 10 任务管理跟踪器的索引内存的*大容器
112 mapred.combine.recordsBeforeProgress 10000 在聚合处理时的记录块数

 

113 mapred.merge.recordsBeforeProgress 10000 在汇总处理时的记录块数
114 mapred.reduce.slowstart.completed.maps 0.05  
115 mapred.task.tracker.task-controller org.apache.hadoop.mapred.DefaultTaskController 任务管理器的设定
116 mapreduce.tasktracker.group   任务管理器的组成员设定
117 mapred.healthChecker.script.path   脚本的*对路径指定,这些脚本是心跳服务的
118 mapred.healthChecker.interval 60000 节点心跳信息的间隔
119 mapred.healthChecker.script.timeout 600000  
120 mapred.healthChecker.script.args   参数列表

 

121 mapreduce.job.counters.limit 120 作业计数器的*小值

org.apache.hadoop.io

1.下面是主要的类层次图

%title插图%num

2.Writable和WritableComparable的子类们基本大同小异

%title插图%num

3.RawComparator和WritableComparator

举例如下,以下以text类型的comparator每个字符从高到低位比较,对于数字类型的字符串也是比较适用的
/** A WritableComparator optimized for Text keys. */
public static class Comparator extends WritableComparator
{
    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
    {
        int n1 = WritableUtils.decodeVIntSize(b1[s1]);
        int n2 = WritableUtils.decodeVIntSize(b2[s2]);
        return compareBytes(b1, s1 + n1, l1 - n1, b2, s2 + n2, l2 - n2);
    }
}

4.Text类应用广泛,值得仔细看下

5.*InputBuffer和*OutputBuffer

6.Hadoop 数据类型与文件结构 Sequence, Map, Set, Array, BloomMap Files

1.Hadoop’s SequenceFile

%title插图%num

SequenceFile 是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是appendonly的,于是你不能对已存在的key进行写操作。每一个key-value记录如下图,不仅保存了key,value值,也保存了他们的长度。

%title插图%num

SequenceFile 有三种压缩态:

  1. Uncompressed – 未进行压缩的状态
  2. Record Compressed – 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
  3. Block-Compressed – 当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩

文件的压缩态标识在文件开头的header数据中。

在header数据之后是一个Metadata数据,他是简单的属性/值对,标识文件的一些其他信息。Metadata 在文件创建时就写好了,所以也是不能更改的。

%title插图%num

2.MapFile, SetFile, ArrayFile 及 BloomMapFile

SequenceFile 是Hadoop 的一个基础数据文件格式,后续讲的 MapFile, SetFile, ArrayFile 及 BloomMapFile 都是基于它来实现的。

  • MapFile – 一个key-value 对应的查找数据结构,由数据文件/data 和索引文件 /index 组成,数据文件中包含所有需要存储的key-value对,按key的顺序排列。索引文件包含一部分key值,用以指向数据文件的关键位置。
  • SetFile – 基于 MapFile 实现的,他只有key,value为不可变的数据。
  • ArrayFile – 也是基于 MapFile 实现,他就像我们使用的数组一样,key值为序列化的数字。
  • BloomMapFile – 他在 MapFile 的基础上增加了一个 /bloom 文件,包含的是二进制的过滤表,在每一次写操作完成时,会更新这个过滤表

7.值得提一下binary stream with zero-compressed encoding

  /**  
   * Serializes a long to a binary stream with zero-compressed encoding.  
   * For -112 <= i <= 127, only one byte is used with the actual value.  
   * For other values of i, the first byte value indicates whether the  
   * long is positive or negative, and the number of bytes that follow.  
   * If the first byte value v is between -113 and -120, the following long  
   * is positive, with number of bytes that follow are -(v+112).  
   * If the first byte value v is between -121 and -128, the following long  
   * is negative, with number of bytes that follow are -(v+120). Bytes are  
   * stored in the high-non-zero-byte-first order.  
   *   
   * @param stream Binary output stream  
   * @param i Long to be serialized  
   * @throws java.io.IOException   
   */  
  /*   
   * 将一个long类型的i,写入输出流DataOutput中  
   * 如果 -112 <= i <= 127,只使用一个byte表示i并写入输出流中  
   * *个字节表示i的正负和接下来表示i的字节数  
   * 如果*个字节-113 <= v <= -120,那么i是正数,并且接下来i占的字节数是-(v+112)(也就是1到8个字节之间)  
   * 如果*个字节-121 <= v <= -128,那么i是负数,并且接下来的i占的字节数是-(v+120)(也就是1到8个字节之间)  
   * 写入时先写i的高位,再写低位  
   *   
   */  
  public static void writeVLong(DataOutput stream, long i) throws IOException {   
    if (i >= -112 && i <= 127) {   
      stream.writeByte((byte)i);   
      return;   
    }   
         
    int len = -112;   
    if (i < 0) {   
      i ^= -1L; // take one's complement'   
      len = -120;   
    }   
         
    long tmp = i;   
    while (tmp != 0) {   
      tmp = tmp >> 8;   
      len--;   
    }   
         
    stream.writeByte((byte)len);   
         
    len = (len < -120) ? -(len + 120) : -(len + 112);   
         
    for (int idx = len; idx != 0; idx--) {   
      int shiftbits = (idx - 1) * 8;   
      long mask = 0xFFL << shiftbits;   
      stream.writeByte((byte)((i & mask) >> shiftbits));   
    }   
  }
这种编码方式的有点是照顾了*大多数能够使用一个byte编码的数字,*大的缺点是,两个byte所能编码的数字少了很多,并且两个byte以上长度的编码效率都下降了。

8.参考url

HDFS基本命令

HDFS基本命令:

hadoop fs -cmd

cmd: 具体的操作,基本上与UNIX的命令行相同

args:参数

HDFS资源URI格式

scheme://authority/path

scheme:协议名,file或hdfs

authority:namenode主机名

path:路径

示例:hdfs://localhost:9000/user/chunk/test.txt

假设已经在core-site.xml里配置了 fs.default.name=hdfs://localhost:9000,则仅使用/user/chunk/test.txt即可。

hdfs默认工作目录为 /user/$USER,$USER是当前的登录用户名。

HDFS命令示例:

hadoop fs -mkdir /user/trunk

hadoop fs -ls /user

hadoop fs -lsr /user   (递归的)

hadoop fs -put test.txt /user/trunk

hadoop fs -put test.txt .  (复制到hdfs当前目录下,首先要创建当前目录)

hadoop fs -get /user/trunk/test.txt . (复制到本地当前目录下)

hadoop fs -cat /user/trunk/test.txt

hadoop fs -tail /user/trunk/test.txt  (查看*后1000字节)

hadoop fs -rm /user/trunk/test.txt

hadoop fs -help ls (查看ls命令的帮助文档)

%title插图%num

图中的2:文件备份数量,因为采用了两台机器的全分布模式,所以此处为2.对于目录,使用-。

在put的时候遇到问题:

  1. put: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create file/user/hadoopadmin. Name node is in safe mode.  

解法:>bin/hadoop dfsadmin -safemode leave
http://zkl-1987.iteye.com/blog/365587

有关HDFS的官方文档,可以参考如下网址:
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html

python多线程超时退出

python多线程超时退出

python多线程超时退出
import time
import threading
import queue

def call_back_func(message):
“””运行成功回调”””
pass

def error_back_func():
“””超时回调”””
pass

def warp(*args, **kwargs):
q = kwargs.pop(‘queue’)
f = kwargs.pop(‘function’)
result = f(*args, **kwargs)
q.put(result)

def time_out(interval, call_back=None, error_back=None):
def decorator(func):
def wrapper(*args, **kwargs):
q = queue.Queue()
if ‘function’ in kwargs:
raise ValueError(‘不允许有名为”function”的参数’)
kwargs[‘function’] = func
if ‘queue’ in kwargs:
raise ValueError(‘不允许有名为”queue”的参数’)
kwargs[‘queue’] = q
t = threading.Thread(target=warp, args=args, kwargs=kwargs)
t.setDaemon(True) # 设置主线程技术子线程立刻结束
t.start()
try:
result = q.get(timeout=interval)
if call_back:
threading.Timer(0, call_back, args=(result,)).start()
return result
except queue.Empty:
kwargs.pop(‘function’)
kwargs.pop(‘queue’)
print(f’运行超时,func:{func.__name__},args:{args}, kwargs:{kwargs}’)

return wrapper

return decorator

@time_out(2, call_back=call_back_func, error_back=error_back_func)
def task1(name):
print(‘**********task1****************’)
time.sleep(1)
return name + ‘你好’

@time_out(2, call_back=call_back_func, error_back=error_back_func)
def task2(name):
print(‘**********task****************’)
time.sleep(3)
return name + ‘你好’

if __name__ == ‘__main__’:
a = task1(‘小明’)
print(a)

b = task2(‘小红’)
print(b)

 

PyQT——多线程(QThread)

PyQT——多线程(QThread)

PyQT线程:多线程QThread
前言
一、应用场景
二、使用多线程
解决卡顿和假死
*种:线程锁(QMutex)
第二种:信号(Signal)
前言
一、应用场景
在编写GUI界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题。

二、使用多线程
解决卡顿和假死
1.两个按钮,分别在控制台打印不同的内容,分别点击两个按钮后,控制台会依次打印内容,多次点击按钮,程序会先循环完上一次的点击,然后再执行下一次的点击,并且窗口可能会出现假死状态。

下面将这两个循环使用多线程来写,在PyQT5中,使用QThread

代码如下(示例):

from PyQt5.Qt import (QApplication, QWidget, QPushButton,
QThread)
import sys
import time

# 继承QThread
class Thread_1(QThread): # 线程1
def __init__(self):
super().__init__()

def run(self):
values = [1, 2, 3, 4, 5]
for i in values:
print(i)
time.sleep(0.5) # 休眠

class Thread_2(QThread): # 线程2
def __init__(self):
super().__init__()

def run(self):
values = [“a”, “b”, “c”, “d”, “e”]
for i in values:
print(i)
time.sleep(0.5)

执行上述多线程程序,不管我们点击哪个按钮,点击多少次,在控制台会立刻打印内容,且窗口不会出现卡顿,假死。

2、这里又出现了一个新的问题,当重复点击相同按钮的时候,会多一个循环。例如,点击按钮1,循环打印1,2,3。此时再次点击按钮1,在控制台会开启一个新的循环,我们期望在点击之后开始循环,在循环没有结束之前,此线程不允许使用。有两种解决办法:线程锁和信号

*种:线程锁(QMutex)
1、创建两个线程锁,然后在run里面加锁和解锁,运行程序,点击不同的按钮可以同步运行,可以同步循环打印,点击相同的按钮,先打印完一次循环后,在打印第二次循环,并且主界面不会假死。
2、这种办法还是不够完善,想要的结果是,点击按钮后,开启循环,当循环没有结束时,不允许点击按钮,这里使用信号。

第二种:信号(Signal)
按钮1使用线程锁,按钮2使用信号,注意两者的区别,按钮1可以无限点击,按钮2在点击之后,开启循环,按钮呈不可点击状态,只有当循环结束后,才能被再次点击。

代码如下(示例):

from PyQt5.Qt import QApplication, QWidget, QPushButton, QThread, QMutex, pyqtSignal
import sys
import time

class PreventFastClickThreadMutex(QThread): # 线程1
qmut = QMutex() # 创建线程锁
def __init__(self):
super().__init__()

def run(self):
self.qmut.lock() # 加锁
values = [1, 2, 3, 4, 5]
for i in values:
print(i)
time.sleep(0.5) # 休眠
self.qmut.unlock() # 解锁

class PreventFastClickThreadSignal(QThread): # 线程2
_signal = pyqtSignal()

def __init__(self):
super().__init__()

def run(self):
values = [“a”, “b”, “c”, “d”, “e”]
for i in values:
print(i)
time.sleep(0.5)
self._signal.emit()

class MyWin(QWidget):
def __init__(self):
super().__init__()
# 按钮初始化
self.btn_1 = QPushButton(‘按钮1’, self)
self.btn_1.setCheckable(True)
self.btn_1.move(120, 80)
self.btn_1.clicked.connect(self.click_1) # 绑定槽函数

self.btn_2 = QPushButton(‘按钮2’, self)
self.btn_2.setCheckable(True)
self.btn_2.move(120, 120)
self.btn_2.clicked.connect(self.click_2) # 绑定槽函数

def click_1(self):
self.thread_1 = PreventFastClickThreadMutex() # 创建线程
self.thread_1.start() # 开始线程

def click_2(self):
self.btn_2.setEnabled(False)
self.thread_2 = PreventFastClickThreadSignal()
self.thread_2._signal.connect(self.set_btn)
self.thread_2.start()

def set_btn(self):
self.btn_2.setEnabled(True)

if __name__ == “__main__”:
app = QApplication(sys.argv)
myshow = MyWin()
myshow.show()
sys.exit(app.exec_())