一. Hive基本概念

1.1 Hive是什么

Hive是基于Hadoop的一个数据仓库工具 ,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

Hive本质 : Hive其实就是将用户写的HQL,给翻译成对应的mr模板,然后执行这些mr程序,hive底层执行引擎其实就是MapReduce,mr运行在yarn上

1.2 Hive的优缺点

  • 优点

    操作简单,采用类sql的语法分析数据,门槛低,大大的降低了大数据分析的难度,通用性高

  • 缺点

    不够灵活,机翻粒度比较粗,调优困难。

    因为底层执行引擎还是mr,所以延迟较高,不能像关系型数据库那样,立马返回结果;

    底层存储是hdfs,不支持随机写,只能追加,所以hive不支持行级别的更新和删除(delete 和 update)

1.3 Hive的架构

用户接口:Client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

1.4 Hive和数据库的区别

  1. 查询语言:由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

  2. 数据存储:Hive是建立在Hadoop之上的,所有的Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或本地文件系统中。

  3. 数据更新:Hive的内容是读多写少的,因此,不支持对数据的改写和删除,数据都在加载的时候中确定好的。数据库中的数据通常是需要经常进行修改

  4. 执行延迟:Hive在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,只有在处理大数据是才有优势。数据库在处理小数据是执行延迟较低

  5. 数据规模:Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小

二. Hive安装

2.1 安装地址

1)Hive官网地址:http://hive.apache.org/

2)文档查看地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted

3)下载地址:http://archive.apache.org/dist/hive/

4)github地址:https://github.com/apache/hive

2.2 Mysql的安装

  1. 检查当前系统是否安装过Mysql

    [atguigu@hadoop102 ~]$ rpm -qa|grep mariadb
    mariadb-libs-5.5.56-2.el7.x86_64 //如果存在通过如下命令卸载
    [atguigu @hadoop102 ~]$ sudo rpm -e --nodeps mariadb-libs //用此命令卸载mariadb
  2. 将MySQL安装包拷贝到/opt/software/mysql-lib目录下

    [atguigu @hadoop102 software]# ll
    总用量 528384
    -rw-r--r--. 1 root root 609556480 3月 21 15:41 mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
  3. 解压MySQL安装包

    //解压*.tar包,参数只需要-xf;			解压*.tar.gz,参数:-zxvf
    [atguigu @hadoop102 mysql-lib]# tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C

  4. 在安装目录下执行rpm安装, 要以下按照顺序依次执行

    [atguigu @hadoop102 mysql-lib]$ sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
    [atguigu @hadoop102 mysql-lib]$ sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
    [atguigu @hadoop102 mysql-lib]$ sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
    [atguigu @hadoop102 mysql-lib]$ sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
    [atguigu @hadoop102 mysql-lib]$ sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

    如果Linux是最小化安装的,在安装mysql-community-server-5.7.28-1.el7.x86_64.rpm时可能会出现如下错误:

    [atguigu@hadoop102 software]$ sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
    警告:mysql-community-server-5.7.28-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
    错误:依赖检测失败:
    libaio.so.1()(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要
    libaio.so.1(LIBAIO_0.1)(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要
    libaio.so.1(LIBAIO_0.4)(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要

    通过yum安装缺少的依赖,然后重新安装mysql-community-server-5.7.28-1.el7.x86_64 即可

    [atguigu@hadoop102 mysql-lib] yum install -y libaio
  5. 删除/etc/my.cnf文件中datadir指向的目录下的所有内容,如果有内容的情况下需要删除

    查看datadir的值

    datadir=/var/lib/mysql

    [atguigu@hadoop102 mysql-lib]$ vim /etc/my.cnf
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    [mysqld]
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    datadir=/var/lib/mysql

    删除/var/lib/mysql目录下的所有内容:

    [atguigu @hadoop102 mysql]# cd /var/lib/mysql
    [atguigu @hadoop102 mysql]# sudo rm -rf ./* //注意执行命令的位置
  6. 初始化数据库

    [atguigu @hadoop102 opt]$ sudo mysqld --initialize --user=mysql
  7. 查看临时生成的root用户的密码

    [atguigu @hadoop102 opt]$ sudo cat /var/log/mysqld.log

  8. 启动mysql服务

    [atguigu @hadoop102 opt]$ sudo systemctl start mysqld
  9. 登录mysql数据库

    [atguigu @hadoop102 opt]$ mysql -uroot -p
    Enter password: 输入临时生成的密码
  10. 必须先修改root用户的密码,否则执行其他的操作会报错, 记住自己设置的密码

    mysql> set password = password("123456");

  11. 修改mysql库下的user表中的root用户允许任意ip连接,可以客户端远程登录

    mysql> update mysql.user set host='%' where user='root';

    mysql> flush privileges;

  12. 通过SQLyog远程登录验证

2.3 Hive的安装

  1. 把apache-hive-3.1.2-bin.tar.gz上传到linux的/opt/software目录下

  2. 解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面

    [atguigu@hadoop102 software]$ tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/
  3. 修改apache-hive-3.1.2-bin.tar.gz的名称为hive

    [atguigu@hadoop102 software]$ mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive
  4. 修改/etc/profile.d/my_env.sh,添加hive的环境变量

    添加一下内容

    #HIVE_HOME
    export HIVE_HOME=/opt/module/hive
    export PATH=$PATH:$HIVE_HOME/bin

    source一下

    source /etc/profile
  5. 解决日志Jar包冲突

    [atguigu@hadoop102 software]$ mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak

2.4 Hive的元数据配置到Mysql

  1. 拷贝驱动

    将MySQL的JDBC驱动拷贝到Hive的lib目录下

    [atguigu@hadoop102 software]$ cp /opt/software/mysql-connector-java-5.1.48.jar $HIVE_HOME/lib
  2. 配置Metastore到MySql

    在$HIVE_HOME/conf目录下新建hive-site.xml文件

    [atguigu@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml

    添加如下内容

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
    <!-- jdbc连接的URL,metastore:存储元数据的mysql的库 -->
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
    </property> <!-- jdbc连接的Driver-->
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property> <!-- jdbc连接的登录Mysql的username-->
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property> <!-- jdbc连接的登录Mysql的password -->
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    </property>
    <!-- Hive默认在HDFS的工作目录,存储数据的工作目录 -->
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    </property> <!-- Hive元数据存储版本的验证 -->
    <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    </property>
    <!-- 指定存储元数据要连接的地址 -->
    <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hadoop102:9083</value>
    </property>
    <!-- 指定hiveserver2连接的端口号 -->
    <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
    </property>
    <!-- 指定hiveserver2连接的host -->
    <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop102</value>
    </property>
    <!-- 元数据存储授权 -->
    <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
    </property> </configuration>

    注意:主机ip,mysql登录的用户密码不要配错了

2.5 Hive的启动

  1. 初始化元数据库

    登录Mysql

    [atguigu@hadoop102 software]$ mysql -uroot -p123456

    创建Hive的元数据库,然后退出

    mysql> create database metastore;
    mysql> quit;

    初始化Hive元数据库

    [atguigu@hadoop102 software]$ schematool -initSchema -dbType mysql -verbose
  2. 启动metastore和hiveserver2

    Hive 2.x以上版本,要先启动这两个服务,否则会报错

    FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

    (1)启动metastore

    [atguigu@hadoop202 hive]$ hive --service metastore
    2020-04-24 16:58:08: Starting Hive Metastore Server

    注意: 启动后窗口不能再操作,需打开一个新的shell窗口做别的操作

    (2)启动 hiveserver2

    [atguigu@hadoop202 hive]$ hive --service hiveserver2
    which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/opt/module/hive/bin:/home/atguigu/.local/bin:/home/atguigu/bin)
    2020-04-24 17:00:19: Starting HiveServer2

    注意: 启动后窗口不能再操作,需打开一个新的shell窗口做别的操作

  3. 编写hive服务启动脚本

    由于前台启动的方式导致需要打开多个shell窗口,过于复杂,可以使用通过nohup后台启动

    nohup: 放在命令开头,表示不挂起,也就是关闭终端进程也继续保持运行状态
    2>&1 : 表示将错误重定向到标准输出上
    &: 放在命令结尾,表示后台运行
    一般会组合使用: nohup [xxx命令操作]> file 2>&1 & , 表示将xxx命令运行的
    结果输出到file中,并保持命令启动的进程在后台运行。
    [atguigu@hadoop202 hive]$ nohup hive --service metastore 2>&1 &
    [atguigu@hadoop202 hive]$ nohup hive --service hiveserver2 2>&1 &

    编写脚本

    创建脚本myhive.sh

    [atguigu@hadoop102 hive]$ vim $HIVE_HOME/bin/myhive.sh
    #!/bin/bash
    HIVE_LOG_DIR=$HIVE_HOME/logs
    if [ ! -d $HIVE_LOG_DIR ]
    then
    mkdir -p $HIVE_LOG_DIR
    fi
    #检查进程是否运行正常,参数1为进程名,参数2为进程端口
    function check_process()
    {
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    echo $pid
    [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
    } function hive_start()
    {
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
    } function hive_stop()
    {
    metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
    } case $1 in
    "start")
    hive_start
    ;;
    "stop")
    hive_stop
    ;;
    "restart")
    hive_stop
    sleep 2
    hive_start
    ;;
    "status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
    *)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status'
    ;;
    esac

    添加执行权限

    [atguigu@hadoop102 hive]$ chmod +x $HIVE_HOME/bin/myhive.sh

    启动Hive后台服务(需先启动hadoop)

    [atguigu@hadoop102 hive]$ myhive.sh start

    等一会查看hive启动状态:myhive.sh status

2.6 Hive访问

1)通过hive自带的beeline客户端访问

beeline -u jdbc:hive2://hadoop102:10000 -n atguigu

  1. hive脚本访问
hive

2.7 Hive常用交互命令

不进入hive的交互窗口执行Hive命令

交互命令使用场景

在shell脚本里面不能人为的进入hive客户端交互写sql,所以要通过hive -e或者-f两个交互参数进行写入

1)hive -e

hive -e "select * from student"

2)hive -f

hive -f stu.sql

3)在Hive交互窗口中如何查看hdfs文件系统

hive(default)>dfs -ls /;
hive命令查询数据不显示表头解决办法

修改hive安装包conf/hive-site.xml配置文件

<property>
<name>hive.cli.print.header</name>
<value>true</value>
<description>Whether to print the names of the columns in query output.</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
<description>Whether to include the current database in the Hive prompt.</description>
</property>

2.8 Hive常见属性配置

  1. Hive运行日志信息配置

Hive的log默认存放在/tmp/atguigu/hive.log目录下(当前用户名下)

修改hive的log存放日志到/opt/module/hive/logs

(1)修改$HIVE_HOME/conf/hive-log4j.properties.template文件名称为hive-log4j.properties

[atguigu@hadoop102 conf]$ pwd
/opt/module/hive/conf
[atguigu@hadoop102 conf]$ mv hive-log4j.properties.template hive-log4j.properties

(2)在hive-log4j.properties文件中修改log存放位置

hive.log.dir=/opt/module/hive/logs
  1. Hive启动jvm堆内存设置

    新版本的hive启动的时候,默认申请的jvm堆内存大小为256M,jvm堆内存申请的太小,导致后期开启本地模式,执行复杂的sql时经常会报错:java.lang.OutOfMemoryError: Java heap space,因此最好提前调整一下HADOOP_HEAPSIZE这个参数。

    (1)修改$HIVE_HOME/conf下的hive-env.sh.template为hive-env.sh

    [atguigu@hadoop102 conf]$ pwd
    /opt/module/hive/conf
    [atguigu@hadoop102 conf]$ cp hive-env.sh.template hive-env.sh

    (2)将hive-env.sh其中的参数 export HADOOP_HEAPSIZE=1024的注释放开,重启hive。

2.9 Hive的参数配置方式

1.通过配置文件设置 (永久生效)

在hive的家目录下面的conf文件夹下的hive-site.xml hive-env.sh hive-log4j2.properties

2.通过命令行参数来设置 (临时生效,只针对当前客户端连接)

hive -hiveconf 参数名=参数值
beeline -u jdbc:hive2://hadoop102:10000 -n atguigu -hiveconf 参数名=参数值

3.通过set命令设置(临时生效,只针对当前客户端连接)

我们连接到hive的客户端以后,可以通过set语句来设置参数

查看所有参数设置

set;

查看单个参数的值

set 参数名;

设置单个参数的值

set 参数名=参数值;

参数设置优先级:hive-default.xml < hive-site.xml < -hiveconf 参数名=参数值 < set 参数名=参数值

Hive(一)【基本概念、安装】的更多相关文章

  1. Hive的基本概念和常用命令

    原文链接: https://www.toutiao.com/i6766571623727235595/?group_id=6766571623727235595 一.概念: 1.结构化和非结构化数据 ...

  2. Hive的三种安装方式(内嵌模式,本地模式远程模式)

    一.安装模式介绍:     Hive官网上介绍了Hive的3种安装方式,分别对应不同的应用场景.     1.内嵌模式(元数据保村在内嵌的derby种,允许一个会话链接,尝试多个会话链接时会报错)   ...

  3. Hive学习之一 《Hive的介绍和安装》

    一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...

  4. Hive/Hbase/Sqoop的安装教程

    Hive/Hbase/Sqoop的安装教程 HIVE INSTALL 1.下载安装包:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.3 ...

  5. Hive 2.1.1安装配置

    ##前期工作 安装JDK 安装Hadoop 安装MySQL ##安装Hive ###下载Hive安装包 可以从 Apache 其中一个镜像站点中下载最新稳定版的 Hive, apache-hive-2 ...

  6. Hive的介绍及安装

    简介 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件 映射为一张数据库表,并提供类 SQL 查询功能. 本质是将 SQL 转换为 MapReduce 程序. Hive组件 ...

  7. HIVE 2.1.0 安装教程。(数据源mysql)

    前期工作 安装JDK 安装Hadoop 安装MySQL 安装Hive 下载Hive安装包 可以从 Apache 其中一个镜像站点中下载最新稳定版的 Hive, apache-hive-2.1.0-bi ...

  8. Mac OSX系统中Hadoop / Hive 与 spark 的安装与配置 环境搭建 记录

    Mac OSX系统中Hadoop / Hive 与 spark 的安装与配置 环境搭建 记录     Hadoop 2.6 的安装与配置(伪分布式) 下载并解压缩 配置 .bash_profile : ...

  9. 【Hadoop离线基础总结】数据仓库和hive的基本概念

    数据仓库和Hive的基本概念 数据仓库 概述 数据仓库英文全称为 Data Warehouse,一般简称为DW.主要目的是构建面向分析的集成化数据环境,主要职责是对仓库中的数据进行分析,支持我们做决策 ...

  10. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

随机推荐

  1. shell IO重定向

    I/O重定向 默认情况下,有3个"文件"处于打开状态,stdin,stdout,stderr:重定向的解释:捕捉一个文件,命令,程序,脚本或者脚本中的代码块的输出,然后将这些输出作 ...

  2. 转载: VIVADO的增量综合流程

    http://xilinx.eetrend.com/content/2019/100044286.html 从 Vivado 2019.1 版本开始,Vivado 综合引擎就已经可以支持增量流程了.这 ...

  3. 二叉树中和为某一值的路径 牛客网 程序员面试金典 C++ Python

    二叉树中和为某一值的路径 牛客网 程序员面试金典 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一 ...

  4. 三、其他主机安装zabbix-agent加入到zabbix

    一.yum (rpm)方式 1,下载安装对应的zabbix-agent的rpm包 rpm -Uvh  https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/ ...

  5. Get value from agent failed: cannot connect to [[192.168.8.102]:10050]: [113] No route to host

    192.168.8.102主机down掉,开机就可以

  6. SpringBoot整合reids之JSON序列化文件夹操作

    前言 最近在开发项目,用到了redis作为缓存,来提高系统访问速度和缓解系统压力,提高用户响应和访问速度,这里遇到几个问题做一下总结和整理 快速配置 SpringBoot整合redis有专门的场景启动 ...

  7. Linux&C网络编程————“聊天室”

    从上周到现在一直在完成最后的项目,自己的聊天室,所以博客就没怎么跟了,今天晚上自己的聊天室基本实现,让学长检查了,也有好些bug,自己还算满意,主要实现的功能有: 登录注册 附近的人(服务器端全部在线 ...

  8. 【不费脑筋系列】发布个人的代码包到Nuget服务器上,并通过VS引用进行使用的方法

      打打酱油,写点不需要费脑筋的博客先压压惊. 下面讲个关于个人如何开发nuget包,并部署到nuget服务器上的例子.为了保证.net framework和 .net core都可以访问到我的包,我 ...

  9. blazor wasm开发chrome插件

    用blazor(Wasm)开发了一个chrome插件感觉效率挺高的,分享给大家 先简单介绍下WebAssembly的原理: "WebAssembly是一种用于基于堆栈的虚拟机的二进制指令格式 ...

  10. Django 小实例S1 简易学生选课管理系统 总目录

    python Django实现的一个简易的教务选课系统. 介绍与演示的视频版本已发到我的b站: https://www.bilibili.com/video/BV1er4y1w7ty. 项目已上传到我 ...