hadoop完全分布式+hive+sqoop+hbase+spark+zookeeper

================

IP地址用户名密码主机名
10.1.1.101rootpasswordmaster
10.1.1.102rootpasswordslave1
10.1.1.103rootpasswordslave2
主机名IP服务名用户名密码
master10.1.1.101mysqlrootpassword
组件版本Linux版本下载地址
java8https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
hadoop2.7.1https://archive.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
hive2.0.0https://archive.apache.org/dist/hive/hive-2.0.0/apache-hive-2.0.0-bin.tar.gz
sqoop1.4.7https://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
zookeeper3.4.8https://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
spark2.0.0https://archive.apache.org/dist/spark/spark-2.0.0/spark-2.0.0-bin-hadoop2.7.tgz
hbase1.2.1https://archive.apache.org/dist/hbase/1.2.1/hbase-1.2.1-bin.tar.gz

注:所有安装包都在/h3cu下,本环境已经安装好mysql

1、虚拟机基础配置

1.1、修改主机名

  1. master

    [root@localhost ~]# hostnamectl set-hostname master 
    [root@localhost ~]# bash
    [root@master ~]# 
    
  2. slave1

    [root@localhost ~]# hostnamectl set-hostname slave1
    [root@localhost ~]# bash 
    [root@slave1 ~]#
    
  3. slave2

    [root@localhost ~]# hostnamectl set-hostname slave2
    [root@localhost ~]# bash 
    [root@slave2 ~]# 
    

1.2、配置hosts域名解析

1.2.1、查看三台主机ip地址
  1. master

    [root@master ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:5a:51:a2 brd ff:ff:ff:ff:ff:ff
        inet 10.1.1.101/24 brd 10.1.1.255 scope global eno16777736
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe5a:51a2/64 scope link 
           valid_lft forever preferred_lft forever
    
  2. slave1

    [root@slave1 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:c8:8c:15 brd ff:ff:ff:ff:ff:ff
        inet 10.1.1.102/24 brd 10.1.1.255 scope global eno16777736
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fec8:8c15/64 scope link 
           valid_lft forever preferred_lft forever
    
  3. slave2

    [root@slave2 ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:43:d4:07 brd ff:ff:ff:ff:ff:ff
        inet 10.1.1.103/24 brd 10.1.1.255 scope global eno16777736
           valid_lft forever preferred_lft forever
        inet6 fe80::20c:29ff:fe43:d407/64 scope link 
           valid_lft forever preferred_lft forever
    
    
1.2.2、master配置hosts文件
[root@master ~]# vi /etc/hosts
10.1.1.101 master
10.1.1.102 slave1
10.1.1.103 slave2
1.2.3、测试连接性
[root@master ~]# ping master -c 2
PING master (10.1.1.101) 56(84) bytes of data.
64 bytes from master (10.1.1.101): icmp_seq=1 ttl=64 time=0.137 ms
64 bytes from master (10.1.1.101): icmp_seq=2 ttl=64 time=0.084 ms

--- master ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1008ms
rtt min/avg/max/mdev = 0.084/0.110/0.137/0.028 ms
[root@master ~]# ping slave1 -c 2
PING slave1 (10.1.1.102) 56(84) bytes of data.
64 bytes from slave1 (10.1.1.102): icmp_seq=1 ttl=64 time=0.497 ms
64 bytes from slave1 (10.1.1.102): icmp_seq=2 ttl=64 time=0.388 ms

--- slave1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 0.388/0.442/0.497/0.058 ms
[root@master ~]# ping slave2 -c 2
PING slave2 (10.1.1.103) 56(84) bytes of data.
64 bytes from slave2 (10.1.1.103): icmp_seq=1 ttl=64 time=0.430 ms
64 bytes from slave2 (10.1.1.103): icmp_seq=2 ttl=64 time=0.214 ms

--- slave2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1005ms
rtt min/avg/max/mdev = 0.214/0.322/0.430/0.108 ms
  1. 将hosts文件分发给slave1和slave2

    [root@master ~]# scp /etc/hosts slave1:/etc/
    The authenticity of host 'slave1 (10.1.1.102)' can't be established.
    ECDSA key fingerprint is a2:ec:2f:3a:b9:33:d3:a7:fd:51:9d:d7:cf:ce:fb:ea.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'slave1,10.1.1.102' (ECDSA) to the list of known hosts.
    root@slave1's password: 
    hosts                                                                                      100%  212     0.2KB/s   00:00    
    [root@master ~]# scp /etc/hosts slave2:/etc/
    The authenticity of host 'slave2 (10.1.1.103)' can't be established.
    ECDSA key fingerprint is a2:ec:2f:3a:b9:33:d3:a7:fd:51:9d:d7:cf:ce:fb:ea.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'slave2,10.1.1.103' (ECDSA) to the list of known hosts.
    root@slave2's password: 
    hosts                                                                                      100%  212     0.2KB/s   00:00    
    
  2. 关闭防火墙

    1. master

      [root@master ~]# systemctl status firewalld 
      ● firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2021-06-19 03:14:26 CST; 5h 7min ago
       Main PID: 872 (firewalld)
         CGroup: /system.slice/firewalld.service
                 └─872 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
      
      Jun 19 03:14:25 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
      Jun 19 03:14:26 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
      [root@master ~]# systemctl stop firewalld 
      [root@master ~]# systemctl disable firewalld 
      Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
      Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
      
    2. slave1

      [root@slave1 ~]# systemctl status firewalld 
      ● firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2021-06-19 03:14:50 CST; 6h ago
       Main PID: 875 (firewalld)
         CGroup: /system.slice/firewalld.service
                 └─875 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
      
      Jun 19 03:14:50 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
      Jun 19 03:14:50 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
      [root@slave1 ~]# systemctl stop firewalld 
      [root@slave1 ~]# systemctl disable firewalld 
      Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
      Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
      
      
    3. slave2

      [root@slave2 ~]# systemctl status firewalld 
      ● firewalld.service - firewalld - dynamic firewall daemon
         Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2021-06-19 03:15:00 CST; 6h ago
       Main PID: 873 (firewalld)
         CGroup: /system.slice/firewalld.service
                 └─873 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
      
      Jun 19 03:15:00 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
      Jun 19 03:15:00 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
      [root@slave2 ~]# systemctl stop firewalld 
      [root@slave2 ~]# systemctl disable firewalld 
      Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
      Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
      

2、配置SSH

2.1、生成秘钥文件

  1. master

    [root@master ~]# ssh-keygen -t rsa -P ''
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    42:04:1c:9e:1d:ad:f2:ed:ae:4c:21:92:30:9d:3b:f8 root@master
    The key's randomart image is:
    +--[ RSA 2048]----+
    |   .ooo.         |
    | . o.+ ..        |
    |o o o o.         |
    | + o...          |
    |. = .oo.S        |
    | . o ..o.        |
    |  E   ..         |
    |     o  .        |
    |      oo.        |
    +-----------------+
    
  2. slave1

    [root@slave1 ~]# ssh-keygen -t rsa -P ''
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    30:22:3d:06:35:2d:ac:65:33:b4:0d:43:c2:ee:d0:c1 root@slave1
    The key's randomart image is:
    +--[ RSA 2048]----+
    | oo=B.           |
    |  E+B*.          |
    | o.=*++          |
    |. +o o o         |
    | o      S        |
    |  .              |
    |                 |
    |                 |
    |                 |
    +-----------------+
    
  3. slave2

    [root@slave2 ~]# ssh-keygetn -t rsa -P ''
    bash: ssh-keygetn: command not found
    [root@slave2 ~]# ssh-keygen -t rsa -P ''
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    Created directory '/root/.ssh'.
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    a3:01:98:3c:a6:ec:20:d0:57:0b:4b:56:0c:27:cf:c3 root@slave2
    The key's randomart image is:
    +--[ RSA 2048]----+
    |    *++          |
    | o = X..         |
    |. B + E          |
    |oo o . .         |
    |+.    . S        |
    |+      o .       |
    | .    .          |
    |                 |
    |                 |
    +-----------------+
    

2.2、master分发公钥

[root@master ~]# ssh-copy-id -i master 
The authenticity of host 'master (10.1.1.101)' can't be established.
ECDSA key fingerprint is a2:ec:2f:3a:b9:33:d3:a7:fd:51:9d:d7:cf:ce:fb:ea.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@master's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'master'"
and check to make sure that only the key(s) you wanted were added.

[root@master ~]# ssh-copy-id -i slave1 
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave1'"
and check to make sure that only the key(s) you wanted were added.

[root@master ~]# ssh-copy-id -i slave2
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave2's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave2'"
and check to make sure that only the key(s) you wanted were added.

2.3、测试master登录slave1

[root@master ~]# ssh slave1
Last login: Sat Jun 19 03:21:18 2021 from 10.1.1.1

3、配置java环境

3.1、卸载openjdk

[root@master ~]# rpm -qa |grep openjdk
通过rpm -e --nodeps "查询出来的rpm包" 去卸载

3.2、安装java

  1. 将/h3cu下面的java安装到/usr/local/src下

    [root@master ~]# tar -xzf /h3cu/jdk-8u144-linux-x64.tar.gz -C /usr/local/src/
    
  2. 将解压后的java文件重命名为java

    [root@master ~]# mv /usr/local/src/jdk1.8.0_144 /usr/local/src/java
    
  3. 配置java环境变量,仅使当前用户生效

    [root@master ~]# vi /root/.bash_profile
    export JAVA_HOME=/usr/local/src/java
    export PATH=$PATH:$JAVA_HOME/bin
    
  4. 加载环境变量,查看java的版本信息

    [root@master ~]# source /root/.bash_profile 
    [root@master ~]# java -version 
    java version "1.8.0_144"
    Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
    Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
    
  5. 将java分发给slave1和slave2

    [root@master ~]# scp -r /usr/local/src/java slave1:/usr/local/src/
    [root@master ~]# scp -r /usr/local/src/java slave2:/usr/local/src/
    [root@master ~]# scp /root/.bash_profile slave1:/root/
    [root@master ~]# scp /root/.bash_profile slave2:/root/
    

4、配置hadoop完全分布式

  1. 将/h3cu下的hadoop解压到/usr/lcoal/src下(master上操作)

    [root@master ~]# tar -xzf /h3cu/hadoop-2.7.1.tar.gz -C /usr/local/src/
    
  2. 将解压后的hadoop文件重命名为hadoop

    [root@master ~]# ll /usr/local/src/
    total 8
    drwxr-xr-x. 9 10021 10021 4096 Jun 29  2015 hadoop-2.7.1
    drwxr-xr-x. 8    10   143 4096 Jul 22  2017 java
    [root@master ~]# mv /usr/local/src/hadoop-2.7.1 /usr/local/src/hadoop
    [root@master ~]# ll /usr/local/src/
    total 8
    drwxr-xr-x. 9 10021 10021 4096 Jun 29  2015 hadoop
    drwxr-xr-x. 8    10   143 4096 Jul 22  2017 java
    
  3. 配置hadoop环境变量,仅当前用户生效

    [root@master ~]# vi /root/.bash_profile 
    export HADOOP_HOME=/usr/local/src/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    
  4. 加载环境变量,查看hadoop版本

    [root@master ~]# source /root/.bash_profile 
    [root@master ~]# hadoop version 
    Hadoop 2.7.1
    Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a
    Compiled by jenkins on 2015-06-29T06:04Z
    Compiled with protoc 2.5.0
    From source with checksum fc0a1a23fc1868e4d5ee7fa2b28a58a
    This command was run using /usr/local/src/hadoop/share/hadoop/common/hadoop-common-2.7.1.jar
    
  5. 配置hadoop-env.sh

    [root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/hadoop-env.sh 
    export JAVA_HOME=/usr/local/src/java
    
  6. 配置core-site.xml

    1. 命令

      [root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/core-site.xml 
      
    2. 配置文件添加内容

      <property>
        <!--namenode的URL地址(必须写)-->
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
      </property>
      <property>
        <!--SequenceFiles中使用的读/写缓冲区的大小,单位为KB,131072KB默认为64M(该配置可选)-->
        <name>io.file.buffer.size</name>
        <value>131072</value>
      </property>
      <property>
        <!--hadoop临时文件路径(可选配置)-->
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/src/hadoop/dfs/tmp</value>
      </property>
      
  7. 配置hdfs-site.xml

    1. 命令

      [root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/hdfs-site.xml 
      
    2. 配置文件添加内容

      <property>
        <!--hadoop的副本数量,默认为3(必须写)-->
        <name>dfs.replication</name>
        <value>3</value>
      </property>
      <property>
        <!--在本地文件系统所在的NameNode的存储空间和持续化处理日志(必须写)-->
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/src/hadoop/dfs/name</value>
      </property>
      <property>
        <!--在本地文件系统所在的DataNode的存储空间和持续化处理日志(必须写)-->
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/src/hadoop/dfs/data</value>
      </property>
      <property>
        <!--设置namenode线程,处理datanode发出rpc请求数量(可选配置)-->
        <name>dfs.namenode.handler.count</name>
        <value>100</value>
      </property>
      
  8. 配置mapred-site.xml

    1. 命令

      [root@master ~]# cp /usr/local/src/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/src/hadoop/etc/hadoop/mapred-site.xml
      [root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/mapred-site.xml
      
    2. 配置文件添加内容

      <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
      </property>
      
  9. 配置yarn-site.xml

    1. 命令

      [root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/yarn-site.xml 
      
    2. 配置文件添加内容(全部必须写入)

      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <property>  
          <name>yarn.resourcemanager.address</name>  
          <value>master:8032</value>  
      </property> 
      <property>
          <name>yarn.resourcemanager.scheduler.address</name>  
          <value>master:8030</value>  
      </property>
      <property>
          <name>yarn.resourcemanager.resource-tracker.address</name>  
          <value>master:8031</value>  
      </property>
      
  10. 配置slaves

[root@master ~]# vi /usr/local/src/hadoop/etc/hadoop/slaves
master
slave1
slave2
  1. 将hadoop文件和环境变量文件分发给slave1和slave2

    [root@master ~]# scp -r /usr/local/src/hadoop slave1:/usr/local/src/
    [root@slave2 ~]# scp -r /usr/local/src/hadoop slave2:/usr/local/src/
    [root@slave1 ~]# scp /root/.bash_profile slave1:/root
    [root@slave1 ~]# scp /root/.bash_profile slave2:/root
    
  2. namenode进行格式化

    [root@master ~]# hdfs namenode -format 
    21/06/19 08:27:08 INFO namenode.NameNode: STARTUP_MSG: 
    /************************************************************
    STARTUP_MSG: Starting NameNode
    STARTUP_MSG:   host = master/10.1.1.101
    STARTUP_MSG:   args = [-format]
    STARTUP_MSG:   version = 2.7.1
    STARTUP_MSG:   classpath = /usr/local/src/hadoop/etc/hadoo(此处省略)
    STARTUP_MSG:   build = https://git-wip-us.apache.org/repos/asf/hadoop.git -r 15ecc87ccf4a0228f35af08fc56de536e6ce657a; compiled by 'jenkins' on 2015-06-29T06:04Z
    STARTUP_MSG:   java = 1.8.0_144
    ************************************************************/
    ...省略
    21/06/19 08:27:09 INFO namenode.FSImage: Allocated new BlockPoolId: BP-83508879-10.1.1.101-1624062429594
    21/06/19 08:27:09 INFO common.Storage: Storage directory /usr/local/src/hadoop/dfs/name has been successfully formatted.
    21/06/19 08:27:09 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
    21/06/19 08:27:09 INFO util.ExitUtil: Exiting with status 0
    21/06/19 08:27:09 INFO namenode.NameNode: SHUTDOWN_MSG: 
    /************************************************************
    SHUTDOWN_MSG: Shutting down NameNode at master/10.1.1.101
    ************************************************************/
    
  3. 启动hadoop集群,查看守护进程

    1. 启动

      [root@master ~]# start-all.sh 
      This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
      Starting namenodes on [master]
      master: starting namenode, logging to /usr/local/src/hadoop/logs/hadoop-root-namenode-master.out
      slave1: starting datanode, logging to /usr/local/src/hadoop/logs/hadoop-root-datanode-slave1.out
      slave2: starting datanode, logging to /usr/local/src/hadoop/logs/hadoop-root-datanode-slave2.out
      master: starting datanode, logging to /usr/local/src/hadoop/logs/hadoop-root-datanode-master.out
      Starting secondary namenodes [0.0.0.0]
      0.0.0.0: starting secondarynamenode, logging to /usr/local/src/hadoop/logs/hadoop-root-secondarynamenode-master.out
      starting yarn daemons
      starting resourcemanager, logging to /usr/local/src/hadoop/logs/yarn-root-resourcemanager-master.out
      slave1: starting nodemanager, logging to /usr/local/src/hadoop/logs/yarn-root-nodemanager-slave1.out
      slave2: starting nodemanager, logging to /usr/local/src/hadoop/logs/yarn-root-nodemanager-slave2.out
      master: starting nodemanager, logging to /usr/local/src/hadoop/logs/yarn-root-nodemanager-master.out
      
    2. jps查看

      1. master

        [root@master ~]# jps
        10802 SecondaryNameNode
        11042 NodeManager
        10948 ResourceManager
        10535 NameNode
        10651 DataNode
        11326 Jps
        
      2. slave1

        [root@slave1 ~]# jps
        2660 NodeManager
        2777 Jps
        2555 DataNode
        

5、部署hive组件

  1. 将/h3cu下的hive解压到/usr/lcoal/src下(master上操作)

    [root@master ~]# tar -xzvf /h3cu/apache-hive-2.0.0-bin.tar.gz -C /usr/local/src/
    
  2. 将解压后的hadoop文件重命名为hadoop

    [root@master ~]# mv /usr/local/src/apache-hive-2.0.0-bin /usr/local/src/hive 
    
  3. 配置hadoop环境变量,仅当前用户生效

    [root@master ~]# vi /root/.bash_profile 
    export HIVE_HOME=/usr/local/src/hive
    export PATH=$PATH:$HIVE_HOME/bin
    [root@master ~]# source /root/.bash_profile 
    
  4. 解压mysql-connect驱动包,将jar复制到hive的lib目录下

    [root@master ~]# tar -xzf /h3cu/mysql-connector-java-5.1.27.tar.gz -C /usr/local/src/
    [root@master ~]# cp /usr/local/src/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar /usr/local/src/hive/lib/
    
  5. 配置hive-site.xml

    1. 命令

      [root@master ~]# cp /usr/local/src/hive/conf/hive-default.xml.template /usr/local/src/hive/conf/hive-site.xml
      [root@master ~]# vi /usr/local/src/hive/conf/hive-site.xml 
      
    2. 内容

      <property>
        <!--连接数据库URL(必选参数)-->
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
      </property>
      <property>
        <!--连接数据驱动(必选参数)-->
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
      </property>
      <property>
        <!--数据库连接用户名(必选参数)-->
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
      </property>
      <property>
        <!--数据库连接密码(必选参数)-->
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>password</value>
      </property>
      <property>
        <!--验证元数据的一致性,默认为false(可选参数)-->
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
      </property>
      <property>
        <!--指定HDFS内hive数据临时文件存放目录,启动hive>,HDFS自动创建(可选参数)-->
        <name>hive.exec.scratchdir</name>
        <value>/hive/warehouse/tmp</value>
      </property>
      <property>
        <!--指定HDFS内hive数据的存放目录,HDFS自动创建(可选参数)-->
        <name>hive.metastore.warehouse.dir</name>
        <value>/hive/warehouse/home</value>
      </property>
      <property>
        <!--客户端显示当前数据库名称信息(可选参数)-->
        <name>hive.cli.print.header</name>
        <value>true</value>
      </property>
      <property>
        <!--客户端显示当前数据库名称(可选参数)-->
        <name>hive.cli.print.current.db</name>
        <value>true</value>
      </property>
      <property>
        <!--支持正则匹配(可选参数)-->
        <name>hive.support.quoted.identifiers</name>
        <value>none</value>
      </property>
      
  6. hive初始化

    [root@master ~]# schematool -dbType mysql -initSchema
    which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/usr/local/src/java/bin:/usr/local/src/hadoop/bin:/usr/local/src/hadoop/sbin:/root/bin:/usr/local/src/java/bin:/usr/local/src/hadoop/bin:/usr/local/src/hadoop/sbin:/usr/local/src/hive/bin)
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hive-jdbc-2.0.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/local/src/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    Metastore connection URL:	 jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false
    Metastore Connection Driver :	 com.mysql.jdbc.Driver
    Metastore connection User:	 root
    Starting metastore schema initialization to 2.0.0
    Initialization script hive-schema-2.0.0.mysql.sql
    Initialization script completed
    schemaTool completed
    
  7. 进入hive shell

    [root@master ~]# hive 
    which: no hbase in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/usr/local/src/java/bin:/usr/local/src/hadoop/bin:/usr/local/src/hadoop/sbin:/root/bin:/usr/local/src/java/bin:/usr/local/src/hadoop/bin:/usr/local/src/hadoop/sbin:/usr/local/src/hive/bin)
    SLF4J: Class path contains multiple SLF4J bindings.
    SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/hive-jdbc-2.0.0-standalone.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/local/src/hive/lib/log4j-slf4j-impl-2.4.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: Found binding in [jar:file:/usr/local/src/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
    SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
    SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
    
    Logging initialized using configuration in jar:file:/usr/local/src/hive/lib/hive-common-2.0.0.jar!/hive-log4j2.properties
    cHive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
    hive (default)> show databases;
    OK
    database_name
    default
    Time taken: 0.707 seconds, Fetched: 1 row(s)
    hive (default)> create database test;
    OK
    Time taken: 0.178 seconds
    hive (default)> show databases;
    OK
    database_name
    default
    test
    Time taken: 0.021 seconds, Fetched: 2 row(s)
    

6、部署sqoop组件

  1. 将/h3cu下的sqoop解压到/usr/local/src下

    [root@master ~]# tar -xzvf /h3cu/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C   /usr/local/src/
    
  2. 将解压后的sqoop文件重命名为sqoop

    [root@master ~]# mv /usr/local/src/sqoop-1.4.7.bin__hadoop-2.6.0 /usr/local/src/sqoop
    
  3. 配置sqoop环境变量

    [root@master ~]# vi /root/.bash_profile 
    export SQOOP_HOME=/usr/local/src/sqoop
    export PATH=$PATH:$SQOOP_HOME/bin
    
  4. 加载sqoop环境变量,查看sqoop版本信息

    [root@master ~]# source /root/.bash_profile 
    [root@master ~]# sqoop version 
    Warning: /usr/local/src/sqoop/../hbase does not exist! HBase imports will fail.
    Please set $HBASE_HOME to the root of your HBase installation.
    Warning: /usr/local/src/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
    Please set $HCAT_HOME to the root of your HCatalog installation.
    Warning: /usr/local/src/sqoop/../accumulo does not exist! Accumulo imports will fail.
    Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    Warning: /usr/local/src/sqoop/../zookeeper does not exist! Accumulo imports will fail.
    Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
    21/06/21 02:13:30 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
    Sqoop 1.4.7
    git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
    Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
    
  5. 添加mysql驱动

    [root@master ~]# cp /usr/local/src/mysql-connector-java-5.1.27/mysql-connector-java-5.1.27-bin.jar /usr/local/src/sqoop/lib/
    
  6. 配置sqoop-env.sh

    [root@master ~]# cp /usr/local/src/sqoop/conf/sqoop-env-template.sh /usr/local/src/sqoop/conf/sqoop-env.sh
    [root@master ~]# vi /usr/local/src/sqoop/conf/sqoop-env.sh
    export HADOOP_COMMON_HOME=/usr/local/src/hadoop
    export HADOOP_MAPRED_HOME=/usr/local/src/hadoop
    export HIVE_HOME=/usr/local/src/hive
    
  7. 测试sqoop

    [root@master ~]# sqoop list-databases --connect jdbc:mysql://master:3306 --username root --password password
    Warning: /usr/local/src/sqoop/../hbase does not exist! HBase imports will fail.
    Please set $HBASE_HOME to the root of your HBase installation.
    Warning: /usr/local/src/sqoop/../hcatalog does not exist! HCatalog jobs will fail.
    Please set $HCAT_HOME to the root of your HCatalog installation.
    Warning: /usr/local/src/sqoop/../accumulo does not exist! Accumulo imports will fail.
    Please set $ACCUMULO_HOME to the root of your Accumulo installation.
    Warning: /usr/local/src/sqoop/../zookeeper does not exist! Accumulo imports will fail.
    Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
    21/06/21 02:20:05 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
    21/06/21 02:20:05 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
    21/06/21 02:20:05 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
    information_schema
    hive
    mysql
    performance_schema
    sys
    test
    

7、部署zookeeper集群

  1. 将/h3cu下的zookeeper解压到/usr/local/src

    [root@master ~]# tar -xvzf /h3cu/zookeeper-3.4.8.tar.gz -C /usr/local/src/
    
  2. 将解压后文件重命名为zookeeper

    [root@master ~]# mv /usr/local/src/zookeeper-3.4.8 /usr/local/src/zookeeper
    
  3. 配置zookeeper环境变量,加载环境变量,仅对当前用户生效

    [root@master ~]# vi /root/.bash_profile 
    export ZOOKEEPER_HOME=/usr/local/src/zookeeper
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    [root@master ~]# source /root/.bash_profile 
    
  4. 配置zoo.cfg配置文件

    dataDir进行修改,server三行写入进去

    [root@master ~]# cp /usr/local/src/zookeeper/conf/zoo_sample.cfg /usr/local/src/zookeeper/conf/zoo.cfg
    [root@master ~]# vi /usr/local/src/zookeeper/conf/zoo.cfg 
    dataDir=/usr/local/src/zookeeper/data
    server.1=master:2888:3888
    server.2=slave1:2888:3888
    server.3=slave2:2888:3888
    
  5. 配置myid文件

    [root@master ~]# mkdir /usr/local/src/zookeeper/data
    [root@master ~]# echo "1" > /usr/local/src/zookeeper/data/myid
    
  6. 将文件分发给slave1和slave2

    [root@master ~]# scp -r /usr/local/src/zookeeper slave1:/usr/local/src/ 
    [root@master ~]# scp -r /usr/local/src/zookeeper slave2:/usr/local/src/
    [root@master ~]# scp /root/.bash_profile slave1:/root/
    [root@master ~]# scp /root/.bash_profile slave2:/root/
    
  7. 修改slave1和slave2的myid文件

    • slave1

      [root@slave1 ~]# echo 2 > /usr/local/src/zookeeper/data/myid 
      
    • slave2

      [root@slave2 ~]# echo 3 > /usr/local/src/zookeeper/data/myid 
      
  8. 分别启动zk集群

    • master

      [root@master ~]# source /root/.bash_profile 
      [root@master ~]# zkServer.sh start 
      ZooKeeper JMX enabled by default
      Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      
    • slave1

      [root@slave1 ~]# source /root/.bash_profile 
      [root@slave1 ~]# zkServer.sh start 
      ZooKeeper JMX enabled by default
      Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      
    • slave2

      [root@slave2 ~]# source /root/.bash_profile 
      [root@slave2 ~]# zkServer.sh start 
      ZooKeeper JMX enabled by default
      Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
      Starting zookeeper ... STARTED
      
  9. 分别查看zk集群的状态

    注意:leader和follower是选举出来不是固定在某台机器上

    [root@master ~]# zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    [root@master ~]# jps
    17120 QuorumPeerMain
    16449 SecondaryNameNode
    16594 ResourceManager
    16695 NodeManager
    16297 DataNode
    17230 Jps
    16175 NameNode
    [root@slave1 ~]# zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
    Mode: leader
    [root@slave1 ~]# jps
    15587 NodeManager
    15481 DataNode
    15721 Jps
    15050 QuorumPeerMain
    [root@slave2 ~]# zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    [root@slave2 ~]# jps
    14965 QuorumPeerMain
    15480 NodeManager
    15374 DataNode
    15647 Jps
    

8、部署hbase完全分布式

  1. 将/h3cu下的hbase解压到/usr/local/src

    [root@master ~]# tar -xvzf /h3cu/hbase-1.2.1-bin.tar.gz -C /usr/local/src/
    
  2. 将解压后的文件重命名为hbase

    [root@master ~]# mv /usr/local/src/hbase-1.2.1/ /usr/local/src/hbase
    
  3. 配置hbase的环境变量

    [root@master ~]# vi /root/.bash_profile 
    export HBASE_HOME=/usr/local/src/hbase
    export PATH=$PATH:$HBASE_HOME/bin
    [root@master ~]# source /root/.bash_profile 
    
  4. 配置hbase-site.xml

    • 命令

      
      
    • 配置文件内容

      <property>
        <!--是否分布式部署(必选)-->
        <name>hbase.cluster.distributed</name>
        <value>true</value>
      </property>
      <property>
        <!--hbase存放数据目录(必选)-->
        <name>hbase.rootdir</name>
        <value>hdfs://master:9000/hbase</value>
      </property>
      <property>
        <!--zookooper配置、日志等的存储位置(必选)-->
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/usr/local/src/zookeeper/ZKdata</value>
      </property>
      <property>
        <!--配置zk端口(必选)-->
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
      </property>
      <property>
        <!--zookeeper地址(必选)-->
        <name>hbase.zookeeper.quorum</name>
        <value>master,slave1,slave2</value>
      </property>
      <property>
        <!--设置hbase端口(必选)-->
        <name>hbase.master.info.port</name>
        <value>16010</value>
      </property>
      
  5. 配置hbase-env.sh

    [root@master ~]# vim /usr/local/src/hbase/conf/hbase-env.sh 
    export JAVA_HOME=/usr/local/src/java
    export HBASE_MANAGES_ZK=false
    
  6. 配置regionservers

    [root@master ~]# vim /usr/local/src/hbase/conf/regionservers 
    master
    slave1
    slave2
    
  7. 配置备用backup-master

    [root@master ~]# vim /usr/local/src/hbase/conf/backup-masters
    slave1
    
  8. 分发给slave1和slave1

    [root@master ~]# scp /root/.bash_profile slave1:/root/
    [root@master ~]# scp /root/.bash_profile slave2:/root/
    [root@master ~]# scp -r /usr/local/src/hbase slave1:/usr/local/src/ 
    [root@master ~]# scp -r /usr/local/src/hbase slave2:/usr/local/src/ 
    
  9. 启动hbase

    [root@master ~]# start-hbase.sh 
    starting master, logging to /usr/local/src/hbase/logs/hbase-root-master-localhost.localdomain.out
    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
    slave2: starting regionserver, logging to /usr/local/src/hbase/bin/../logs/hbase-root-regionserver-slave2.out
    slave1: starting regionserver, logging to /usr/local/src/hbase/bin/../logs/hbase-root-regionserver-slave1.out
    master: starting regionserver, logging to /usr/local/src/hbase/bin/../logs/hbase-root-regionserver-master.out
    slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
    slave2: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    slave2: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
    master: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    master: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
    slave1: starting master, logging to /usr/local/src/hbase/bin/../logs/hbase-root-master-slave1.out
    slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
    slave1: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
    [root@master ~]# jps
    17120 QuorumPeerMain
    18273 SecondaryNameNode
    18114 DataNode
    19602 HRegionServer
    17987 NameNode
    18423 ResourceManager
    18537 NodeManager
    19465 HMaster
    19803 Jps
    [root@slave1 ~]# jps
    15587 NodeManager
    16099 HRegionServer
    16184 HMaster
    15481 DataNode
    15050 QuorumPeerMain
    16412 Jps
    [root@slave2 ~]# jps
    14965 QuorumPeerMain
    15480 NodeManager
    16090 Jps
    15374 DataNode
    15935 HRegionServer
    

9、部署spark完全分布式

  1. 将/h3cu下的spark解压到/usr/local/src

    [root@master ~]# tar -xvzf /h3cu/spark-2.0.0-bin-hadoop2.7.tgz -C /usr/local/src/
    
  2. 将解压后的文件重名为spark

    [root@master ~]# mv /usr/local/src/spark-2.0.0-bin-hadoop2.7 /usr/local/src/spark 
    
  3. 配置spark-env.sh

    [root@master ~]# cp  /usr/local/src/spark/conf/spark-env.sh.template  /usr/local/src/spark/conf/spark-env.sh
    [root@master ~]# vi /usr/local/src/spark/conf/spark-env.sh
    # java位置
    export JAVA_HOME=/usr/local/src/java
    # master节点IP或域名
    export SPARK_MASTER_IP=master
    # worker内存大小
    export SPARK_WORKER_MEMORY=1G
    # Worker的cpu核数
    SPARK_WORKER_CORES=1
    # hadoop配置文件路径
    export HADOOP_CONF_DIR=/usr/local/src/hadoop/etc/hadoop
    
  4. 配置slaves

    [root@master ~]# cp /usr/local/src/spark/conf/slaves.template /usr/local/src/spark/conf/slaves
    [root@master ~]# vi /usr/local/src/spark/conf/slaves
    master
    slave1
    slave2
    
  5. 分发文件

    [root@master ~]# scp -r /usr/local/src/spark slave1:/usr/local/src/  
    [root@master ~]# scp -r /usr/local/src/spark slave2:/usr/local/src/
    
  6. 启动spark集群

    [root@master ~]# /usr/local/src/spark/sbin/start-all.sh 
    starting org.apache.spark.deploy.master.Master, logging to /usr/local/src/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-localhost.localdomain.out
    slave2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/src/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
    slave1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/src/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
    master: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/src/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-master.out
    [root@master ~]# jps
    17120 QuorumPeerMain
    18273 SecondaryNameNode
    18114 DataNode
    19602 HRegionServer
    17987 NameNode
    20949 Worker
    18423 ResourceManager
    20999 Jps
    18537 NodeManager
    19465 HMaster
    20860 Master
    [root@slave1 ~]# jps
    15587 NodeManager
    16099 HRegionServer
    17091 Worker
    17141 Jps
    16184 HMaster
    15481 DataNode
    15050 QuorumPeerMain
    
    
  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Sqoop是一个用于在Hadoop和关系型数据库之间进行数据传输的工具。对于Hadoop 3.3.3,你可以使用Sqoop 1.4.7版本。你可以从Apache Sqoop的官方网站下载安装包,或者从Apache镜像站点下载。以下是一些安装和配置Sqoop的步骤: 1. 下载Sqoop 1.4.7的二进制文件,并解压缩。 2. 将解压后的文件夹移动到你想要安装的目录中。 3. 设置环境变量,将Sqoop的bin目录添加到PATH中。 4. 在$SQOOP_HOME/conf目录中,创建一个新的文件名为sqoop-env.sh的文件,并将以下内容添加到文件中: ``` export HADOOP_COMMON_HOME=/path/to/hadoop export HADOOP_MAPRED_HOME=/path/to/hadoop export HIVE_HOME=/path/to/hive export HBASE_HOME=/path/to/hbase export ZOOKEEPER_HOME=/path/to/zookeeper export ACCUMULO_HOME=/path/to/accumulo ``` 5. 修改$SQOOP_HOME/conf/sqoop-site.xml文件,添加以下内容: ``` <configuration> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/path/to/hadoop</value> </property> <property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value> </property> </configuration> ``` 6. 启动Sqoop,使用以下命令: ``` sqoop help ``` 这将显示Sqoop的帮助信息,证明Sqoop已经成功安装并配置完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值