精华内容
下载资源
问答
  • Apache Airflow搭建及使用指南

    千次阅读 2020-03-10 00:38:03
    启动组件时启动命令要加-D,避免因为ctrl+c导致服务终止: airflow webserver -D airflow scheduler -D 或者: airflow启动命令: nohup airflow webserver -p 8090 >/dev/null 2>&1 & nohup airflow scheduler >/...

    1.安装mysql5.7

    参考另一篇文章:CentOS 7安装mysql 5.7

    2.安装python3.6.6

    先安装依赖包:

    yum -y install zlib zlib-devel
    yum -y install bzip2 bzip2-devel
    yum -y install ncurses ncurses-devel
    yum -y install readline readline-devel
    yum -y install openssl openssl-devel
    yum -y install openssl-static
    yum -y install xz lzma xz-devel
    yum -y install sqlite sqlite-devel
    yum -y install gdbm gdbm-devel
    yum -y install tk tk-devel
    yum install gcc

    如果安装过程中出现类似于这个提示:

     

    那么需要清理一下yum缓存,并重新下载。

    执行命令:

    • yum clean all
    • yum makecache 

    之后 可以升级yum(这步可选:yum -y update)

    下载python3.6.6安装包:

    官网下载基本不可能,太慢了, 自己找资源吧,可以参考这个下载:https://download.csdn.net/download/u011613545/11992811

    这里有个问题要注意了,Linux系统下自带了python2的版本,所以我们要用Python3的话需要自己构建安装。并保证某些已经存在的服务可以正常使用python2,方法参考:centos7下保留python2.x并安装python3.6的办法

     3.开始进入airflow安装环节:

     安装必要的依赖

    yum -y install epel-release

    yum install python-pip  ##如果没有安装pip的话

    #环境变量设置如下代码配置环境变量,此环境变量仅需要设置成临时变量即可并不需要配置成永久变量
    export SLUGIFY_USES_TEXT_UNIDECODE=yes
    #设置环境变量, 后面安装db和修改配置文件用,非常重要
    vim ~/.bash_profile
    #增加以下
    export AIRFLOW_HOME=/home/airflow
    
    export SITE_AIRFLOW_HOME=/usr/local/python3/lib/python3.6/site-packages/airflow
    
    export PATH=$PATH:$SITE_AIRFLOW_HOME/bin
    
    #然后使环境变量生效
    source ~/.bash_profile
    
    #用find / -name python3的安装目录,先将pip3 放入环境变量当中
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3

    升级pip3之前要先把pip3的源换一下: 点击——》pip/pip3替换国内源的方法 

    因为CentOS7自带了python2.x,但不会带pip,如果没有pip,也可以考虑安装一个。

    然后升级pip 和 setuptools:注意这里用指令pip3,而不是pip

    pip3 install --upgrade pip
    pip3 install --upgrade setuptools

    设置一下临时环境变量:

    export AIRFLOW_GPL_UNIDECODE=yes 

    export SLUGIFY_USES_TEXT_UNIDECODE=yes

    然后安装一些依赖库:

    yum install python-devel
    yum install libevent-devel
    yum install mysql-devel

    然后安装airflow脚手架

    pip3 install apache-airflow===1.10.9  //指定版本号,默认就升级到最新。经测试,1.10.0有很多依赖组件有版本冲突,不好解决,因此使用1.10.9 

    airflow会被安装到下面这个目录

    ${PYTHON_HOME}/lib/python3.6/site-packages/airflow

    接着安装mysql组件 

    pip3 install 'apache-airflow[mysql]'

    如果报下面的错误 

    ERROR: Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-dq81ujxt/mysqlclient/
    #解决方案,查看是否有mysql_config文件
    [root@test01 ~]$ find / -name mysql_config
    #如果没有
    [root@test01 ~]$ yum -y install mysql-devel
    #安装完成后再次验证是否有mysql_config
    find / -name mysql_config

     之后执行airflow,会自动在AIRFLOW_HOME下生成airflow.cfg文件

    如果顺利的话,开始修改cfg文件,具体如何修改可参考下面这个文章

    https://www.jianshu.com/p/bcf64728454d

    然后开始执行

    #初始化元数据库信息(其实也就是新建airflow依赖的表)
    pip install celery
    pip install apache-airflow['kubernetes']

    airflow initdb

    如果没有报错,说明初始化成功

    接下来就开始进行一些数据库权限配置 

    #准备操作
    #关闭linux防火墙
    systemctl stop firewalld.service
    systemctl disable firewalld.service
    #同时需要关闭windows防火墙
    #数据库设置
    mysql -uroot -proot
    mysql> set password for 'root'@'localhost' =password('');
    Query OK, 0 rows affected (0.00 sec)
    mysql> grant all on airflow.* to 'airflow'@'%';
    Query OK, 0 rows affected (0.00 sec)
    mysql> grant all on airflow.* to 'root'@'%';
    Query OK, 0 rows affected (0.01 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    mysql> exit;
    
    #启动组件:
    airflow webserver -D
    airflow scheduler -D
    airflow worker -D
    airflow flower -D

    下面开始总结一些安装过程中遇到的问题如何解决及需要注意的点:

    1.如果报缺少某些Module 可以尝试用pip命令进行安装

    2. 若出现某些组件版本号不被允许,可以尝试先卸载,再重新安装airflow需要的版本

    比如:pip3 uninstall 组件名===要卸载的版本号

               pip3 install 组件名===要升级到的版本号

    3.启动组件时启动命令要加-D,避免因为ctrl+c导致服务终止:

    airflow webserver -D

    airflow scheduler -D

    或者:

    airflow启动命令:
    nohup airflow webserver -p 8090 >/dev/null 2>&1 &
    nohup airflow scheduler >/dev/null 2>&1 &

     

    4.关于时区的修改可以参考这个文章:airflow修改成中国时区(匹配1.10版本)

    1).修改源码改为本地时间
    在airflow家目录下修改airflow.cfg,设置
    
    default_timezone = Asia/Shanghai
    2).进入airflow包的安装位置,也就是site-packages的位置,修改airflow/utils/timezone.py
    
    在 utc = pendulum.timezone(‘UTC’) 这行(第27行)代码下添加:
    
    try:
        tz = configuration.conf.get("core", "default_timezone") 
        if tz == "system":
            utc = pendulum.local_timezone()
        else:
            utc = pendulum.timezone(tz)
    except Exception:
        pass
      这里注意了:很多文档这里写的是从configuration module里获取这个值,不知道为啥那样会报错,也许是版本问题,根据报错信息,改成了从cfg文件的core部分读default_timezone值就是对的,用configuration.conf.get表示从cfg文件读
    
    3).修改utcnow()函数 (在第69行)
    
    原代码 d = dt.datetime.utcnow() 
    修改为 d = dt.datetime.now()
    4).修改airflow/utils/sqlalchemy.py
    
    在utc = pendulum.timezone(‘UTC’) 这行(第37行)代码下添加同上述第二条那段代码
    
    5).修改airflow/www/templates/admin/master.html(第31行)
    
    把代码 var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000); 
    改为 var UTCseconds = x.getTime();
    
    把代码 "timeFormat":"H:i:s %UTC%",
    改为  "timeFormat":"H:i:s",
    
    在airflow/models/dag.py中get_last_dagrun定义之前添加:
    #lhf add ----start---------
          def utc2local(self,utc):
           import time
           epoch = time.mktime(utc.timetuple())
           offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)
           return utc + offset
          #lhf add -----end---------

     

    最后重启airflow-webserver即可
    

    还可以参考这两位同学的笔记,很详细:https://zhuanlan.zhihu.com/p/47259326 https://www.jianshu.com/p/bcf64728454d

    5.关于airflow 的管理台用户管理及权限配置

    (2)关于用户权限配置

    1.用户登录认证采取用户名密码方式,因此需要装password组件

    pip3 install apache-airflow[password]

    2.修改 airflow.cfg

    [webserver]
    authenticate = True
    auth_backend = airflow.contrib.auth.backends.password_auth

    3. 在python环境中执行如下代码以添加账户: 

    import airflow
    
    from airflow import models, settings
    
    from airflow.contrib.auth.backends.password_auth import PasswordUser
    
    user = PasswordUser(models.User())
    
    user.username = '用户名' # 用户名
    
    user.email = '用户邮箱' # 用户邮箱
    
    user.password = '用户密码' # 用户密码
    
    #user.superuser = 1; 这句可能不对,待验证,超级管理员只能有一个
    
    session = settings.Session()
    
    session.add(user)
    
    session.commit()
    
    session.close()
    
    exit()

    6.如果出现

    执行:pip3 install paramiko

    展开全文
  • 从0到1,AirFlow搭建踩坑历程

    千次阅读 2018-04-27 12:17:35
    背景:ETL会经常使用脚本(bash/python)+crontab来运行数据处理任务查看任务执行情况不直观方便,只能登录机器、或者写一个界面/...Airflow Oozie + Python Code for DAGs --- Java or XML for DAGs + Has connect...

    背景:

    • ETL会经常使用脚本(bash/python)+crontab来运行数据处理任务
    • 查看任务执行情况不直观方便,只能登录机器、或者写一个界面/监控
    • 存在依赖关系的任务没办法保证,或者保证的方法成本太高
    • 任务量达到一定量级,任务的管理将极其棘手

    调研:

    Airflow

    Oozie

    + Python Code for DAGs

    --- Java or XML for DAGs

    + Has connectors for every major service/cloud providers

    - hard to build complex pipelines

    + More versatile

    - smaller, less active community

    + Advanced metrics

    - worse WEB GUI

    + Better UI and API

    - Java API

    + Capable of creating extremely complex workflows

    + JinjaTemplating

    = Can be parallelized

    = Can be parallelized

    = Native Connections to HDFS, HIVE, PIG,Presto,MySQL,Postgres,S3etc..

    = Native Connections to HDFS, HIVE, PIG etc..

    = Graph as DAG

    = Graph as DAG

    通过调研,选用AirFlow作为工作流平台

    • Airbnb开源的工作流管理平台
    • 工作流依赖关系的可视化 
    • 日志追踪
    • 用Python编写,易于扩展
    • 开箱即用的ETL调度管理平台
    • 运维/作业管理平台
    • 调度平台设计

    踩坑历程(基于AirFlow-1.9.0、Python3.6.5):

    MySQL数据库安装(将作为元数据库):

    # yum install gcc libffi-devel python-devel openssl-devel  
    # 创建相关数据库及账号  
    mysql> create database airflow default charset utf8 collate utf8_general_ci;  
    mysql> create user airflow@'localhost' identified by 'airflow';  
    mysql> grant all on airflow.* to airflow@'localhost';  
    mysql> flush privileges;

    AirFlow安装配置:

    # 配置 airflow 的 home 目录  
    > mkdir -p /usr/local/airflow/{dags,logs,plugins}  
      
    # echo "export AIRFLOW_HOME=/usr/local/airflow" >> /etc/profile  
    > source /etc/profile  
      
    # 安装 airflow  
    > pip3 install airflow  
      
    # 配置元数据库  
    > vi /usr/local/airflow/airflow.cfg  
    # dialect+driver://username:password@host:port/database  
    sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow 
    # 注意:连接mysql的密码为上一步安装mysql时设置的
    # 注意:使用的mysql socket路径为:socket=/var/lib/mysql/mysql.sock  
    # 初始化元数据库连接(默认sqlite)  
    > airflow initdb  
    # 启动web服务(不指定端口时默认端口:8080)  
    > airflow webserver -p 8080  
    # 添加防火墙规则或停止防火墙  
    > systemctl stop firewalld.service  
    # 远程打开管理窗口  
    http://localhost:8080/admin/  

    AirFlow服务管理(supervisor不支持Python3.6.5的安装,故采用Python2安装):

    # 安装进程管理工具Supervisord管理airflow进程  
    > easy_install supervisor  
    > echo_supervisord_conf > /etc/supervisord.conf  
      
    # 编辑文件supervisord.conf,添加启动命令  
    > vi /etc/supervisord.conf  
      
    [program:airflow_web]  
    command=/usr/bin/airflow webserver -p 8080  
      
    [program:airflow_scheduler]  
    command=/usr/bin/airflow scheduler  
      
      
    # 启动supervisord服务  
    /usr/bin/supervisord -c /etc/supervisord.conf  
      
    #此时可以用 supervisorctl 来管理airflow服务了  
    supervisorctl start airflow_web  
    supervisorctl stop airflow_web  
    supervisorctl restart airflow_web  
    supervisorctl stop all  

    安全认证:

    # 添加密码模块  
    > pip install airflow[password]  
      
    # 启用访问认证  
    > vim /usr/local/airflow/airflow.cfg  
    [webserver]  
    authenticate = true  
    auth_backend = airflow.contrib.auth.backends.password_auth  
      
    # 在 python 中执行添加账户:  
    import airflow  
    from airflow import models, settings  
    from airflow.contrib.auth.backends.password_auth import PasswordUser  
    user = PasswordUser(models.User())  
    user.username = 'admin'  
    user.email = 'wjf20110627@163.com'  
    user.password = 'admin'  
    session = settings.Session()  
    session.add(user)  
    session.commit()  
    session.close()  
    exit()  
    # 重启 airflow_web 服务  
    > supervisorctl restart airflow_web

    访问http://localhost:8080/admin





    遇到的坑:

        1.Error: 'airflow.www.gunicorn_config' doesn't exist

        执行命令 sudo pip3 install 'gunicorn==19.3.0'

        2.ValueError: too many values to unpack

        执行命令 sudo -H pip3 install -U 'sqlalchemy==1.1.18'

    参考资料

    展开全文
  • 集群资源分配 \ master1 master2 slave1 slave2 slave3 组件 scheduler, webserver, flower, airflow-scheduler-failover-controller webserver, airflow-sche...

    集群资源分配

    \master1master2slave1slave2slave3
    组件scheduler, webserver, flower, airflow-scheduler-failover-controllerwebserver, airflow-scheduler-failover-controllerworkerworkerworker

    部署步骤

    安装airflow

    在每台机器上执行

    pip install apache-airflow
    pip install apache-airflow[mysql]
    pip install celery
    pip install redis
    

    由于airflow采用python编写,为了方便请自行安装python环境和pip,本文档采用python2.7和pip 19.2.1,airflow1.10.1

    问题记录:执行pip install apache-airflow[mysql]时若报错mysql_config不存在可运行yum install python-devel mysql-devel命令

    airflow家目录设置

    在每台机器上执行

    export AIRFLOW_HOME=~/airflow
    

    配置文件生成

    在每台机器上执行

    airflow
    

    命令,使其在家目录下生成配置文件airflow.cfg

    配置文件airflow.cfg修改

    ## 时区设置
    default_timezone = Asia/Shanghai
    ## 不加载案例
    load_examples = False
    ## 执行webserver默认启动端口
    web_server_port = 9999
    ## 数据库连接
    sql_alchemy_conn = mysql://airflow:123456@172.19.131.108/airflow
    ## 使用的执行器
    executor = CeleryExecutor
    ## 设置消息的中间代理
    broker_url = redis://redis:Kingsoftcom_123@172.19.131.108:6379/1
    ## 设定结果存储后端 backend
    ## 当然也可以使用 Redis :result_backend =redis://redis:Kingsoftcom_123@172.19.131.108:6379/1
    result_backend = db+mysql://airflow:123456@172.19.131.108/airflow
    

    ps:

    1. 数据库airflow需提前创建并授权给airflow用户,可参考文档:http://note.youdao.com/noteshare?id=647e52adada5129a79e9489674bf5d0f&sub=1510E69969A94D2688407874911A07E1
    2. 本文档采用redis进行master和worker节点的消息通讯,若有使用RabbitMQ消息中间件的同学可配置broker_url=amqp://guest:guest@{RABBITMQ_HOST}:5672/

    修改时区

    https://blog.csdn.net/crazy__hope/article/details/83688986

    安装master的高可用组件

    master1,master2上执行

    安装组件

    pip install git+git://github.com/teamclairvoyant/airflow-scheduler-failover-controller.git@v1.0.2
    

    初始化

    scheduler_failover_controller init
    

    初始化时,会向airflow.cfg中追加内容,因此需要先安装 airflow 并初始化

    修改配置文件 airflow.cfg

    scheduler_nodes_in_cluster=master1,master2
    

    host name 可以通过scheduler_failover_controller get_current_host命令获得

    验证

    scheduler_failover_controller test_connection
    

    ps: 需要先配好master1和master2的ssh免密登录

    启动组件

    nohup scheduler_failover_controller start > /dev/null &
    

    注意:先不要执行改命令,待airflow所有组件启动之后再执行

    编写xsync

    使用同步脚本,每次更新dags目录时执行该脚本

    参考脚本 https://www.jianshu.com/p/e74fbb091144

    启动各组件

    在master1上启动scheduler和webserver

    airflow scheduler -D
    airflow webserver -D
    

    在master2上启动webserver

    airflow webserver -D
    

    在slave1,slave2,slave3上启动worker

    airflow worker -D
    

    出现的问题

    1. from werkzeug.wrappers.json import JSONMixin as _JSONMixin ImportError: No module named json

    解决办法:pip install -U werkzeug

    1. 目前使用root用户启动(借助export C_FORCE_ROOT=True),后续考虑使用其它用户启动

    转载于:https://my.oschina.net/u/3770892/blog/3082003

    展开全文
  • Airflow详细搭建过程(亲测 + 总结)

    千次阅读 2020-07-11 16:58:23
    Airflow详细搭建过程(亲测+总结) 官网:Apache airflow Airflow是社区创建的一个平台,用于以编程方式编写,安排和监视工作流。 半个月前搭了一次,现在做一个记录,不逼逼,开始搭建了,全程多图: 环境准备 系统:...

    Airflow详细搭建过程(亲测+总结)

    官网:Apache airflow
    Airflow是社区创建的一个平台,用于以编程方式编写,安排和监视工作流。
    半个月前搭了一次,现在做一个记录,不逼逼,开始搭建了,全程多图:

    环境准备

    系统: cent os 7
    conda版本: 4.8.2
    airflow版本 1.10.11

    开始搭建

    我这边会用一个conda创建一个apache airflow的环境:

    conda create -n airflow_env python=3.7
    

    切换到当前的这个环境:

    conda activate airflow_env
    

    搭建airflow

    搭建airflow的话,官网有一套详细的文档Airflow 搭建
    接下来就按照这个方式来

    # airflow needs a home, ~/airflow is the default,
    # but you can lay foundation somewhere else if you prefer
    # (optional)
    export AIRFLOW_HOME=~/airflow
    
    # install from pypi using pip
    pip install apache-airflow
    
    # initialize the database
    airflow initdb
    
    # start the web server, default port is 8080
    # airflow webserver -p 8080    这里做个修改,后面加上-D参数让它后台运行
    airflow webserver -p 8080 -D	
    
    # start the scheduler
    airflow scheduler
    
    # visit localhost:8080 in the browser and enable the example dag in the home page
    

    经过上述的步骤的话,可以在浏览器中打开这个页面:
    在这里插入图片描述
    搭建到这里,可以看到一个基础的样子,但是从目前而言,我能发现的有以下几个问题:

    • airflow的元数据存储信息默认是使用sqlite进行存储。
    • 页面的右上角的时间是比正常的时间晚了8个小时的
    • airflow默认是用单线程调度任务的,如下图(之后就知道了)
      在这里插入图片描述
      现在问题已经暴露了,那么就开始处理吧。

    airflow的元数据存储默认用sqlite,现在切换为mysql

    sqlite不支持多线程,所以我打算切换成mysql,mysql的安装可以参考:Linux centos安装mysql
    airflow中可选很多其它的选项,那么在airflow里面我们可以选择一些所需的组件,例如现在需要利用mysql存储airflow的相关信息,可选的功能列表在此处airlfow的其它选项
    就需要pip install 'apache-airflow[mysql]'
    这里,我就不挑了,直接来全套插件,这样就会遇到更多的坑:

    yum install mysql-devel gcc gcc-devel python-devel krb5-devel.x86_64 cyrus-sasl-devel  -y
    pip install 'apache-airflow[all]' -i https://pypi.tuna.tsinghua.edu.cn/simple/
    

    这个时候可能会遇到很多的错误,例如下面的:
    在这里插入图片描述
    这里面的错误要有点耐心去处理一下,在这里面一般都是版本上的错误,将红字里面出现的版本卸载掉,重新指定版本号安装就好了。

    配置airflow

    • 配置mysql作为airflow的元数据信息的存储:
      • vim /etc/my.cnf[mysqld]下面添加explicit_defaults_for_timestamp=1
      • systemctl restart mysqld重启mysql
      • mysql中创建一个数据库,我这边的数据库的名字叫做airflow
        在这里插入图片描述
      • 进入airflow的文件夹下,修改airflow.cfg
        在这里插入图片描述
    • 解决airflow一次只能执行一个任务的问题:
      在这里插入图片描述
      相关的依据请参考airflow 执行者
    • 解决airflow时间晚了八个小时的问题
      修改airflow.cfg的内容:
      在这里插入图片描述
      这部分的内容就要参考airflow 修改源码
      具体的内容如下:
      #找到airflow的安装位置
      find / -name airflow
      
      在这里插入图片描述
    1. 修改/root/anaconda3/envs/airflow_env/lib/python3.7/site-packages/airflow/utils/timezone.py
      在第27行下面添加:
      在这里插入图片描述
      from airflow import configuration as conf
      try:
      	tz = conf.get("core", "default_timezone")
      	if tz == "system":
      		utc = pendulum.local_timezone()
      	else:
      		utc = pendulum.timezone(tz)
      except Exception:
      	pass
      
      修改 utcnow() 函数:
      在这里插入图片描述
    2. 修改/root/anaconda3/envs/airflow_env/lib/python3.7/site-packages/airflow/utils/sqlalchemy.py
      在第38行下面添加: utc = pendulum.timezone('UTC')
    from airflow import configuration as conf
    try:
    	tz = conf.get("core", "default_timezone")
    	if tz == "system":
    		utc = pendulum.local_timezone()
    	else:
    		utc = pendulum.timezone(tz)
    except Exception:
    	pass
    

    在这里插入图片描述
    注释掉这个:
    在这里插入图片描述
    3. 修改/root/anaconda3/envs/airflow_env/lib/python3.7/site-packages/airflow/www/templates/admin/master.html

    修改下箭头所指的行,修改的内容在注释的下面在这里插入图片描述
    此时修改完毕了,这个时候重启一下 airflow就好了。修改源码的操作参考:airflow 修改中国时区(改airflow源码)

    最后的结果如下:

    使用了mysql作为元数据信息的存储,在mysql里面可以看到:
    在这里插入图片描述
    登录airflow的时候:
    在这里插入图片描述

    解决了之前提到的三个问题

    总结

    这个airflow作为一个调度工具,这次只是提到了如何去安装搭建,以后有空的时候,我想补充一篇如何编写airlfow的任务脚本。现在的水平还只是简单的任务脚本的编写,还需要多多努力。
    最后,如果大佬看完之后,发现这个文档里面有什么问题,或是有什么更好的建议,请在下方留言。谢谢!
    在这里插入图片描述

    展开全文
  • airflow详细环境搭建

    2020-12-29 11:23:45
    airflow python安装 使用自动化脚本进行安装 Python3.5.4, 若后续更新 Python 版本, 则修改脚本对应代码 #! /bin/sh # download PYTHON_DIR="/opt/python" if [ -d "$PYTHON_DIR"];then rm /opt/python -rf ...
  • 简介 参考链接: ... ...虚拟机环境配置AirFlow VMware Workstations 11 Ubuntu 18.04.3 + Python + Pip Ubuntu ISO镜像文件下载地址: http://mirrors.aliyun.com/ubuntu-releases/18.04/ ...
  • 在大数据环境下,常用的无非是Oozie,Airflow或者Azkaban。经过简单的评估之后,我们选择了轻量化的Airflow作为我们的工作流工具。 Airflow是一个工作流分配管理系统,通过有向非循环图的方式管理任务流程,设置任务...
  • airflow整合环境搭建 1. 整体结构 mysql -> 后端数据库 redis -> 用于broker CeleryExecutor -> 执行器 2. 环境安装 2.1,安装python anaconda环境 添加py用户 # useradd py 设置密码 # passwd py 创建...
  • mkdir ./dags ./logs ./plugins echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 550
精华内容 220
关键字:

airflow搭建