zoukankan      html  css  js  c++  java
  • 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:
    主机名          IP      安装的软件                      运行的进程
    master    192.168.199.130   jdk、hadoop                      NameNode、DFSZKFailoverController(zkfc)
    slaver1    192.168.199.131    jdk、hadoop                       NameNode、DFSZKFailoverController(zkfc)
    slaver2    192.168.199.132    jdk、hadoop                     ResourceManager
    slaver3    192.168.199.133    jdk、hadoop                     ResourceManager
    slaver4    192.168.199.134    jdk、hadoop、zookeeper       DataNode、NodeManager、JournalNode、QuorumPeerMain
    slaver5    192.168.199.135    jdk、hadoop、zookeeper       DataNode、NodeManager、JournalNode、QuorumPeerMain
    slaver6    192.168.199.136    jdk、hadoop、zookeeper       DataNode、NodeManager、JournalNode、QuorumPeerMain
    2)注意:hadoop-2.6.4又增加了YARN HA:

      apache提供的hadoop-2.6.4的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库,所以如果在64位的操作上安装hadoop-2.6.4就需要重新在64操作系统上重新编译
    (建议第一次安装用32位的系统,我将编译好的64位的也上传到群共享里了,如果有兴趣的可以自己编译一下)

    3)说明:
        a:在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
          hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
          这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
        b:hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.6.4解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调

    1:hadoop分布式集群HA模式部署,七台机器跑集群:
      第一台机器:namenode zkfc
      第二台机器:namenode zkfc
      第三台机器:resourcemanager
      第四台机器:resourcemanager
      第五台机器:zookeeper journalnode dataNode nodemanager
      第六台机器:zookeeper journalnode dataNode nodemanager
      第七台机器:zookeeper journalnode dataNode nodemanager

    2:之前的博客已经搭建过Zookeeper集群了,http://www.cnblogs.com/biehongli/p/7650570.html,然后我在原来的三个虚拟机的基础上面又加了四台虚拟机,这个时候同时跑七台虚拟机,电脑很吃力,所以自己的电脑尽可能配置要高些,这个电脑,8G内存,i5的处理器,虚拟机内存我每台虚拟机先设置512M,然后使用Xshell连接以后,将图形化界面关闭,ctrl+alt+f7,使用命令行模式;

    3:Hadoop分布式集群HA模式部署开始准备:

      (1)首先,三台机器部署Zookeeper集群http://www.cnblogs.com/biehongli/p/7650570.html,之前已经部署过了,这里部署过程省略了;

      (2)我的分别是centos01(master节点),centos02(slaver1节点),centos03(slaver2节点)部署的是Zookeeper集群;

        centos04,centos05部署NameNode节点;

        centos06,centos07部署resourcemanager节点

        然后centos01(master节点),centos02(slaver1节点),centos03(slaver2节点)增加DataNode节点;

    4:首先将新加的四台虚拟机的主机名称修改和ip对应关系修改一下:

    [root@localhost hadoop]# vim /etc/sysconfig/network

    5:结合前期学习和现在的搭建Hadoop分布式集群HA模式部署的准备:

      (1)修改Linux主机名
      (2)修改IP
      (3)修改主机名和IP的映射关系(七台虚拟机都按照下面的对应关系写):
          ######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机、阿里云主机等);
          /etc/hosts里面要配置的是内网IP地址和主机名的映射关系 ;


      (4)关闭防火墙(七台虚拟机全部关闭防火墙)
    [root@localhost hadoop]# service iptables stop 关闭防火墙
    [root@localhost hadoop]# service iptables status 查看防火墙是否关闭


      (5)ssh免登陆(免密登录只要理解其过程,这里不再贴图过程,过程很多,之前也贴过详细的,http://www.cnblogs.com/biehongli/p/7640469.html):

         七台虚拟机配置好了免秘钥登录之后,然后直接免秘钥登录第一次还要输入yes很心烦,然后百度一下,下面是输入yes的错误和解决办法:

    The authenticity of host 'slaver6 (192.168.3.135)' can't be established.
    RSA key fingerprint is cc:4e:23:01:ca:97:52:21:85:78:bc:29:ca:b3:12:52.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'slaver6' (RSA) to the list of known hosts.
    Last login: Thu Oct 12 22:34:41 2017 from master

           解决办法(挺好使的):

    修改/etc/ssh/ssh_config文件的配置,以后则不会再出现此问题
    
    最后面添加:
    
    StrictHostKeyChecking no
    
    UserKnownHostsFile /dev/null

         验证一下,完成了免秘钥登录,(需要注意的是我一直用的root权限,所以免秘钥登录必须使用root权限才可以):

      (6)安装JDK,配置环境变量等(由于我的机器都改成了命令行模式,所以使用命令将jdk传到新装的四台虚拟机上面),记得上传之后解压缩操作哈,我都忘记了,然后直接验证,郁闷咋不正确呢,闹笑话了吧:

     

        然后配置一下jdk环境,由于我的jdk存放路径都一样,所以直接复制之前的文件即可(vim /etc/profile):

        修改的如下所示([root@slaver3 hadoop]#  source /etc/profile),修改/etc/profile文件,让它即时生效 source /etc/profile

         修改好之后验证一下(七台虚拟机全部验证jdk是否安装配置成功):

    6:学习Hadoop分布式集群HA模式部署:

    集群规划:
        主机名          IP                  安装的软件                        运行的进程
       master     192.168.3.129      jdk、hadoop                        NameNode、DFSZKFailoverController(zkfc)
       slaver1    192.168.3.130      jdk、hadoop                        NameNode、DFSZKFailoverController(zkfc)
       slaver2    192.168.3.131      jdk、hadoop                        ResourceManager
       slaver3    192.168.3.132      jdk、hadoop                        ResourceManager
       slaver4    192.168.3.133      jdk、hadoop、zookeeper         DataNode、NodeManager、JournalNode、QuorumPeerMain
       slaver5    192.168.3.134      jdk、hadoop、zookeeper         DataNode、NodeManager、JournalNode、QuorumPeerMain
       slaver6    192.168.3.135      jdk、hadoop、zookeeper         DataNode、NodeManager、JournalNode、QuorumPeerMain

    说明:
        (1)在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
        (2)hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode,这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
        (3)hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调

     7:安装配置zooekeeper集群(在master,slaver1,slaver2上),之前写过,这里写下过程,具体操作不再贴:

    (1)解压
                tar -zxvf zookeeper-3.4.5.tar.gz
    (2)修改配置
                cd /home/hadoop/zookeeper-3.4.5/conf/
                cp  zoo_sample.cfg  zoo.cfg
                vim zoo.cfg
                修改:dataDir=/home/hadoop/zookeeper-3.4.5/tmp
                在最后添加:
                server.1=master:2888:3888
                server.2=slaver1:2888:3888
                server.3=slaver2:2888:3888
                保存退出
                然后创建一个tmp文件夹
                mkdir /home/hadoop/zookeeper-3.4.5/tmp
                再创建一个空文件
                touch /home/hadoop/zookeeper-3.4.5/tmp/myid
                最后向该文件写入ID
                echo 1 > /home/hadoop/zookeeper-3.4.5/tmp/myid
    (3)将配置好的zookeeper拷贝到其他节点(首先分别在slaver1、slaver2根目录下的/home/hadoop)
                scp -r /home/hadoop/zookeeper-3.4.5/ slaver1:/home/hadoop/
                scp -r /home/hadoop/zookeeper-3.4.5/ slaver2:/home/hadoop/
                
                注意:修改slaver1、slaver2对应/home/hadoop/zookeeper-3.4.5/tmp/myid内容
                weekend06:
                    echo 2 >/home/hadoop/zookeeper-3.4.5/tmp/myid
                weekend07:
                    echo 3 >/home/hadoop/zookeeper-3.4.5/tmp/myid

    8:安装配置hadoop集群(在slaver4上操作),首先将Hadoop的安装包hadoop-2.4.1.tar.gz上传到centos04上面,并且解压缩:

    [root@localhost hadoop]# tar -zxvf hadoop-2.4.1.tar.gz

    配置HDFS(hadoop2.0所有的配置文件都在hadoop-2.4.1/etc/hadoop目录下),#将hadoop添加到环境变量中,七台虚拟机都配置都配置一下hadoop的环境变量,这里在后加的四台虚拟机配置一下hadoop的环境变量,不过可以现在slaver3(centos04将hadoop配置好,直接复制到剩下的三台虚拟机上面,这样效率最高):

    修改的如下所示(贴下代码,好复制粘贴):

    export JAVA_HOME=/home/hadoop/jdk1.7.0_65
    
    export HADOOP_HOME=/home/hadoop/hadoop-2.4.1
    
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    第一个配置文件:修改hadoo-env.sh(首先切换到cd /home/hadoop/hadoop-2.4.1/etc/hadoop/):

    修改内容如下所示(即配置jdk的路径):

     

    第二个配置文件:修改core-site.xml(修改的内容如下,方便复制)

    <configuration>
        <!-- 指定hdfs的nameservice为nameService1 -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://ns1/</value>
        </property>
        <!-- 指定hadoop临时目录 -->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/hadoop-2.4.1/tmp</value>
        </property>
    
        <!-- 指定zookeeper地址 -->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>master:2181,slaver1:2181,slaver2:2181</value>
        </property>
    </configuration>

    修改的内容如下,方便复制:

    第三个配置文件:修改hdfs-site.xml(修改的内容如下,方便复制)

    <configuration>
    <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
    <property>
    <name>dfs.nameservices</name>
    <value>ns1</value>
    </property>
    <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
    <property>
    <name>dfs.ha.namenodes.ns1</name>
    <value>nn1,nn2</value>
    </property>
    <!-- nn1的RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.ns1.nn1</name>
    <value>slaver3:9000</value>
    </property>
    <!-- nn1的http通信地址 -->
    <property>
    <name>dfs.namenode.http-address.ns1.nn1</name>
    <value>slaver3:50070</value>
    </property>
    <!-- nn2的RPC通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.ns1.nn2</name>
    <value>slaver4:9000</value>
    </property>
    <!-- nn2的http通信地址 -->
    <property>
    <name>dfs.namenode.http-address.ns1.nn2</name>
    <value>slaver4:50070</value>
    </property>
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master:8485;slaver1:8485;slaver2:8485/ns1</value>
    </property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value>
    </property>
    <!-- 开启NameNode失败自动切换 -->
    <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    </property>
    <!-- 配置失败自动切换实现方式 -->
    <property>
    <name>dfs.client.failover.proxy.provider.ns1</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
    sshfence
    shell(/bin/true)
    </value>
    </property>
    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
    </property>
    <!-- 配置sshfence隔离机制超时时间 -->
    <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
    </property>
    </configuration>

    操作内容如(内容太多,分开截屏了)vim hdfs-site.xml:

    第四个配置文件:修改mapred-site.xml(修改的内容如下,方便复制)

    <configuration>
    <!-- 指定mr框架为yarn方式 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    </configuration>

     操作内容如下所示:

    [root@slaver3 hadoop]# cp mapred-site.xml.template mapred-site.xml
    [root@slaver3 hadoop]# vim mapred-site.xml

    第五个配置文件:修改yarn-site.xml(修改的内容如下,方便复制)

    <configuration>
    <!-- 开启RM高可用 -->
    <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
    </property>
    <!-- 指定RM的cluster id -->
    <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yrc</value>
    </property>
    <!-- 指定RM的名字 -->
    <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
    </property>
    <!-- 分别指定RM的地址 -->
    <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>slaver5</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>slaver6</value>
    </property>
    <!-- 指定zk集群地址 -->
    <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>master:2181,slaver1:2181,slaver2:2181</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    </configuration>

     操作如下所示:

     配置无密登录ssh-keygen -t rsa,ssh-copy-id快速配置无密登录,centos04虚拟机(即slaver3节点配置无密登录,登录自己,登录master,登录slaver1,登录slaver2,登录slaver4,我配置的无密登录七台虚拟机,这点看你自己吧。);centos06虚拟机(即slaver5节点配置无密登录,登录自己,登录master,登录slaver1,登录slaver2);

    #注意:两个namenode之间要配置ssh免密码登陆,

    第六个配置文件:修改slaves(修改的内容如下,方便复制)

    注意:slaves文件就是启动DataNode、NodeManager、一定要理解概念和含义。

    修改slaves(slaves是指定子节点的位置,因为要在slaver3上启动HDFS、在slaver5启动yarn,所以slaver3上的slaves文件指定的是datanode的位置,slaver5上的slaves文件指定的是nodemanager的位置):

    master
    slaver1
    slaver2

    操作如下所示vim slaves:

    之前,master,slaver1,slaver2配置过三台机器的集群,这里因为需要,由slaver3配置好的hadoop复制到剩余的六台机器,这里要删除之前的集群,这里先不删除home/hadoop/hadoop-2.4.1,先将这个名称改了,万一七台机器的集群搭建失败,还可以使用三台机器的集群;

    如: [root@slaver1 hadoop]# mv hadoop-2.4.1 hadoop-2.4.1-copy

     将配置好的hadoop拷贝到其他节点(有虚拟机04,slaver3节点):

    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ master:/home/hadoop/
    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver1:/home/hadoop/
    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver2:/home/hadoop/
    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver4:/home/hadoop/
    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver5:/home/hadoop/
    [root@slaver3 hadoop]# scp -r hadoop-2.4.1/ slaver6:/home/hadoop/

    9:配置至此已经全部结束,如果启动出错再回头看,现在开始启动:

     ###注意:严格按照下面的步骤:

      9.1:启动zookeeper集群(分别在master、slaver1、slaver2上启动zookeeper,#查看状态:一个leader,两个follower):

     [root@master hadoop]# cd /home/hadoop/zookeeper-3.4.5

    然后启动剩下的两个Zookeeper节点:

     

    然后查看一下第一个启动的Zookeeper节点的状态,如下所示:

     

      9.2:启动journalnode,为hadoop提供元数据管理(edits),第一次需要手动起,以后就不需要手动启动了,就包含在了start-dfs.sh脚本里面了;(分别在在master、slaver1、slaver2上执行),#运行jps命令检验,masterslaver1slaver2上多了JournalNode进程:

     

    其实启动master节点以后,slaver1节点,和slaver2节点的journalnode已经启动起来了,可以查看一下:

     

     如果启动过程中有的节点没有启动起来,下面介绍一下如何查看日志,这点自己应该必须会吧,如hadoop没启动起来,就查看hadoop的日志(进入日志以后使用大G可以直接到达尾行,这样可以直接看报啥错误。):

    [root@master logs]# less hadoop-root-journalnode-master.log

       9.3:格式化HDFS,在slaver3上执行命令:hdfs namenode -format或者./hadoop namenode -format;

        #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hadoop/hadoop-2.4.1/tmp,然后将/home/hadoop/hadoop-2.4.1/tmp拷贝到slaver4/home/hadoop/hadoop-2.4.1/下。

    可以查看一下,创建了tmp目录,里面的初始fsimage:

    现在要保持slaver3和slaver4的fsimage初始值保持一致,即复制slaver3到slaver4:

    scp -r tmp/ slaver4:/home/hadoop/app/hadoop-2.4.1/

      9.4:格式化ZKFC,zkfc用来做两个namenode的状态切换管理或者失败切换管理,(在slaver3上执行即可):hdfs zkfc -formatZK

     

    格式化以后会在Zookeeper写一些东西,现在可以看一下去(master节点):

     

    启动[root@master bin]# ./zkCli.sh

    可以看到建立一个数据节点,叫做hadoop-ha

       9.5:启动HDFS(在slaver3上执行):sbin/start-dfs.sh或者start-dfs.sh(如果配置了hadoop的环境变量),如下图可以很清楚的看到那个节点启动那些进程,自己仔细分析一下,做到心中有数:

     

    最好去看看其他节点的进程是否启动起来,分别贴一下其他节点的进程启动情况:

     

      9.6:启动YARN(#####注意#####:是在slaver5上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动):   sbin/start-yarn.sh或者 start-yarn.sh(如果配置了hadoop的环境变量,source /etc/profile修改的配置文件即时生效):

     接着启动一下slaver6节点的yarn:

    如下所示:start-yarn-.sh或者yarn-daemon.sh start resourcemanager

    到此,hadoop-2.4.1配置完毕,可以使用浏览器访问:

     http://192.168.3.132:50070
     NameNode 'slaver3:9000' (active)
     http://192.168.3.133:50070
     NameNode 'slaver4:9000' (standby)

     现在可以再看一下各个节点的启动情况:

     

     我准备用浏览器访问一下的时候,浏览器不能访问,我可以ping通我的192.168.3.132,郁闷了,节点都起来了,突然一想,可能是防火墙没关,然后关了防火墙试一下,如下所示:

     

     浏览器访问如下所示(slaver3/192.168.3.132是active的;slaver4/192.168.3.133是standby的):

     查看一下yarn集群管理的界面(slaver5/192.168.3.134):

    当我启动其中一个yarn的时候出现如:This is standby RM. Redirecting to the current active RM(这是备用RM。重定向到当前活动RM),

    而另一个yarn就可以正常启动:

    10:验证HDFS HA:

      首先向hdfs上传一个文件(首先查看此目录下面是否存在数据:

        cd /home/hadoop/hadoop-2.4.1/tmp/dfs/data/current/BP-1794153128-192.168.3.132-1508123872265/current/finalized):

     

    开始上传文件:

    然后在master,slaver1,slaver2节点都可以看到block块:

     

    现在文件已经上传了,可以看到集群是正常工作的,然后看看'slaver3:9000' (active)是active的,'slaver4:9000' (standby)是standby的,把slaver3干掉,看看是否正常切换:

    (然后再kill掉active的NameNode):

    然后看看另一个,正常的话肯定由standby变成了active:(这个时候slaver4上的NameNode变成了active)

    从hdfs上面下载上传的文件,看看能否下载,看看集群是否正常工作:

     

    现在将那个kill挂掉的nameNode启动起来:

    通过浏览器访问:http://192.168.3.132:50070,如下所示:

     如果http://192.168.3.133:50070/即slaver4突然断电,那么切换到slaver3需要等待自己配置的30s,然后自己由standby切换为active;

     如果slaver3为active了,然后上传文件的过程中,将slaver3的namenode杀掉,然后可以发现文件可以正常上传,slaver4由standby切换为active了;

     11:验证YARN(查看yarn的状态也不好查看,yarn的ha机制不是很好,这里测试的结果就是如果两个resourcemanager都正常,肯定可以完成任务,如果一个死了,另一个也可以完成任务,如果把active的杀死了,任务就失败了):

       运行一下hadoop提供的demo中的WordCount程序:

     hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out

    然后发现一直卡住不动了,可能是内存不够了,master节点,slaver1节点,slaver2节点的nodemanager进程都没了:

    好吧,先不测试了:

    12:测试集群工作状态的一些指令:

    bin/hdfs dfsadmin -report    查看hdfs的各节点状态信息
    
    bin/hdfs haadmin -getServiceState nn1  获取一个namenode节点的HA状态
    
    sbin/hadoop-daemon.sh start namenode  单独启动一个namenode进程
    
    ./hadoop-daemon.sh start zkfc   单独启动一个zkfc进程

     

    可以hdfs的参数:

     如haadmin用来管理ha的:

     

    手动将standby切换为active:

     

    手动将active切换为standby

     

    可以去浏览器看看slaver4的状态,如下所示:

    或者通过命令查看namenode的状态:

     学习新知识自己就像白痴一样,学完以后发现,哦,原来又学到新知识了,是对知识的饥渴,哦,是渴望。思考可以帮助你理解。

  • 相关阅读:
    Office 2007在安装过程中出错-解决办法
    Sql日期时间格式转换
    大型网站架构演变和知识体系
    作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
    Java 入门基础
    技术类面试、笔试题汇总
    怎样玩转千万级别的数据
    数据库性能优化:SQL索引
    最后一公里极速配送
    编辑-滴滴算法大赛算法解决过程
  • 原文地址:https://www.cnblogs.com/biehongli/p/7660310.html
Copyright © 2011-2022 走看看