大数据基础环境搭建

Linux常用操作

cd 目录路径                                                         进入目录

cp 文件路径/文件名 目的路径/新文件名              复制

mv 文件路径/文件名 目的路径/新文件名             剪切

ls                                                                          显示当前文件/文件夹列表

history                                                                   显示历史输入命令

上下                                                                      重新输入历史命令

pwd                                                                       显示当前文件位置

echo                                                                      打印输出

vi/vim                                                                    文本编辑器

mkdir                                                                    创建目录

find                                                                       搜索目录

tar                                                                         解压

whereis                                                                  查找文件

grep                                                                      文本搜索

vi/vim常用命令

esc                                                          退出编辑模式,进入命令模式

hjkl                                                          方向键h左j下k上l右

i                                                              进入编辑模式

a                                                             下一个字符输入

A                                                             本行末输入

G                                                             移动到文本末

gg                                                           移动到文本头

nG                                                    移动到第n行

x                                                              del

dd                                                           剪切一行,前面可以加数字,向下数

yy                                                            复制一行,前面可加数字,向下数

p                                                             粘贴

/                                                              搜索,n下一个N上一个

:                                                              命令模式,可输入shell命令

o                                                             下一行插入

O                                                            上一行插入

ZZ                                                           保存退出

ZQ                                                          不保存退出

基础环境配置

虚拟机安装

新建虚拟机

自定义

稍后安装操作系统

Linux,centos7 64位

名称,位置,名称可设为master,slave1,slave2

不要太高,相乘不要高于2,觉得电脑配置高的随意

不要太高,同上,推荐即可

暂时使用net模式

前面没写的按推荐来,此处选择创建新虚拟磁盘

将虚拟磁盘拆分成多个文件,以减小空间占用

后续默认完成即可

选择CD/DVD

使用ISO镜像,选浏览,找到镜像文件保存,开启虚拟机

上下加回车选择第一个或第二个,区别在于第二个会检查一下,我的镜像没问题可以直接选择第一个

按回车或等

选择中文,简体中文,继续

软件选择最小安装,安装位置点一下然后进去完成开始安装

设置root密码

尽量简单,别忘,我选择设置123123完成

等待配置完成

重启

进入系统

用户名填写root

密码填写自己设置的

网络配置

网卡配置

检查是否开启网卡:ip addr或ifconfig

说明:若ifconfig无法使用,则使用yum命令安装net-tools网络工具包,

yum install -y net-tools

开启网卡:进入目录/etc/sysconfig/network-scripts

       编辑ifcfg-ens33网卡配置

       设置成为开机自启动ONBOOT=yes

       改为静态IP(可选):

       BOOTPROTO="static" # 使用静态IP地址,默认为dhcp 动态IP地址

IPADDR=                     # 设置的静态IP地址

NETMASK=                  # 子网掩码

GATEWAY=                 # 网关地址

VMware查看网关地址

service network restart重启网卡

查看网卡状态

说明:centos7安装完成后 网卡默认为关闭状态,需手动开启,并设置为开机自启动模式,为防止使用DHCP自动获取IP地址功能改变已定IP,造成未来不必要的更改hosts或连接器,将其修改为静态IP,IP设置规则,网关也就是暂且认为是前三个数需要一样,最后一个数尽量使用4-253,防止IP冲突,误用了网关IP或广播地址

修改主机名:

       hostnamectl set-hostname master(在master中执行)

       bash(暂且当作是立即执行)

       hostnamectl set-hostname slave1(在slave1中执行)

       .。。。。。。。

       说明:修改主机名目的是让自己能够更方便的看出此时的bash为哪个主机,将来ssh免密设置完成后可以使用免密登录用一台机子控制三台机子

配置hosts文件

       将三台虚拟机的IP地址记录

       vi /etc/hosts(三台都要修改这个文件)

       在文本末尾输入各节点相应IP

       例: master

       slave1

slave2

       三个节点中的hosts文件为

      

       尝试是否能够相互ping通

      

       说明:将hosts配置好之后,未来输入三台机器的host的时候不需要填写IP地址,仅需要填写master,slave1,slave2之类

配置yum源

检测yum源是否可用:yum install -y wget

检测是否安装wget:wget

进入yum源配置文件:cd /etc/yum.repos.d

将原镜像备份:mv CentOS-Base.rpeo CentOS-Base.repo.bak

下载yum源:wget yum源地址

清除yum缓存:yum clean all

生成缓存:yum makecache

       说明:若是可以使用本地已配置和的yum源,则无需修改,若是无网络状态,可以配置本地yum源,方法在网上也可以搜到

使用连接工具连接虚拟机

工具:xshell或MX等

关闭防火墙

关闭防火墙命令 systemctl stop firewalld

检查防火墙状态 systemctl status firewalld

防火墙开启状态

防火墙关闭状态

时间同步

使用date命令查看时间是否一致

不一致,需要使用ntp时间同步

选择时区

tzselect

2.配置ntp服务器

使用yum下载ntp服务

yum install -y ntp

以master作为ntp服务器,修改配置文件(只在master中执行)

在末尾添加

server  127.127.1.0

fudge   127.127.1.0     stratum

重启ntp服务:systemctl restart ntpd.service

其他机器进行同步

ntpdate master

说明:zookeeper是使用时间作为标准的心跳机制,若是不同步,有可能zookeeper会认为此计算机已宕机

配置ssh免密

在master上生成公私密钥

ssh-keygen 生成密钥工具 -t dsa生成指定密钥类型为dsa,默认为rsa -f存放位置 -P指定私钥密码‘’中为密码,默认为空,写的也是空

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa注意不要输错注意是dsa  P是大写 后面空格加两个单引号

将公钥追写入authorized_keys文件中,使用公钥

cat id_dsa.pub >> authorized_keys

ssh master(内回环)

将公钥分发到slave1和slave2

slave1和slave2进入.ssh目录,将master的公钥拷贝过来,追写入authorized_keys

(slave1,slave2)cd .ssh/

              scp master:~/.ssh/id_dsa.pub ./master_dsa.pub

              cat master_dsa.pub >> authorized_keys

在master中测试ssh免密登录

       ssh slave1

              输入yes(仅第一次)

              退出slave1 :exit

说明:zookeeper,Hadoop,hbase等都需要同时访问和修改不同节点数据,所以免密和防火墙是必要的,ssh免密登录是一种非对称性加密技术,需要公钥和私钥,将公钥分发给需要访问的节点,他们就有钥匙可以进入

安装jdk

使用xftp将文件拷贝到master中

将软件安装在/usr/目录下

       cd /usr

       新建文件夹命名为java:

       mkdir java

       进入java文件夹

       cd java

       tar -zxvf java压缩包文件路径

       修改环境变量

       vim /etc/profile

       export JAVA_HOME=java文件夹位置

       export PATH=$PATH:$JAVA_HOME/bin

       export CLASSPATH=$JAVA_HOME/lib/

将环境变量生效:

       source /etc/profile

检查java是否配置成功:java -version

将java和profile文件发送到slave1和slave2中

scp -r /usr/java root@slave1:/usr/

-r可以理解为复制文件夹

将profile复制过去之后都需要source一下才可以生效

说明:Hadoop是基于Java写的,所以他需要jdk的环境来运行

zookeeper安装与配置

在/usr目录下创建zookeeper文件夹

cd /usr

mkdir zookeeper

解压zookeeper压缩文件

       tar -zxvf /……/zookeeper…….gz

在zookeeper的文件夹中船舰zkdata文件夹和zkdatalog文件夹

       cd zookp……

       mkdir zkdata

mkdir zkdatalog

进入conf文件夹中修改配置文件

cd conf/

       将示例配置文件复制并重命名为要使用配置文件,zookeeper在启动时会找到这个文件作为默认配置文件

             cp zoo_sample.cfg zoo.cfg

              vim zoo.cfg

                     修改dataDir

                     添加dataLogDir

                     添加server.1=master:2888:3888

                            server.2=slave1:2888:3888

                            server.3=slave2:2888:3888

                            (这里可以使用yy p复制粘贴)

       在zkdata中创建myid文件,内容为本机id表示自己是几号服务器

例:master内容为1,slave1内容为2

              vi ../zkdata/myid

                     1

修改环境变量

vim /etc/profile

export ZOOKEEPER_HOME=地址

export PATH=$PATH:ZOOKEEPER_HOME/bin

source /etc/profile

拷贝到另外两台虚拟机

cd /usr/

              scp ./java slave1:/usr/

              scp ./java slave2:/usr/

              scp ./zookeeper slave1:/usr/

              scp ./zookeeper slave2:/usr/

              scp /etc/profile slave1:/etc/

              scp /etc/profile slave2:/etc/

进入slave1slave2 source一下profile

开启zookeeper

zkServer.sh start

zkServer.sh status(三台机器)

检查:一台leader,其余为flower

错误可能:

1:防火墙,

2,zoo.cfg配置出错

3,myid未配置成功

安装配置Hadoop

检查hosts文件

       检查三台虚拟机hosts文件是否已经配置正确

安装Hadoop

       在/usr目录下创建hadoop文件夹

cd /usr

mkdir hadoop

配置Hadoop文件

       hadoop-env.sh     common组件

       core-site.xml         hdfs组件

       mapred-site.xml    mapreduce组件

       yarn-site.xml         yarn组件

cd /usr/hadoop/hadoop-2.7.3/etc/hadoop

在hadoop-env.sh 文件中配置javahome

       hadoop-env.sh

              配置JAVA_HOME

说明:Hadoop是使用Java编写的软件,需要将Java的环境告诉Hadoop

编写core-site.xml配置文件

       core-site.xml

<configuration>

<property>

  <name>fs.defaultFS</name>

   <value>hdfs://master:9000</value>

</property>

<property>

  <name>hadoop.tmp.dir</name>

   <value>/usr/hadoop/hadoop-2.7.3/hdfs/tmp</value>

<description>A base for other temporary directories.</description>

</property>

<property>

  <name>io.file.buffer.size</name>

   <value>131072</value>

</property>

<property>

  <name>fs.checkpoint.period</name>

   <value>60</value>

</property>

<property>

  <name>fs.checkpoint.size</name>

   <value>67108864</value>

</property>

</configuration>

(标签成对出现 4yy p命令)

yarn-site.xml

<property>

 <name>yarn.resourcemanager.address</name>

   <value>master:18040</value>

 </property>

 <property>

   <name>yarn.resourcemanager.scheduler.address</name>

   <value>master:18030</value>

 </property>

 <property>

   <name>yarn.resourcemanager.webapp.address</name>

   <value>master:18088</value>

 </property>

 <property>

   <name>yarn.resourcemanager.resource-tracker.address</name>

   <value>master:18025</value>

 </property>

 <property>

  <name>yarn.resourcemanager.admin.address</name>

  <value>master:18141</value>

 </property>

 <property>

  <name>yarn.nodemanager.aux-services</name>

  <value>mapreduce_shuffle</value>

 </property>

 <property>

  <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>

  <value>org.apache.hadoop.mapred.ShuffleHandler</value>

 </property>

使用vim命令编写slaves文件

    slave1

    slave2

使用vim命令编写master文件

    master

       hdfs-site.xml

              <property>

      <name>dfs.replication</name>

     <value>2</value>

</property>

<property>

   <name>dfs.namenode.name.dir</name>

   <value>file:/usr/hadoop/hadoop-2.7.3/hdfs/name</value>

   <final>true</final>

</property>

<property>

   <name>dfs.datanode.data.dir</name>

   <value>file:/usr/hadoop/hadoop-2.7.3/hdfs/data</value>

   <final>true</final>

</property>

<property>

  <name>dfs.namenode.secondary.http-address</name>

   <value>master:9001</value>

</property>

<property>

   <name>dfs.webhdfs.enabled</name>

   <value>true</value>

</property>

<property>

   <name>dfs.permissions</name>

   <value>false</value>

 </property>

       cp mapred-site.xml.template mapred-site.xml

       vi mapred-site.xml

<property>

 <name>mapreduce.framework.name</name>

<value>yarn</value>

             </property>

4.配置环境变量

       HOME

       CLASSPATH

       PATH

       source

4.分发Hadoop profile

scp -r /usr/hadoop root@slave1:/usr/

scp -r /usr/hadoop root@slave2:/usr/

scp -r /etc/prefile root@slave1:/etc/

scp -r /etc/prefile root@slave2:/etc/

5.source /etc/prefile(三台)

6.格式化Hadoop

       hadoop namenode -format仅在master中执行

出现status 0 则为成功

7. /usr/hadoop/hadoop-2.7.3/sbin/start-all.sh

8.jps

安装hbase

同样进行目录的创建,压缩包的解压

mkdir -p /usr/hbase

cd /usr/hbase

tar -zxvf

进入conf目录

修改hbase-evn.sh

第二十七行修改javahome,并将注释取消

第三十行修改hbase_classpath,将Hadoop中etc/hadoop目录写进去

128行将注释取消,true改为false

注解:这里将true改为false是因为一个hbase需要一个zookeeper集群,默认情况下hbase会使用自带的zookeeper集群,而我们需要让他使用我们给的zookeeper集群优化配置提高效率,这里默认的true的作用是让hbase启动同时也启动zookeeper,而我们采用独立运行zookeeper的方式所以将其改为false。

编写hbase-site.xml

<property>

                <name>hbase.rootdir</name>

                <value>hdfs://master:9000/hbase</value>

        </property>

        <property>

                <name>hbase.cluster.distributed</name>

                <value>true</value>

        </property>

        <property>

                <name>hbase.master</name>

                <value>hdfs://master:6000</value>

        </property>

        <property>

                <name>hbase.zookeeper.quorum</name>

                <value>master,slave1,slave2</value>

        </property>

        <property>

                <name>hbase.zookeeper.property.dataDir</name>

                <value>/usr/zookeeper/zookeeper-3.4.10/</value>

        </property>

编写regionservers

       将localhost修改为slave1和slave2

修改环境变量

分发到slave1slave2

start-hbase.sh在master中执行

安装hive

slave2上安装MySQL作为数据端

slave1作为服务器端

master作为客户端

  1. 安装mysql

wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

yum localinstall -y mysql57-community-release-el7-7.noarch.rpm

yum install -y mysql-community-server

       重载所有修改过的配置文件:systemctl daemon-reload

       开启服务systemctl start mysqld

       设置开机自启systemctl enable mysqld

       安装完成后MySQL会在/var/log/mysqld.log中自动生成一个随机密码

记住这个密码用来登录MySQL数据库

       grep “temporary password” /var/log/mysqld.log查看带有密码的一行

使用mysql -uroot -p 登录MySQL

设置密码安全策略

设置密码强度为低级set global validate_password_policy=0;

设置密码最低长度:set global validate_password_length=4;

修改本地密码alter user 'root'@'localhost' identified by '123123'

退出 \q

密码强度分级 0为low,只限制长度,最低为4,设置123则变为4

                     1为默认,长度为8,且必须含有数字大小写,特殊字符

                     2为strong,需包括字典文件

              远程登录设置

创建用户create user 'root'@'%' identified by '123123';

允许远程连接grant all privileges on *.* to 'root'@'%' with grant option;

刷新权限flush privileges;

slave1作为服务器端,安装hive

master中解压hive并传输给slave1

更改环境变量(master和slave1都执行)

解决版本冲突和jar包依赖问题

复制hive中的jline.jar包到Hadoop中lib位置(master中执行)cp /usr/hive/apache-hive-2.1.1-bin/lib/jline-2.12.jar /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/

将MySQL的依赖包放在slave1中hive的lib目录下

scp /tools/mysql-connector-java-5.1.47-bin.jar root@slave1:/usr/hive/apache-hive-2.1.1-bin/lib/

回到slave1中,进入hive的conf目录

cd $HIVE_HOME/conf

修改并重命名hive-env.sh

更改Hadoophome

创建并修改hive-site.xml可以从hive-default.xml中找

<configuration>

<property>

    <name>hive.metastore.warehouse.dir</name>

    <value>/user/hive/warehouse</value>

  </property>

 <property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://slave2: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>123123</value>

  </property>

  <property>

    <name>hive.metastore.schema.verification</name>

    <value>false</value>

  </property>

  <property>

    <name>datanucleus.schema.autoCreateAll</name>

    <value>true</value>

  </property>

</configuration>

将master作为客户机

修改并重命名hive-env.sh

更改48行Hadoophome

创建并修改hive-site.xml

<configuration>

        <property>

                <name>hive.metastore.warehouse.dir</name>

                <value>/usr/hive_remote/warehouse</value>

        </property>

        <property>

                <name>hive.metastore.local</name>

                <value>false</value>

        </property>

        <property>

                <name>hive.metastore.uris</name>

                <value>thrift://slave1:9083</value>

        </property>

</configuration>

启动hiveserver服务(slave1)

hive --service metastore

hive

此时master的进程如下

scala

在usr下创建scala目录

进入scala目录

将Scala解压到scala目录

配置环境变量

分发scala

spark

在usr下创建spark目录

进入spark目录

将spark解压到spark目录

配置环境变量

进入spark的conf目录

将spark-env.sh.template改名或拷贝一份将.template后缀删除

编辑spark-env.sh并在末尾添加

export JAVA_HOME=                                    #Java环境变量

export SCALA_HOME=                                 #SCALA环境变量

export SPARK_WORKING_MEMORY=1g         #每一个worker节点上可用的最大内存

export SPARK_MASTER_IP=master                #驱动器节点IP

export HADOOP_HOME=                              #Hadoop路径

export HADOOP_CONF_DIR=         #Hadoop配置也就是hadoop中的/etc/hadoop目录

export SPARK_CLASSPATH=             #配置mysql驱动目录,也就是软件包中jar包的位置

 将slaves改名或拷贝一份将.template后缀删除

编辑并在最后一行删除localhost,添加slave1和slave2

连接hive

将hive的conf目录下的hive-site.xml复制到spark的conf目录下

分发spark

进入spark的sbin目录

./start-all.sh启动spark

spark-shell进入scala命令模式

爬虫

使用requests,BeautifulSoup等库

requests.get(url)返回值为requests对象,tostring方法为状态码

requests.get(url).text为网页源代码

使用bs4将网页源代码做成一锅美味汤,也就是bs对象

bs = BeautifulSoup(html,”html.parser”)  #此处的html.parser是解析方式,执行速度适中,文档容错能力强,lxml速度块,文档容错能力强但需安装c语言库,xml唯一支持xml的解析器,需安装c语言库,html5lib生成h5格式文档,容错性最好,速度慢

#基本用法

from bs4 import BeautifulSoup

bs = BeautifulSoup(html,"html.parser") # 缩进格式

print(bs.prettify())

print(bs.prettify()) # 格式化html结构

print(bs.title) # 获取title标签的名称

print(bs.title.name) # 获取title的name

print(bs.title.string) # 获取head标签的所有内容

print(bs.head)

print(bs.div)  # 获取第一个div标签中的所有内容

print(bs.div["id"]) # 获取第一个div标签的id的值

print(bs.a)

print(bs.find_all("a")) # 获取所有的a标签

print(bs.find(id="u1")) # 获取id="u1"

for item in bs.find_all("a"):

    print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值

for item in bs.find_all("a"):

print(item.get_text())

#选择元素

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.title)

print(type(soup.title))

print(soup.head)

print(soup.p)

#获取名称

print(soup.title.name)

print(soup.p.attrs['name'])

print(soup.p['name'])

#获取内容

print(soup.p.string)

#获取子孙节点

print(soup.p.children)

for i, child in enumerate(soup.p.children):

    print(i, child)

#通过标签

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.find_all('ul'))

print(type(soup.find_all('ul')[0]))

#通过属性

print(soup.find_all(attrs={'id': 'list-1'}))

print(soup.find_all(attrs={'name': 'elements'}))

print(soup.find_all(id='list-1'))

print(soup.find_all(class_='element'))

#通过text

print(soup.find_all(text='Foo'))

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.select('.panel .panel-heading'))

print(soup.select('ul li'))

print(soup.select('#list-2 .element'))

print(type(soup.select('ul')[0]))

for ul in soup.select('ul'):

    print(ul.select('li'))

#获得属性

for ul in soup.select('ul'):

    print(ul['id'])

    print(ul.attrs['id'])

#获取内容

for li in soup.select('li'):

    print(li.get_text())

爬虫我这里用的beautifulsoup和requests库

爬取的是一个静态小说网页作为例子

原网页网址为http://book.zongheng.com/store.html

观察点击下一页时网址变为

http://book.zongheng.com/store/c0/c0/b0/u0/p2/v9/s9/t0/u0/i1/ALL.html

点击回第一页时网址变为

http://book.zongheng.com/store/c0/c0/b0/u0/p1/v9/s9/t0/u0/i1/ALL.html

改变的数只有p1目录的目录名

所以,定义url

#我这里只爬十五页内容

page=range(1,16)

url=’http://book.zongheng.com/store/c0/c0/b0/u0/’+str(list(page))’/v9/s9/t0/u0/i1/ALL.html

·检查网页源码:

先思考用什么存数据

可以使用多维数组,也可以使用数组加字典,也可以使用字典加数组

例:

多维数组:

[[id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new],[ id,name,img,author,cla,sta,date,exp,new]]

数组加字典:

[{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new },{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new },{‘id’=id,’name’=name,’img’=img,’author’=author,’cla’=cla,’sta’=sta,’date’=date,’exp’=exp,’new’=new }]

字典加数组

       {‘id’=[id1,id2,id3],’name’=[name1,name2,name3],……}

我这里使用二维数组的方式

分析:

       所有小说列表都在bookbox fl中

       小说封面为class为bookimg下

       所以我们就查看soup.find_all('div',class_='bookimg'),此时返回的是div=bookimg的一个数组,我们要找到里边的img标签,里面的src

创建数组

novel=[]

tag = soup.find_all('div',class_=’bookbox fl’)

for i in range(len(tag)):

       data = []

       #加入id

       data.append(i)

       #加入name,小说名,strip()函数为删除空格和\r,\n等

data.append(i.find(‘div’,class_=‘bookname’).text.sprip())

    #加入img,小说封面

data.append(i.find(‘img’).get(‘src’))

#加入author,小说作者

data.append(i.find('div',class_='bookilnk').find_all('a')[0].text)

#加入cla,小说类型

data.append(i.find('div',class_='bookilnk').find_all('a')[1].text)

       #加入sta,小说状态

       data.append(i.find('div',class_='bookilnk').find_all('span')[0].text.strip())

       #加入date,小说更新时间,replace为替换,这里将不需要的信息替换为空

       data.append(i.find('div',class_='bookilnk').find_all('span')[0].text.strip().replace('更新时间\xa0\xa0',''))

       #加入exp,小说简介

       #加入new,最新章节

       同理

       添加完成的一本书到小说数组中

       novel.append(data)

将数据写入csv文件中

我这里使用csv库,可以使用pandas或其他,方法类似

       import csv

       此处我图方便使用with open as方法,用写方法打开test

       with open(‘test.csv’,’w’) as f:

              writer = csv.writer(f)

              #先写表头

              writer.writerow([‘id’,’name’,’img’,’author’,’cla’,’sta’,’date’,’exp’,’new’])

              #写入多行

              writer.writerows(novel)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

数据分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值