zoukankan      html  css  js  c++  java
  • Hadoop(一)阿里云hadoop集群配置

    集群配置

    三台ECS云服务器

    配置步骤

    1.准备工作

    1.1 创建/bigdata目录

    mkdir /bigdata
    cd /bigdata
    mkdir /app

    1.2修改主机名为node01、node02、node03

    1.3修改hosts文件

    vim /etc/hosts

    添加node01~node03内网IP映射

    127.0.0.1       localhost       localhost.localdomain   localhost4      localhost4.localdomain4
    ::1     localhost       localhost.localdomain   localhost6      localhost6.localdomain6
    
    172.16.237.91 node01
    172.16.237.90 node02
    172.16.221.55 node03

    1.4安装jdk

    1.5配置SSH免密登陆

    1.6安装zookeeper,

    2.开始配置

    2.1 配置前的准备

    将hadoop安装包上传解压到/bigdata/app路径下

    tar -zxvf hadoop-2.8.4.tar.gz -C /bigdata/app

    创建软链接

    ln -s /bigdata/app/hadoop-2.8.4 /usr/local/hadoop

    将hadoop配置信息添加到环境变量中
    注意:Hadoop配置文件路径是/usr/local/hadoop/etc/hadoop

    vim /etc/profile

    添加内容如下:

    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export YARN_HOME=$HADOOP_HOME
    export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin

    重新编译环境变量使配置生效

    source /etc/profile

    2.2 配置HDFS
    2.2.1进入到Hadoop配置文件路径
    cd /usr/local/hadoop/etc/hadoop
    2.2.2修改hadoo-env.sh
    修改JDK路径

    export JAVA_HOME=/usr/local/jdk

    2.2.3 配置core-site.xml
    2.2.4 配置hdfs-site.xml

     配置文件在下面

    2.3 配置YARN
    2.3.1 修改yarn-site.xml
    2.3.2 修改mapred-site.xml

    配置文件在下面
    2.3.3 在/usr/local/hadoop路径下创建hdpdata文件夹

    cd /usr/local/hadoop
    mkdir hdpdata

    2.4 修改/usr/local/hadoop/etc/hadoop下的slaves文件

    设置datanode和nodemanager启动节点主机名称

    在slaves文件中添加节点的主机名称

    node02
    node03

    2.5将配置好的hadoop拷贝
    scp -r hadoop-2.8.4 root@node02:/bigdata/app
    scp -r hadoop-2.8.4 root@node03:/bigdata/app

    在每个节点分别执行如下三步操作
    第一步:使用root用户创建软链接
    ln -s /bigdata/app/hadoop-2.8.4 /usr/local/hadoop
    第二步:设置环境变量

    vim /etc/profile

    添加内容:

    export HADOOP_HOME=/usr/local/hadoop
    export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export YARN_HOME=$HADOOP_HOME
    export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
    export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin

    第三步:重新编译环境变量使配置生效

    source /etc/profile

    3.集群启动(注意严格按照顺序启动)

    3.1 启动journalnode(分别在node01、node02、node03上执行启动)

    /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode

    运行jps命令检验,node01、node02、node03上多了JournalNode进程


    3.2 格式化HDFS
    在node01上执行命令:

    hdfs namenode -format

    格式化成功之后会在core-site.xml中的hadoop.tmp.dir指定的路径下生成dfs文件夹,将该文件夹拷贝到node02的相同路径下

    scp -r hdpdata root@node02:/usr/local/hadoop

    3.3 在node01上执行格式化ZKFC操作

    hdfs zkfc -formatZK

    执行成功,日志输出如下信息
    INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns in ZK

    3.4 在node01上启动HDFS

    sbin/start-dfs.sh

    3.5在node02上启动YARN

    sbin/start-yarn.sh

    在node01单独启动一个ResourceManger作为备份节点

    sbin/yarn-daemon.sh start resourcemanager

    3.6在node02上启动JobHistoryServer

    sbin/mr-jobhistory-daemon.sh start historyserver

    启动完成node02会增加一个JobHistoryServer进程

    3.7hadoop安装启动完成
    HDFS HTTP访问地址
    NameNode (active):http://node01:50070
    NameNode (standby):http://node02:50070
    ResourceManager HTTP访问地址
    ResourceManager :http://node02:8088
    历史日志HTTP访问地址
    JobHistoryServer:http:/node02:19888

    4.集群验证

    4.1 验证HDFS 是否正常工作及HA高可用首先向hdfs上传一个文件

    hadoop fs -put /usr/local/hadoop/README.txt /

    在active节点手动关闭active的namenode

    sbin/hadoop-daemon.sh stop namenode

    通过HTTP 50070端口查看standby namenode的状态是否转换为active
    手动启动上一步关闭的namenode

    sbin/hadoop-daemon.sh start namenode

    4.2验证ResourceManager HA高可用
    手动关闭node02的ResourceManager

    sbin/yarn-daemon.sh stop resourcemanager

    通过HTTP 8088端口访问node01的ResourceManager查看状态
    手动启动node02 的ResourceManager

    sbin/yarn-daemon.sh start resourcemanager

    启动脚本

    配置文件

    core-site.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    
    <!-- Put site-specific property overrides in this file. -->
    
    <configuration>
        <!-- 指定hdfs的nameservice名称空间为ns -->
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://ns</value>
        </property>
        <!-- 指定hadoop临时目录,默认在/tmp/{$user}目录下,不安全,每次开机都会被清空-->
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/hadoop/hdpdata/</value>
            <description>需要手动创建hdpdata目录</description>
        </property>
        <!-- 指定zookeeper地址 -->
        <property>
            <name>ha.zookeeper.quorum</name>
            <value>node01:2181,node02:2181,node03:2181</value>
            <description>zookeeper地址,多个用逗号隔开</description>
        </property>
    </configuration>

    hdfs-site.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    
    <!-- Put site-specific property overrides in this file. -->
    
    <configuration>
        <!-- NameNode HA配置 -->
        <property>
            <name>dfs.nameservices</name>
            <value>ns</value>
            <description>指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致</description>
        </property>
        <property>
            <name>dfs.ha.namenodes.ns</name>
            <value>nn1,nn2</value>
            <description>ns命名空间下有两个NameNode,逻辑代号,随便起名字,分别是nn1,nn2</description>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.ns.nn1</name>
            <value>node01:9000</value>
            <description>nn1的RPC通信地址</description>
        </property>
        <property>
            <name>dfs.namenode.http-address.ns.nn1</name>
            <value>node01:50070</value>
            <description>nn1的http通信地址</description>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.ns.nn2</name>
            <value>node02:9000</value>
            <description>nn2的RPC通信地址</description>
        </property>
        <property>
            <name>dfs.namenode.http-address.ns.nn2</name>
            <value>node02:50070</value>
            <description>nn2的http通信地址</description>
        </property>
        <!--JournalNode配置 -->
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://node01:8485;node02:8485;node03:8485/ns</value>
        </property>
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/usr/local/hadoop/journaldata</value>
            <description>指定JournalNode在本地磁盘存放数据的位置</description>
        </property>
        <!--namenode高可用主备切换配置 -->
        <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
            <description>开启NameNode失败自动切换</description>
        </property>
        <property>
            <name>dfs.client.failover.proxy.provider.ns</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
            <description>配置失败自动切换实现方式,使用内置的zkfc</description>
        </property>
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>
                sshfence
                shell(/bin/true)
            </value>
            <description>配置隔离机制,多个机制用换行分割,先执行sshfence,执行失败后执行shell(/bin/true),/bin/true会直接返回0表示成功</description>
        </property>
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/root/.ssh/id_rsa</value>
            <description>使用sshfence隔离机制时需要ssh免登陆</description>
        </property>
        <property>
            <name>dfs.ha.fencing.ssh.connect-timeout</name>
            <value>30000</value>
            <description>配置sshfence隔离机制超时时间</description>
        </property>
        <!--dfs文件属性设置-->
        <property>
            <name>dfs.replication</name>
            <value>3</value>
            <description>默认block副本数为3,测试环境这里设置为1,注意生产环境一定要设置3个副本以上</description>
        </property>
    
        <property>
            <name>dfs.block.size</name>
            <value>134217728</value>
            <description>设置block大小是128M</description>
        </property>

        <!-- 如果是通过公网IP访问阿里云上内网搭建的集群 -->
    <property>
        <name>dfs.client.use.datanode.hostname</name>
        <value>true</value>
        <description>only cofig in clients</description>
    </property>

    </configuration>

    mapred-site.xml

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    
    <!-- Put site-specific property overrides in this file. -->
    
    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
            <description>指定mr框架为yarn方式 </description>
        </property>
        <!-- 历史日志服务jobhistory相关配置 -->
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>node02:10020</value>
            <description>历史服务器端口号</description>
        </property>
        <property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>node02:19888</value>
            <description>历史服务器的WEB UI端口号</description>
        </property>
    </configuration>

    yarn-site.xml

    <?xml version="1.0"?>
    <!--
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License. See accompanying LICENSE file.
    -->
    <configuration>
        <!-- 开启RM高可用 -->
        <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>
        <!-- 指定RM的cluster id,一组高可用的rm共同的逻辑id -->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>yarn-ha</value>
        </property>
        <!-- 指定RM的名字,可以随便自定义 -->
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm1,rm2</value>
        </property>
        <!-- 分别指定RM的地址 -->
        <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>node01</value>
        </property>
        <property>
            <name>yarn.resourcemanager.webapp.address.rm1</name>
            <value>${yarn.resourcemanager.hostname.rm1}:8088</value>
            <description>HTTP访问的端口号</description>
        </property>
        <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>node02</value>
        </property>
        <property>
            <name>yarn.resourcemanager.webapp.address.rm2</name>
            <value>${yarn.resourcemanager.hostname.rm2}:8088</value>
        </property>
        <!-- 指定zookeeper集群地址 -->
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>node01:2181,node02:2181,node03:2181</value>
        </property>
        <!--NodeManager上运行的附属服务,需配置成mapreduce_shuffle,才可运行MapReduce程序-->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <!-- 开启日志聚合 -->
        <property>
            <name>yarn.log-aggregation-enable</name>
            <value>true</value>
        </property>
        <!-- 日志聚合HDFS目录 -->
        <property>
            <name>yarn.nodemanager.remote-app-log-dir</name>
            <value>/data/hadoop/yarn-logs</value>
        </property>
        <!-- 日志保存时间3days,单位秒 -->
        <property>
            <name>yarn.log-aggregation.retain-seconds</name>
            <value>259200</value>
        </property>
    </configuration>

    问题

    namenode连接不上,查看日志发现

    java.io.IOException: There appears to be a gap in the edit log.  We expected txid 1, but got txid 2.

    在hadoop的bin目录下修复元数据

    hadoop namenode -recover

    先选y后选c

    概念

    守护进程是在后台运行不受终端控制的进程(如输入、输出等),一般的网络服务都是以守护进程的方式运行。守护进程脱离终端的主要原因有两点:(1)用来启动守护进程的终端在启动守护进程之后,需要执行其他任务。(2)(如其他用户登录该终端后,以前的守护进程的错误信息不应出现)由终端上的一些键所产生的信号(如中断信号),不应对以前从该终端上启动的任何守护进程造成影响。要注意守护进程与后台运行程序(即加&启动的程序)的区别。

    守护进程和后台程序

    (a)守护进程已经完全脱离终端控制台了,而后台程序并未完全脱离终端,在终端未关闭前还是会往终端输出结果
    (b)守护进程在关闭终端控制台时不会受影响,而后台程序会随用户退出而停止,需要在以nohup command & 格式运行才能避免影响
    (c)守护进程的会话组和当前目录,文件描述符都是独立的。后台运行只是终端进行了一次fork,让程序在后台执行,这些都没改变。

    hadoop目录结构

    1.$HADOOP_HOME/bin目录下文件及作用

    文件名称 说明
    hadoop 用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心

    2.$HADOOP_HOME/sbin目录下文件及作用

    文件名称 说明
    hadoop-daemon.sh

    通过执行hadoop命令来启动/停止一个守护进程(daemon);该命令会被bin目录下面所有以start或stop开头的所有命令调用来执行命令,

    hadoop-daemons.sh也是通过调用hadoop-daemon.sh来执行命令的,而hadoop-daemon.sh本身就是通过调用hadoop命令来执行任务。

    start-all.sh 全部启动,它会调用start-dfs.sh及start-mapred.sh
    start-dfs.sh 启动NameNode、DataNode以及SecondaryNameNode
    start-mapred.sh 启动MapReduce
    stop-all.sh 全部停止,它会调用stop-dfs.sh及stop-mapred.sh
    stop-balancer.sh 停止balancer
    stop-dfs.sh 停止NameNode、DataNode及SecondaryNameNode
    stop-mapred.sh  停止MapReduce

    3.$HADOOP_HOME/etc/hadoop目录下文件及作用

    文件名称 说明
    core-site.xml

    Hadoop核心全局配置文件,可以其他配置文件中引用该文件中定义的属性,如在hdfs-site.xml及mapred-site.xml中会引用该文件的属性;

    该文件的模板文件存在于$HADOOP_HOME/src/core/core-default.xml,可将模板文件复制到conf目录,再进行修改。

    hadoop-env.sh Hadoop环境变量
    hdfs-site.xml HDFS配置文件,该模板的属性继承于core-site.xml;该文件的模板文件存于$HADOOP_HOME/src/hdfs/hdfs-default.xml,可将模板文件复制到conf目录,再进行修改
    mapred-site.xml

    MapReduce的配置文件,该模板的属性继承于core-site.xml;该文件的模板文件存于$HADOOP_HOME/src/mapred/mapredd-default.xml,

    可将模板文件复制到conf目录,再进行修改

    slaves 用于设置所有的slave的名称或IP,每行存放一个。如果是名称,那么设置的slave名称必须在/etc/hosts有IP映射配置

    4.$HADOOP_HOME/lib目录

    该目录下存放的是Hadoop运行时依赖的jar包,Hadoop在执行时会把lib目录下面的jar全部加到classpath中。

    5.$HADOOP_HOME/logs目录

    该目录存放的是Hadoop运行的日志,查看日志对寻找Hadoop运行错误非常有帮助。

    6.$HADOOP_HOME/include目录
    对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。
    7.$HADOOP_HOME/libexec目录
    各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。
    8.$HADOOP_HOME/share目录
    Hadoop各个模块编译后的jar包所在的目录。

    端口

    Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问。而随着Hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集记录如此,以便查询。

    这里包含我们使用到的组件:HDFS, YARN, HBase, Hive, ZooKeeper:

    组件

    节点

    默认端口

    配置

    用途说明

    HDFS

    DataNode

    50010

    dfs.datanode.address

    datanode服务端口,用于数据传输

    HDFS

    DataNode

    50075

    dfs.datanode.http.address

    http服务的端口

    HDFS

    DataNode

    50475

    dfs.datanode.https.address

    https服务的端口

    HDFS

    DataNode

    50020

    dfs.datanode.ipc.address

    ipc服务的端口

    HDFS

    NameNode

    50070

    dfs.namenode.http-address

    http服务的端口

    HDFS

    NameNode

    50470

    dfs.namenode.https-address

    https服务的端口

    HDFS

    NameNode

    8020

    fs.defaultFS

    接收Client连接的RPC端口,用于获取文件系统metadata信息。

    HDFS

    journalnode

    8485

    dfs.journalnode.rpc-address

    RPC服务

    HDFS

    journalnode

    8480

    dfs.journalnode.http-address

    HTTP服务

    HDFS

    ZKFC

    8019

    dfs.ha.zkfc.port

    ZooKeeper FailoverController,用于NN HA

    YARN

    ResourceManager

    8032

    yarn.resourcemanager.address

    RM的applications manager(ASM)端口

    YARN

    ResourceManager

    8030

    yarn.resourcemanager.scheduler.address

    scheduler组件的IPC端口

    YARN

    ResourceManager

    8031

    yarn.resourcemanager.resource-tracker.address

    IPC

    YARN

    ResourceManager

    8033

    yarn.resourcemanager.admin.address

    IPC

    YARN

    ResourceManager

    8088

    yarn.resourcemanager.webapp.address

    http服务端口

    YARN

    NodeManager

    8040

    yarn.nodemanager.localizer.address

    localizer IPC

    YARN

    NodeManager

    8042

    yarn.nodemanager.webapp.address

    http服务端口

    YARN

    NodeManager

    8041

    yarn.nodemanager.address

    NM中container manager的端口

    YARN

    JobHistory Server

    10020

    mapreduce.jobhistory.address

    IPC

    YARN

    JobHistory Server

    19888

    mapreduce.jobhistory.webapp.address

    http服务端口

    HBase

    Master

    60000

    hbase.master.port

    IPC

    HBase

    Master

    60010

    hbase.master.info.port

    http服务端口

    HBase

    RegionServer

    60020

    hbase.regionserver.port

    IPC

    HBase

    RegionServer

    60030

    hbase.regionserver.info.port

    http服务端口

    HBase

    HQuorumPeer

    2181

    hbase.zookeeper.property.clientPort

    HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。

    HBase

    HQuorumPeer

    2888

    hbase.zookeeper.peerport

    HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。

    HBase

    HQuorumPeer

    3888

    hbase.zookeeper.leaderport

    HBase-managed ZK mode,使用独立的ZooKeeper集群则不会启用该端口。

    Hive

    Metastore

    9083

    /etc/default/hive-metastore中export PORT=来更新默认端口

     

    Hive

    HiveServer

    10000

    /etc/hive/conf/hive-env.sh中export HIVE_SERVER2_THRIFT_PORT=来更新默认端口

     

    ZooKeeper

    Server

    2181

    /etc/zookeeper/conf/zoo.cfg中clientPort=

    对客户端提供服务的端口

    ZooKeeper

    Server

    2888

    /etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],标蓝部分

    follower用来连接到leader,只在leader上监听该端口。

    ZooKeeper

    Server

    3888

    /etc/zookeeper/conf/zoo.cfg中server.x=[hostname]:nnnnn[:nnnnn],标蓝部分

    用于leader选举的。只在electionAlg是1,2或3(默认)时需要。

    所有端口协议均基于TCP。

    对于存在Web UI(HTTP服务)的所有hadoop daemon,有如下url:

    /logs

    日志文件列表,用于下载和查看

    /logLevel

    允许你设定log4j的日志记录级别,类似于hadoop daemonlog

    /stacks

    所有线程的stack trace,对于debug很有帮助

    /jmx

    服务端的Metrics,以JSON格式输出。

    /jmx?qry=Hadoop:*会返回所有hadoop相关指标。 

    /jmx?get=MXBeanName::AttributeName 查询指定bean指定属性的值,例如/jmx?get=Hadoop:service=NameNode,name=NameNodeInfo::ClusterId会返回ClusterId。 

    这个请求的处理类:org.apache.hadoop.jmx.JMXJsonServlet

    而特定的Daemon又有特定的URL路径特定相应信息。

    NameNode:http://:50070/

    /dfshealth.jsp

    HDFS信息页面,其中有链接可以查看文件系统

    /dfsnodelist.jsp?whatNodes=(DEAD|LIVE) 

    显示DEAD或LIVE状态的datanode

    /fsck

    运行fsck命令,不推荐在集群繁忙时使用!

    DataNode:http://:50075/

    /blockScannerReport

    每个datanode都会指定间隔验证块信息

  • 相关阅读:
    Laravel入坑指南(5)——请求与响应
    Laravel入坑指南(4)——数据库(Mysql)
    CentOS7 开机网卡加载失败
    个人CKeditor的config.js配置
    取消ie浏览器edge浏览器输入框右边的叉和眼睛
    angularjs中ckeditor的destroy问题
    angular js ckeditor directive示例代码
    建立没有文件名的文件
    设置ckeditor文本框的宽度为百分比自适应
    js中遍历删除数组中的项(项目中遇到的问题解决)
  • 原文地址:https://www.cnblogs.com/aidata/p/11706515.html
Copyright © 2011-2022 走看看