技术标签: linux学习 output input mapreduce logging hadoop netbeans
目录[隐藏] |
Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架。MapReduce的概念来源于Google实验室,它是一个简化并行计算的编程模型,适用于大规模集群上的海量数据处理,目前最成功的应用是分布式搜索引擎。随着2007年底该模式Java开源实现项目Apache Hadoop的出现,使得程序员可以轻松地编写分布式并行程序,并将其运行于计算机集群上,完成海量数据的计算。近两年尤其是今年国内外采用MapReduce模型的应用也逐渐丰富起来,如像NTT KDDI和中国移动这类的电信公司采用该模型分析用户信息,优化网络配置;美国供电局采用该模型来分析电网现状;包括VISA和JP摩根在内的金融公司采用该模型来分析股票数据;包括Amazon和ebay在内的零售商和电子商务公司也开始采用该模型;甚至部分生物公司也采用该模型来进行DNA测序和分析。然而Hadoop安装、部署、管理的难度非常大,这使用很多用户对Hadoop望而却步,好在这种情况不久就得到了改善,Cloudera提供了非常简单的Hadoop的发布版本,能够十分方便地对Hadoop进行安装、部署和管理,这导致目前大约有75%的Hadoop新用户使用Cloudera。
Hadoop有三种运行模式:单机(非分布)运行模式、伪分布运行模式和分布式运行模式。其中前两种运行模式体现不了 Hadoop 分布式计算的优势,并没有什么实际意义(当然它们对程序的测试及调试还是很有帮助的),因此在这里还是采用实际环境中使用的分布式运行模式来部署。
在这里拟采用三台主机搭建Hadoop环境,由于后期还需要测试增删主机及跨网段主机对Hadoop环境的影响,特将Hadoop主机规划如下: Hadoop-01 10.137.253.201 Hadoop-02 10.137.253.202 Hadoop-03 10.137.253.203 准备后期加入的测试主机 Hadoop-04 10.137.253.204 Firehare-303 10.10.3.30 准备后期加入的跨网段测试主机
对于Hadoop来说,最主要的是两个内容,一是分布式文件系统HDFS,一是MapReduce计算模型。在分布式文件系统HDFS看来,节点分为NameNode 和DataNode,其中NameNode只有一个,DataNode可以是很多;在MapReduce计算模型看来,节点又可分为JobTracker和 TaskTracker,其中JobTracker只有一个,TaskTracker可以是很多。因此在实际的Hadoop环境中通常有两台主节点,一台作为NameNode(I/O节点??),一台作为JobTracker(管理节点??),剩下的都是从节点,同时当做DataNode和TaskTracker使用。当然也可以将NameNode和JobTracker安装在一台主节点上。由于测试机数量有限,所以在这里是让Hadoop-01做为Namenode和Jobtracker,其它主机则作为DataNode和TaskTracker(如果Hadoop环境中主机数量很多的话,还是建议将Namenode和JobTracker部署到不同的主机,以提高计算的性能)。具体规划如下:
HDFS: Hadoop-01 NameNode Hadoop-02 DataNode Hadoop-03 DataNode Hadoop-04 DataNode Firehare-303 DataNode MapReduce: Hadoop-01 JobTracker Hadoop-02 TaskTracker Hadoop-03 TaskTracker Hadoop-04 TaskTracker Firehare-303 TaskTracker
规划好了就开始安装Hadoop,如前言中所说使用Cloudera的Hadoop发布版安装Hadoop是十分方便的,首先当然是在每台主机上一个干净的操作系统(我用的是Ubuntu 8.04,用户设为Hadoop,其它的版本应该差不多),然后就是安装Hadoop了(这样安装的是Hadoop-0.20,也可以安装Hadoop-0.18的版本,反正安装步骤都差不多。注意,不能同时启用Hadoop-0.20和Hadoop-0.18)。由于每台机器安装步骤都一样,这里就写出了一台主机的安装步骤,主要分为以下几个步骤:
sudo vi /etc/apt/sources.list.d/cloudera.list #稳定版(Hadoop-0.18) #deb http://archive.cloudera.com/debian hardy-stable contrib #deb-src http://archive.cloudera.com/debian hardy-stable contrib #测试版(Hadoop-0.20) deb http://archive.cloudera.com/debian hardy-testing contrib deb-src http://archive.cloudera.com/debian hardy-testing contrib
sudo apt-get install curl curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -
sudo apt-get update sudo apt-get dist-upgrade
sudo apt-get install hadoop-0.20 hadoop-0.20-conf-pseudo
安装好这几台主机的Hadoop环境之后,就要对它们进行分布式运行模式的部署了,首先是设置它们之间的互联。
Hadoop环境中的互联是指各主机之间网络畅通,机器名与IP地址之间解析正常,可以从任一主机ping通其它主机的主机名。注意,这里指的是主机名,即在Hadoop-01主机上可以通过命令ping Hadoop-02来ping通Hadoop-02主机(同理,要求这几台主机都能相互Ping通各自的主机名)。可以通过在各主机的/etc/hosts文件来实现,具体设置如下:
sudo vi /etc/hosts 127.0.0.1 localhost 10.x.253.201 hadoop-01 hadoop-01 10.x.253.202 hadoop-02 hadoop-02 10.x.253.203 hadoop-03 hadoop-03 10.x.253.204 hadoop-04 hadoop-04 10.x.3.30 firehare-303 firehare-303
将每个主机的hosts文件都改成上述设置,这样就实现了主机间使用主机名互联的要求。
注:如果深究起来,并不是所有的主机都需要知道Hadoop环境中其它主机主机名的。其实只是作为主节点的主机(如NameNode、JobTracker),需要在该主节点hosts文件中加上Hadoop环境中所有机器的IP地址及其对应的主机名,如果该台机器作Datanode用,则只需要在hosts文件中加上本机和主节点机器的IP地址与主机名即可(至于JobTracker主机是否也要同NameNode主机一样加上所有机器的IP和主机名,本人由于没有环境,不敢妄言,但猜想是要加的,如果哪位兄弟有兴趣,倒是不妨一试)。在这里只是由于要作测试,作为主节点的主机可能会改变,加上本人比较懒,所以就全加上了。:)
注意2:ubuntu 原有的 /etc/hosts 文件中有将本机计算机名解析为 127.0.1.1 的字段,例如:
127.0.1.1 hadoop-01
请务必删除,否则会由于绑定 ip 不正确导致namenode和jobtracker无法连接的问题。
如果各个主机使用 dhcp 动态分配地址且不具有网络管理员权限,或者由于 /etc/hosts 文件的修改量过大,对于同一子网中的主机可以同过架设一个 WINS 服务或使用网络中有的 WINS 服务来解决互联问题。相关的包可以通过运行 tasksel 命令,安装 samba client 包获得,安装之后还需要修改 /etc/samba/smb.conf 架设或设置 WINS 服务,并修改 /etc/nsswitch.conf 添加机器名的解析方式。
Hadoop要求所有机器上hadoop的部署目录结构要相同,并且都有一个相同用户名的帐户。由于这里采用的是Cloudera发布的Hadoop包,所以并不需要这方面的设置,大家了解一下即可。
在 Hadoop 分布式环境中,主节点(NameNode、JobTracker) 需要通过 SSH 来启动和停止从节点(DataNode、TeskTracker)上的各类进程。因此需要保证环境中的各台机器均可以通过 SSH 登录访问,并且主节点用 SSH 登录从节点时,不需要输入密码,这样主节点才能在后台自如地控制其它结点。可以将各台机器上的 SSH 配置为使用无密码公钥认证方式来实现。 Ubuntu上的SSH协议的开源实现是OpenSSH, 缺省状态下是没有安装的,如需使用需要进行安装。
安装OpenSSH很简单,只需要下列命令就可以把openssh-client和openssh-server给安装好:
sudo apt-get install ssh
首先在Hadoop-01机器上执行以下命令:
[email protected]:~$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): Enter passphrase (empty for no passphrase):(在这里直接回车) Enter same passphrase again:(在这里直接回车) Your identification has been saved in /home/hadoop/.ssh/id_rsa. Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub. The key fingerprint is: 9d:42:04:26:00:51:c7:4e:2f:7e:38:dd:93:1c:a2:d6 [email protected]
上述命令将为主机hadoops-01上的当前用户hadoop生成其密钥对,该密钥对被保存在/home/hadoop/.ssh/id_rsa文件中,同时命令所生成的证书以及公钥也保存在该文件所在的目录中(在这里是:/home/hadoop/.ssh),并形成两个文件 id_rsa,id_rsa.pub。然后将 id_rsa.pub 文件的内容复制到每台主机(其中包括本机hadoop-01)的/home/hadoop/.ssh/authorized_keys文件的尾部,如果该文件不存在,可手工创建一个。
注意:id_rsa.pub 文件的内容是长长的一行,复制时不要遗漏字符或混入了多余换行符。
从 hadoop-01 分别向 hadoop-01, hadoop-04, firehare-303 发起 SSH 连接请求,确保不需要输入密码就能 SSH 连接成功。注意第一次 SSH 连接时会出现类似如下提示的信息:
The authenticity of host [hadoop-01] can't be established. The key fingerprint is: c8:c2:b2:d0:29:29:1a:e3:ec:d9:4a:47:98:29:b4:48 Are you sure you want to continue connecting (yes/no)?
请输入 yes, 这样 OpenSSH 会把连接过来的这台主机的信息自动加到 /home/hadoop/.ssh/know_hosts 文件中去,第二次再连接时,就不会有这样的提示信息了。
Hadoop的JAVA_HOME是在文件/etc/hadoop/conf/hadoop-env.sh中设置,具体设置如下:
sudo vi /etc/hadoop/conf/hadoop-env.sh export JAVA_HOME="/usr/lib/jvm/java-6-sun"
Hadoop的核心配置文件是/etc/hadoop/conf/core-site.xml,具体配置如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.default.name</name> <!-- <value>hdfs://localhost:8020</value> --> <value>hdfs://hadoop-01:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/lib/hadoop-0.20/cache/${user.name}</value> </property> </configuration>
Hadoop的分布式环境设置主要是通过文件/etc/hadoop/conf/hdfs-site.xml来实现的,具体配置如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>dfs.replication</name> <!-- <value>1</value> --> <value>3</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <!-- specify this so that running 'hadoop namenode -format' formats the right dir --> <name>dfs.name.dir</name> <value>/var/lib/hadoop-0.20/cache/hadoop/dfs/name</value> </property> </configuration>
Hadoop的分布式计算是采用了Map/Reduce算法,该算法环境的设置主要是通过文件/etc/hadoop/conf/mapred-site.xml来实现的,具体配置如下:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>mapred.job.tracker</name> <!-- <value>localhost:8021</value> --> <value>hadoop-01:8021</value> </property> </configuration>
首先设置主节点,编辑/etc/hadoop/conf/masters文件,如下所示:
hadoop-01
然后是设置从节点,编辑/etc/hadoop/conf/slaves文件,如下所示:
hadoop-02 hadoop-03 hadoop-04 firehare-303
从节点上的Hadoop设置很简单,只需要将主节点上的Hadoop设置,复制一份到从节点上即可。
scp -r /etc/hadoop/conf hadoop-02:/etc/hadoop scp -r /etc/hadoop/conf hadoop-03:/etc/hadoop scp -r /etc/hadoop/conf hadoop-04:/etc/hadoop scp -r /etc/hadoop/conf firehare-303:/etc/hadoop
在启动Hadoop之前还要做最后一个准备工作,那就是格式化分布式文件系统,这个只需要在主节点做就行了,具体如下:
/usr/lib/hadoop-0.20/bin/hadoop namenode -format
启动Hadoop可以通过以下命令来实现:
/usr/lib/hadoop-0.20/bin/start-all.sh
注意:该命令是没有加sudo的,如果加了sudo就会提示出错信息的,因为root用户并没有做无验证ssh设置。以下是输出信息,注意hadoop-03是故意没接的,所以出现No route to host信息。
[email protected]:~$ /usr/lib/hadoop-0.20/bin/start-all.sh namenode running as process 4836. Stop it first. hadoop-02: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-02.out hadoop-04: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-hadoop-04.out firehare-303: starting datanode, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-datanode-usvr-303b.out hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host hadoop-01: secondarynamenode running as process 4891. Stop it first. jobtracker running as process 4787. Stop it first. hadoop-02: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-02.out hadoop-04: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-hadoop-04.out firehare-303: starting tasktracker, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hadoop-tasktracker-usvr-303b.out hadoop-03: ssh: connect to host hadoop-03 port 22: No route to host
这样Hadoop就正常启动了!
正常启动之后,可以在 master 主机上通过以下网址检视 hadoop 运行状况:
http://localhost:50070/ ,检视分布式文件系统状况,其中 Live Nodes 字段应当显示为正常运行并连接到 namenode 服务器的 datanode 个数。
http://localhost:50030/ ,检视集群运转状况,其中 Nodes 字段应当显示正常运行并连接到 jobtracker 的 task tracker 个数。
通过安装 cloudera 提供的服务包,可以实现每次开机之后,hadoop 服务自动启动。
首先,在 master 对应的机器上安装 hadoop-0.20-jobtracker 和 hadoop-0.20-namenode 包。
sudo apt-get install hadoop-0.20-jobtracker hadoop-0.20-namenode
在 slave 对应机器上安装 hadoop-0.20-tasktracker 和 hadoop-0.20-datanode 包
sudo apt-get install hadoop-0.20-tasktracker hadoop-0.20-datanode
重新启动这些机器,可以通过上节提到的两个网址检视系统运行状况。
Hadoop架设好了,接下来就是要对其进行测试,看看它是否能正常工作,具体代码如下:
[email protected]:~$ hadoop-0.20 fs -mkdir input [email protected]:~$ hadoop-0.20 fs -put /etc/hadoop-0.20/conf/*.xml input [email protected]:~$ hadoop-0.20 fs -ls input Found 6 items -rw-r--r-- 3 hadoop supergroup 3936 2010-03-11 08:55 /user/hadoop/input/capacity-scheduler.xml -rw-r--r-- 3 hadoop supergroup 400 2010-03-11 08:55 /user/hadoop/input/core-site.xml -rw-r--r-- 3 hadoop supergroup 3032 2010-03-11 08:55 /user/hadoop/input/fair-scheduler.xml -rw-r--r-- 3 hadoop supergroup 4190 2010-03-11 08:55 /user/hadoop/input/hadoop-policy.xml -rw-r--r-- 3 hadoop supergroup 536 2010-03-11 08:55 /user/hadoop/input/hdfs-site.xml -rw-r--r-- 3 hadoop supergroup 266 2010-03-11 08:55 /user/hadoop/input/mapred-site.xml [email protected]:~$ hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar grep input output 'dfs[a-z.]+' 10/03/11 14:35:57 INFO mapred.FileInputFormat: Total input paths to process : 6 10/03/11 14:35:58 INFO mapred.JobClient: Running job: job_201003111431_0001 10/03/11 14:35:59 INFO mapred.JobClient: map 0% reduce 0% 10/03/11 14:36:14 INFO mapred.JobClient: map 33% reduce 0% 10/03/11 14:36:20 INFO mapred.JobClient: map 66% reduce 0% 10/03/11 14:36:26 INFO mapred.JobClient: map 66% reduce 22% 10/03/11 14:36:36 INFO mapred.JobClient: map 100% reduce 22% 10/03/11 14:36:44 INFO mapred.JobClient: map 100% reduce 100% 10/03/11 14:36:46 INFO mapred.JobClient: Job complete: job_201003111431_0001 10/03/11 14:36:46 INFO mapred.JobClient: Counters: 19 10/03/11 14:36:46 INFO mapred.JobClient: Job Counters 10/03/11 14:36:46 INFO mapred.JobClient: Launched reduce tasks=1 10/03/11 14:36:46 INFO mapred.JobClient: Rack-local map tasks=4 10/03/11 14:36:46 INFO mapred.JobClient: Launched map tasks=6 10/03/11 14:36:46 INFO mapred.JobClient: Data-local map tasks=2 10/03/11 14:36:46 INFO mapred.JobClient: FileSystemCounters 10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_READ=100 10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_READ=12360 10/03/11 14:36:46 INFO mapred.JobClient: FILE_BYTES_WRITTEN=422 10/03/11 14:36:46 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=204 10/03/11 14:36:46 INFO mapred.JobClient: Map-Reduce Framework 10/03/11 14:36:46 INFO mapred.JobClient: Reduce input groups=4 10/03/11 14:36:46 INFO mapred.JobClient: Combine output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Map input records=315 10/03/11 14:36:46 INFO mapred.JobClient: Reduce shuffle bytes=124 10/03/11 14:36:46 INFO mapred.JobClient: Reduce output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Spilled Records=8 10/03/11 14:36:46 INFO mapred.JobClient: Map output bytes=86 10/03/11 14:36:46 INFO mapred.JobClient: Map input bytes=12360 10/03/11 14:36:46 INFO mapred.JobClient: Combine input records=4 10/03/11 14:36:46 INFO mapred.JobClient: Map output records=4 10/03/11 14:36:46 INFO mapred.JobClient: Reduce input records=4 10/03/11 14:36:46 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 10/03/11 14:36:46 INFO mapred.FileInputFormat: Total input paths to process : 1 10/03/11 14:36:46 INFO mapred.JobClient: Running job: job_201003111431_0002 10/03/11 14:36:47 INFO mapred.JobClient: map 0% reduce 0% 10/03/11 14:36:56 INFO mapred.JobClient: map 100% reduce 0% 10/03/11 14:37:08 INFO mapred.JobClient: map 100% reduce 100% 10/03/11 14:37:10 INFO mapred.JobClient: Job complete: job_201003111431_0002 10/03/11 14:37:11 INFO mapred.JobClient: Counters: 18 10/03/11 14:37:11 INFO mapred.JobClient: Job Counters 10/03/11 14:37:11 INFO mapred.JobClient: Launched reduce tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: Launched map tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: Data-local map tasks=1 10/03/11 14:37:11 INFO mapred.JobClient: FileSystemCounters 10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_READ=100 10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_READ=204 10/03/11 14:37:11 INFO mapred.JobClient: FILE_BYTES_WRITTEN=232 10/03/11 14:37:11 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=62 10/03/11 14:37:11 INFO mapred.JobClient: Map-Reduce Framework 10/03/11 14:37:11 INFO mapred.JobClient: Reduce input groups=1 10/03/11 14:37:11 INFO mapred.JobClient: Combine output records=0 10/03/11 14:37:11 INFO mapred.JobClient: Map input records=4 10/03/11 14:37:11 INFO mapred.JobClient: Reduce shuffle bytes=0 10/03/11 14:37:11 INFO mapred.JobClient: Reduce output records=4 10/03/11 14:37:11 INFO mapred.JobClient: Spilled Records=8 10/03/11 14:37:11 INFO mapred.JobClient: Map output bytes=86 10/03/11 14:37:11 INFO mapred.JobClient: Map input bytes=118 10/03/11 14:37:11 INFO mapred.JobClient: Combine input records=0 10/03/11 14:37:11 INFO mapred.JobClient: Map output records=4 10/03/11 14:37:11 INFO mapred.JobClient: Reduce input records=4
不难看出,上述测试已经成功,这说明Hadoop部署成功,能够在上面进行Map/Reduce分布性计算了。
安装 netbeans:
sudo apt-get install netbeans
安装并配置 hadoop 插件可以参见:http://www.hadoopstudio.org/docs/tutorials/nb-tutorial-installation.html
http://wiki.ubuntu.org.cn/%E5%88%A9%E7%94%A8Cloudera%E5%AE%9E%E7%8E%B0Hadoophttp://www.51nod.com/onlineJudge/questionCode.html#!problemId=14861486 大大走格子题目来源: CodeForces基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右...
jvm 其实不难,就是你害怕学,你到底怕个jb呢,难道这比找让你女朋友和你讲道理还难么
由于我今天刚好要做无刷新分页的效果。所以就直接先上图了!如图,上部分是分页后取出来的数据。下部分是 分页器的实现(关于分页器的实现请参考 http://www.cnblogs.com/zhouzhaokun/archive/2011/08/24/2151558.html)我们先来实现页面的分页效果,1、新建一个 ajax 文件页面 ashx 或者 aspx, 我个人比较喜欢 aspx 。删掉页面...
微服务项目的结构与预览本项目模拟的是一个简单的商城管理系统。项目测试代码下载地址:https://github.com/shi469391tou/microservice-mallmanagement.gitmicroservice-eureka-server:用于服务注册发现microservice-gateway-zuul:用于API网关microservice-orderservi...
一、什么是lucene Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 上面这段是百度百科的解释,简单的说就是一个实现全文检索引擎的工具包,里面提供...
油猴脚本加载jq与prototype冲突,导致原来页面不好用var $1;function step1(){ console.log($1("a"))}(function() {$1=$.noConflict(true)})();参考百度经验https://jingyan.baidu.com/article/ab0b5630700295c15afa7df...
为什么80%的码农都做不了架构师?>>> ...
ECMAScript61、ES6简介1.1、什么是ES6ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。1.2、ECMAScript和JavaScript的关系一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript
最近恢复Venus的工作,恰逢十一假期尾声,突发一个Bug,让人匪夷所依。我们今天快速倒序追踪,层层回顾。1. 背景Venus交易中需要并行开数十至百个线程分别快速计算,程序中使用CountDownLatch用于计数,因为之后后做其他处理分析,需要等待所有交易结束。程序运行稳定正常,线上也已经0.16版本(个人线上),恰逢十一假期突然出问
你被爬虫侵扰过么?当你看到“爬虫”两个字的时候,是不是已经有点血脉贲张的感觉了?千万要忍耐,稍稍做点什么,就可以在名义上让他们胜利,实际上让他们受损失。一、为什么要反爬虫1、爬虫占总PV比例较高,这样浪费钱(尤其是三月份爬虫)。三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高峰期。最初我们百思不得其解。直到有一次,四月份的时候,我们删除了一个url,然后有
默认的placeholder字体颜色呈浅灰色,有时候会需要修改文字颜色,解决方案如下:修改所有的input::-webkit-input-placeholder { color: red;}:-moz-placeholder {/* Firefox 18- */ color: ...
这里写自定义目录标题python3.8如何正确安装使用ExcelLibrary新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入python3.8如何正确安装使用ExcelLibrary尝试过pip install rob