一. 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. systemverilog 字符串类型

    转载:https://blog.csdn.net/Holden_Liu/article/details/100727957 传统的Veriog仅仅支持文字表述上的字符串, 而SystemVerilog ...

  2. clone-graph leetcode C++

    Clone an undirected graph. Each node in the graph contains alabeland a list of itsneighbors. OJ's un ...

  3. Java之父 James Gosling 发表博文 《Too Soon》纪念乔布斯。

    几个礼拜前,我们还在讨论乔布斯的辞职.虽然我们都知道这意味着什么,但是我没有想到一切来的如此之快.已经有很多关于这件事情的文章了,特别是"经济学人"的这篇文章. 乔布斯是一个很独特 ...

  4. Ubuntu 安装 mysql 报错 "update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在"

    解决方法: sudo cp /etc/mysql/my.cnf /etc/mysql/mysql.cnf 偷梁换柱-! 如果想更新mysql的源方法如下: wget http://dev.mysql. ...

  5. Linux常用命令和快捷键整理:(1)常用命令

    前言: Linux常用快捷键和基本命令整理,先上思维导图: 1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限) ...

  6. JavaScript高阶函数之filter、map、reduce

    JavaScript高阶函数 filter(过滤) 用法: 用于过滤,就是把数组中的每个元素,使用回调函数func进行校验,回调函数func返回一个布尔值,将返回值为 true 的元素放入新数组 参数 ...

  7. go微服务框架Kratos笔记(一)入门教程

    kratos简介 Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具 本文基于kratos v2.0.3,windows平台,其他系统平台均可借鉴参考 环境搭建 Golang开发 ...

  8. vue开发中的一些简单骚操作

    在开发过程中,我们可以定义很多参数,这时需要通过不同的操作来改变不同的参数,这就比较复杂了, 虽然不难,但是代码多了也不好看,这时我们就可以通过简单的操作就行简化: 1.对象使用方括号 let obj ...

  9. element ui tree回显 setCheckedNodes,setCheckedKeys,setChecked等函数报undefined问题

    在写项目的时候,需要用到tree组件进行回显来进行权限控制: 在回显过程中使用回显函数会报报undefined, 这时只需要给该函数包裹一层nextTick方法就行了, 在回显过程中我们有可能使用半选 ...

  10. 搜索系统核心技术概述【1.5w字长文】

    前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...