zoukankan      html  css  js  c++  java
  • hadoop2 Ubuntu 下安装部署

    搭建Hadoop环境( 我以hadoop 2.7.3 为例, 系统为 64bit Ubuntu14.04 ) hadoop 2.7.3 官网下载 , 选择自己要安装的版本。注意每个版本对应两个下载选项source和binary,我们暂时下载binary,我们下载编译好的文件hadoop-2.7.3.tar.gz , 解压后为 hadoop-2.7.3 , 这个可以直接安装部署. ( 如果下载源代码文件 hadoop-2.7.3-src.tar.gz , 需要先编译后才能进行安装部署. )

    Hadoop有三种安装部署模式,分别是:第一,单机安装部署;第二,伪分布式安装部署;第三,全分布式安装部署.  我们还是以hadoop-2.7.3为例

    第一以及第二在单个节点上部署集群,参见官网 Hadoop:设置单个节点集群。  参考 Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04  

    第三是要在多个节点上进行部署集群,参见官网 Hadoop集群安装  

    安装hadoop前的准备工作

    (1) 安装jdk     参见我的博客 安装JDK+Eclipse+Maven(windows系统和linux系统)  
    (2) 安装openssl-server   

      集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server: ( 或者直接 sudo apt-get install openssh )

    $ sudo apt-get install openssh-server

      安装后,可以使用如下命令登陆本机:

    $ ssh localhost

      此时会有如下提示(SSH首次登陆提示),输入 yes 。然后按提示输入密码 ,这样就登陆到本机了。

    (3) 免密码登陆

      但这样登陆是需要每次输入密码的,我们需要配置成SSH无密码登陆比较方便。

      单台机器的无密码登录( 登录 localhost ): ( 单机安装部署以及伪分布式安装部署 )

      首先退出刚才的 ssh,就回到了我们原先的终端窗口,然后利用 ssh-keygen 生成密钥,并将密钥加入到授权中:

    $ exit                           # 退出刚才的 ssh localhost
    $ cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost $ ssh-keygen -t rsa # 会有提示,都按回车就可以 $ cat ./id_rsa.pub >> ./authorized_keys # 加入授权

      此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了

      还有多台机器间的无密码登录: ( 全分布式安装部署 )

     

    安装Hadoop2

      接下来我们安装hadoop到/usr/local/目录下, ( 也可以是其他目录 )

    $ cd /usr/local
    $ sudo cp ~/Desktop/hadoop-x.x.x.tar.gz . //别忽视最后的点,代表当前目录
    $ sudo tar -zxvf hadoop-x.x.x.tar.gz
    $ sudo mv hadoop-x.x.x hadoop //简化名字而已,改不改都行
    $ sudo chown -R hadoop ./hadoop // 修改文件权限

      Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:

    $ cd /usr/local/hadoop
    $ ./bin/hadoop version

      配置全局变量:

    $ sudo vim /etc/profile    // 设置全局变量, 不配置的话只能命令所在的文件夹下运行

      添加如下代码:

    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
    export PATH=$HADOOP_HOME/bin:$PATH

      如果出现链接错误请关闭防火墙:

    service iptables save
    service iptables stop
    chkconfig iptables off

    1 单机安装部署

      Hadoop 默认模式为非分布式模式,无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。( 可以运行 bin 下的命令, 但不能用 sbin 下的start-all.sh ) , 比如可以用 bin/hadoop version 查看hadoop版本号.

      也可以按如下配置Hadoop.

    配置Hadoop

      更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件

    #The java implementation to use.
    #export JAVA_HOME=${JAVA_HOME}
    export JAVA_HOME=/usr/lib/jvm/java

      core-site.xml文件配置

        <configuration>
            <property>
                <name>fs.default.name</name>
                <value>hdfs://localhost:9000</value>
            </property>
        </configuration>

      hdfs-site.xml文件配置

    <--更改hadoop默认的副本个数,由于我们是单节点所以改为只有一个副本就好-->
        <configuration>
            <property>
                <name>dfs.replication</name>
                <value>1</value>
            </property>
        </configuration>

      mapred-site.xml文件配置

        <configuration>
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
        </configuration>

      yarn-site.xml文件配置

        <configuration>
            <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
            </property>
        </configuration>

    2 伪分布式安装部署

       Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xmlhdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

    配置Hadoop

      更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件

    #The java implementation to use.
    #export JAVA_HOME=${JAVA_HOME}
    export JAVA_HOME=/usr/lib/jvm/java

      core-site.xml文件配置   ( 为hdfs的工作目录(可以不设)默认为hadoop的tmp目录下(重启后数据就会消失下次还得重新格式化) )

        <configuration>
           <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property>
    <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration>

      hdfs-site.xml文件配置

        <configuration>
                <property>
                     <name>dfs.replication</name>
                     <value>1</value>
                </property>
                <property>
                     <name>dfs.namenode.name.dir</name>
                     <value>file:/usr/local/hadoop/tmp/dfs/name</value>
                </property>
                <property>
                     <name>dfs.datanode.data.dir</name>
                     <value>file:/usr/local/hadoop/tmp/dfs/data</value>
                </property>
        </configuration>

      mapred-site.xml文件配置

        <configuration>
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
        </configuration>

      yarn-site.xml文件配置

        <configuration>
            <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
            </property>
        </configuration>

      配置完成后,执行 NameNode 的格式化:( 只能进行一次格式化, 否则会出错 )

    $ ./bin/hdfs namenode -format

      成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

      如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。

      接着开启所有的守护进程。

    $ ./sbin/start-all.sh

      若出现如下SSH提示,输入yes即可。

      启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。该 WARN 提示可以忽略,并不会影响正常使用(该 WARN 可以通过编译 Hadoop 源码解决)。

      启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程: “NameNode”、”DataNode” 和 “SecondaryNameNode” , "ResourceManager" 和 "NodeManager"(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-all.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。

      成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。 ( 类似下图的效果 )

    3 全分布式安装部署

      包括单台机器的虚拟机部署以及多个节点(即多台机器)的部署

    3.1 单台机器的虚拟机安装部署

      hadoop学习通过虚拟机安装hadoop完全分布式集群 虚拟机安装 Hadoop  , VM虚拟机CentOS下hadoop集群安装过程 ,  全分布式的Hadoop虚拟机安装
    3.2 多个节点(即多台机器)的安装部署
      这个和虚拟机安装部署类似,只不过是虚拟机是一台机器虚拟出多台机器, 而多台机器的安装是实实在在的有多个机器.

    3.1 和 3.2 如下所式: ( 3.1 比3.2 多出  安装Vmware WorkStation软件 以及  在虚拟机上安装linux操作系统 )

    准备4个(虚拟)机器节点

      配置好jdk以及ssh免密码登录之后. 一般HDFS的文件块默认是3个备份, 所有至少有3个节点. 而且用户名最好保持一致, 我的用户名设置为 hadoop ,我这里有4台机器,所以,在准备好这4个结点之后,需要分别将linux系统的主机名重命名,重命名主机名的方法:

    $ vim /etc/hostname

      通过修改hostname文件即可,这4个点结均要修改,以示区分:

      以下是我对4个结点的ubuntu系统主机分别命名为:master, node1, node2, node3

    安装过程主要有以下几个步骤:
    (1) 配置hosts文件
    (2) 建立hadoop运行帐号
    (3) 配置ssh免密码连入
    (4) 下载并解压hadoop安装包
    (5) 配置namenode,修改site文件
    (6) 配置hadoop-env.sh文件
    (7) 配置masters和slaves文件
    (8) 向各节点复制hadoop
    (9) 格式化namenode
    (10) 启动hadoop
    (11) 用jps检验各后台进程是否成功启动
    (12) 通过网站查看集群情况

    下面我们对以上过程,各个击破吧!~~

    (1) 配置hosts文件 ( /etc/hosts )

       先简单说明下配置hosts文件的作用,它主要用于确定每个结点的IP地址,方便后续master结点能快速查到并访问各个结点。在上述4个(虚拟机)结点上均需要配置此文件。由于需要确定每个结点的IP地址,所以在配置hosts文件之前需要先查看当前虚机结点的IP地址是多少,可以通过ifconfig命令进行查看,( 假设所有主机都在192.168.1.X 网段内 )如实验中,master结点的IP地址为:192.168.1.100, node1结点的IP地址为:192.168.1.101, node2结点的IP地址为:192.168.1.102, node3结点的IP地址为:192.168.1.103. 

      如果IP地址不对,可以通过ifconfig命令更改结点的物理IP地址,示例如下:

    hadoop@master:~$ sudo ifconfig eth0 192.168.1.100

      通过上面命令可以将IP改为192.168.1.100。如果觉得这样做麻烦,可以固定IP. 将每个结点的IP地址设置完成后,就可以配置hosts文件了,hosts文件路径为 /etc/hosts,我的hosts文件配置如下,大家可以参考自己的IP地址以及相应的主机名完成配置, 每台机器都一样,这里以master主机为例:

    127.0.0.1    localhost
    #127.0.0.1    master
    
    192.168.1.100    master
    192.168.1.101    node1
    192.168.1.102    node2
    192.168.1.103    node3

    (2) 建立hadoop运行帐号

      即为hadoop集群专门设置一个用户组及用户,这部分比较简单,参考示例如下:

    $ sudo groupadd hadoop    //设置hadoop用户组
    $ sudo useradd –s /bin/bash –d /home/hadoop –m hadoop –g hadoop –G admin   //添加一个hadoop用户,此用户属于hadoop用户组,且具有admin权限。
    $ sudo passwd hadoop   //设置用户hadoop登录密码
    $ su hadoop   //切换到hadoop用户中

      上述4个虚机结点均需要进行以上步骤来完成hadoop运行帐号的建立。

    (3) 配置ssh免密码连入

      这一环节最为重要,而且也最为关键,因为本人在这一步骤裁了不少跟头,走了不少弯路,如果这一步走成功了,后面环节进行的也会比较顺利。 SSH主要通过RSA算法来产生公钥与私钥,在数据传输过程中对数据进行加密来保障数据的安全性和可靠性,公钥部分是公共部分,网络上任一结点均可以访问,私钥主要用于对数据进行加密,以防他人盗取数据。总而言之,这是一种非对称算法,想要破解还是非常有难度的。Hadoop集群的各个结点之间需要进行数据的访问,被访问的结点对于访问用户结点的可靠性必须进行验证, hadoop采用的是ssh的方法通过密钥验证及数据加解密的方式进行远程安全登录操作,当然,如果hadoop对每个结点的访问均需要进行验证,其效率将会大大降低,所以才需要配置SSH免密码的方法直接远程连入被访问结点,这样将大大提高访问效率。

      OK,废话就不说了,下面看看如何配置SSH免密码登录吧!~~

    参见 ssh 免密码登录  , ssh 免密码登录1 , ssh 免密码登录2  ,其中在第一个链接 ssh 免密码登录 中, 缺少 修改SSH配置文件  su root  -->登陆root用户修改配置文件  vim /etc/ssh/sshd_config -->去掉下图中三行的注释

    下面是我的配置: 

    (1) 生成公钥和私钥 

      在每台机器上

    $ ssh-keygen    // 等同于ssh-keygen -t rsa

      运行上面的命令后,系统会出现一系列提示,可以一路回车,例如:

    $ ssh-keygen 
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/glowd/.ssh/id_rsa): Enter
    // 特别说明,要不要对私钥设置口令(passphrase),如果担心私钥的安全,可以设置一个。没有特殊需求直接Enter,为空

      运行结束以后, 默认在 ~/.ssh目录生成两个文件:
      id_rsa :私钥
      id_rsa.pub :公钥

    (2) 导入公钥到认证文件,更改权限

      导入本机

    $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

      导入本机后就可以无密码登录localhost

    $ ssh localhost

      导入要免密码登录的服务器, 我们以 master (192.168.1.100 ) 和 node1(192.168.1.101 ) 为例, 这之前已经设置/etc/hosts ,让主机名和IP对应, 这样主机名既是IP, 否则下面的主机名要用IP 代替. 

      要想 node1 免密码登录 master, 首先将 node1 的公钥复制到远端服务器 master,用户为hadoop . 把node1机下的id_rsa.pub复制到master机下,在master机的.ssh/authorized_keys文件里,我用scp复制。

    $ scp ~/.ssh/id_rsa.pub hadoop@master:~  

      由于还没有免密码登录的,所以要输入密码。

      在服务器上master上, master 机把从 node1 机复制的id_rsa.pub添加到.ssh/authorzied_keys文件里。

    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 
    $ rm ~/id_rsa.pub  -->保险起见,删除传过来的公钥

      在服务器master上更改权限(必须), authorized_keys的权限要是600

    $ chmod 755 ~
    $ chmod 700 ~/.ssh
    $ chmod 600 ~/.ssh/authorized_keys  

      以上执行之后,有些机器应该可以直接访问了,可以测试一下. node1 机登录 master 机。 ( 用户名相同的话, 可以直接用IP, 否则要用 ssh hadoop@master )

    ssh 192.168.1.100  #ssh master

      第一次登录是时要你输入yes。
      现在 node1 机可以无密码登录 master 机了。

      同理, 要想 master 也免密码登录 node1 , 只需要执行相同的操作,

      要想 master 免密码登录 node1, 首先将 master 的公钥复制到远端服务器 node1,用户为hadoop . 把master机下的id_rsa.pub复制到node1 机下,在node1机的.ssh/authorized_keys文件里,我用scp复制。

    $ scp ~/.ssh/id_rsa.pub hadoop@node1:~  

      由于还没有免密码登录的,所以要输入密码。

      在服务器上node1上, node1 机把从 master 机复制的id_rsa.pub添加到.ssh/authorzied_keys文件里。

    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys 
    $ rm ~/id_rsa.pub  -->保险起见,删除传过来的公钥

      在服务器node1上更改权限(必须), authorized_keys的权限要是600

    $ chmod 755 ~
    $ chmod 700 ~/.ssh
    $ chmod 600 ~/.ssh/authorized_keys  

      以上执行之后,有些机器应该可以直接访问了,可以测试一下. master 机登录 node1 机。 ( 用户名相同的话, 可以直接用IP, 否则要用 ssh hadoop@node1 )

    ssh 192.168.1.101  # ssh node1

      第一次登录是时要你输入yes。
      现在 master 机可以无密码登录 node1 机了。

      这样, 这两台机器就可以相互免密码登录了.

    (3) 常见问题及解决方案

      生成密钥并上传至远程主机后,任然不可用.

      这时打开服务器的 /etc/ssh/sshd_config 这个文件,取消注释。

      重启服务器的ssh服务。

    #RHEL/CentOS系统
    $ service sshd restart
    #ubuntu系统
    $ service ssh restart
    #debian系统
    $ /etc/init.d/ssh restart

      执行ssh-copy-id 命令

    $ ssh-copy-id glowd@{remote ip}
     #`如果不是默认端口22,是9001`
    $ ssh-copy-id -p 9001 glowd@{remote ip}

      .....

      还有就是你的host key has just been changed,即主机码变了,比如node1的变了,那么node2链接node1就会出问题,这时候就需要把node2中的node1的码删除再重新添加。删除方法如下:

    ssh-keygen -f "/home/hadoop/.ssh/known_hosts" -R node1

    (4) 前面搞定了免密码登录,想想也是很激动了。但是,还要写ip,还要写用户名,是不是又有点不爽啦。搞定用户名和端口号

      找到 ~/.ssh/config 文件,如果木有的话就自个儿建一个吧,内容如下:

    Host {remote ip}
    User {username} 
    Port {port}

      现在连接就很简单了

    $ ssh {remote ip}

    (4) 下载并解压hadoop安装包

      前面已经下好了

    (5) 配置  namenode,修改site文件

      先完成JDK配置, 在设置JDK 以及 Hadoop 的全局环境变量. 到目前为止,准备工作已经完成,下面开始修改hadoop的配置文件了,即各种site文件,文件存放在/hadoop/etc/hadoop下,主要配置core-site.xml、hdfs-site.xml、mapred-site.xml 以及 yarn-site.xml 这四个文件。 

      core-site.xml文件配置

        <configuration>
                <property>
                     <name>hadoop.tmp.dir</name>
                     <value>file:/usr/local/hadoop/tmp</value>
                     <description>Abase for other temporary directories.</description>
                </property>
                <property>
                     <name>fs.default.name</name>
                     <value>hdfs://master:9000</value>
                </property>
        </configuration>

      hdfs-site.xml文件配置

        <configuration>
                <property>
                     <name>dfs.replication</name>
                     <value>3</value>
                </property>
                <property>
                     <name>dfs.namenode.name.dir</name>
                     <value>file:/usr/local/hadoop/tmp/dfs/name</value>
                </property>
                <property>
                     <name>dfs.datanode.data.dir</name>
                     <value>file:/usr/local/hadoop/tmp/dfs/data</value>
                </property>
           <property>
                 <name>dfs.namenode.http-address</name>
                 <value>Master:50070</value>
             </property> </configuration>

      mapred-site.xml文件配置

        <configuration>
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
         <property>
               <name>mapreduce.jobhistory.address</name>
               <value>Master:10020</value>
           </property>
           <property>
               <name>mapreduce.jobhistory.webapp.address</name>
               <value>Master:19888</value>
           </property> </configuration>

      yarn-site.xml文件配置

        <configuration>
         <property>
               <name>yarn.resourcemanager.hostname</name>
               <value>master</value>
           </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
         <property>
               <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
               <value>org.apache.hadoop.mapred.ShuffleHandler</value>
           </property>
           <property>  
               <name>yarn.log-aggregation-enable</name>  
               <value>true</value>  
               <description>Configuration to enable or disable log aggregation</description>    
           </property> </configuration>

      
    (6) 配置hadoop-env.sh文件

      更改/usr/local/hadoop/etc/hadoop下的 hadoop-env.sh 文件。(我的jdk也是安装在/usr/lib/jvm下的), 还可以修改 mapred-env.sh 以及 yarn-env.sh 文件

    #The java implementation to use.
    #export JAVA_HOME=${JAVA_HOME}
    export JAVA_HOME=/usr/lib/jvm/java


    (7) 配置slaves文件 (在 /usr/local/hadoop/etc/hadoop 下)

      slaves文件里默认有localhost , 修改成如下:

    # localhost
    master    #可有可无, 有的话 master 既是主节点也作从节点,存储HDFS数据块. 没有的话,master只是主节点, 不进行数据块存储.
    node1
    node2
    node3

    (8) 向各节点复制hadoop ( 假设以上的hadoop 配置文件都是在 master 上配置)

      这时向 node1, node2 以及 node3 节点复制hadoop: ( 以 node1 为例 )

    $ sudo scp -r /usr/local/hadoop node1:~

      然后进入 node1 , 把 hadoop 移动到 相应的位置, 在退出

    $ ssh node1
    $ sudo mv hadoop /usr/local/hadoop
    $ exit

      然后 node2 以及 node3 同样.

      这样,结点 node1 和结点 node2 以及 node3 也安装了配置好的hadoop软件了。


    (9) 格式化namenode

      一定要在主节点 master 上进行格式化, 而且只能进行一次, 否则会出错. 我们已经配置hadoop为全局变量.

    $ hadoop namenode -format   #如果没有设置全局变量,在 /usr/local/hadoop 目录下输入 ./bin/hadoop namenode -format

      注意:成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

      如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。


    (10) 启动hadoop

      这一步也在主结点master上进行操作:

    $ start-all.sh   #如果没有设置全局变量,在 /usr/local/hadoop 目录下输入 ./sbin/start-all.sh


    (11) 用jps检验各后台进程是否成功启动

      在主结点master上查看namenode,resourcemanager,secondarynamenode进程是否启动。

    $ jps

      如果出现以上进程则表示正确。

      在 node1 和 node2 以及 node3 结点了查看nodemanager和datanode进程是否启动。 ( 以node1 为例 )

    $ jps

      如果出现以上进程则表示正确。 node2 和 node3 也是 .

      进程都启动成功了。恭喜~~~

     
    (12) 通过网站查看集群情况

      在浏览器中输入:http://192.168.1.100:50030,网址为master结点所对应的IP: ( http://master:50030 ,这两个等同)

      在浏览器中输入:http://192.168.1.100:50070,网址为master结点所对应的IP:

      在浏览器中输入:http://192.168.1.100:8088,网址为master结点所对应的IP:

    至此,hadoop的完全分布式集群安装已经全部完成,

     

     

  • 相关阅读:
    译:编程面试的10大算法概念汇总
    Android内存优化之封装九宫格
    Android Java 程序员必备开发工具
    译:如何成为一个通晓多种编程语言的程序员
    8大排序算法图文讲解
    Android酷炫实用的开源框架(UI框架)
    Android动态加载字节码
    利用无效字节码指令引发逆向工具崩溃(二)
    oracle 12c linux服务器启动监听
    oracle无主键去重方法
  • 原文地址:https://www.cnblogs.com/zhangchao0515/p/7097463.html
Copyright © 2011-2022 走看看