Hadoop,ZooKeeper,HBase,hive(HQL)安装步骤

news/2024/11/27 15:56:03/

Hadoop安装:

首先我们统一一下定义,在这里所提到的Hadoop是指Hadoop Common,主要提供DFS(分布式文件存储)与Map/Reduce的核心功能。

Hadoop在windows下还未经过很好的测试,所以推荐大家在linux(cent os 6.X)下安装使用。

准备安装Hadoop集群之前我们得先检验系统是否安装了如下的必备软件:ssh和Jdk1.6(因为Hadoop需要使用到Jdk中的编译工具,所以一般不直接使用Jre)。可以使用yum install rsync来安装rsync。一般来说ssh是默认安装到系统中的。

Jdk1.6的安装方法

下载linux版本的java,

#mkdir /usr/java

#cd /usr/java

#chmod a+x jdk-6u27-linux-i586.bin

#./jdk-6u27-linux-i586.bin

安装完成后,设置环境变量:在etc/profile中设置

#export JAVA_HOME=/usr/java/jdk1.6.0_27

#export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#export PATH=$PATH:$JAVA_HOME/bin

设置完成后,使用reboot或者source /etc/profile

确保以上准备工作完了之后我们就开始安装Hadoop软件,假设我们用三台机器做Hadoop集群,分别是:192.168.0.141、192.168.0.142和192.168.0.143(下文简称141,142和143),且都使用root用户。

这里有一点需要强调的就是,务必要确保每台机器的主机名和IP地址之间能正确解析。

Host配置

一个很简单的测试办法就是ping一下主机名,比如在ww-1上ping ww-2,如果能ping通就OK!若不能正确解析,可以修改/etc/hosts文件,如果该台机器作Namenode用,则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名;如果该台机器作Datanode用,则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。

以本文为例,dbrg-1中的/etc/hosts文件看起来就应该是这样的:

127.0.0.1         localhost     localhost

192.168.0.141     ww-1        ww-1

192.168.0.142     ww-2        ww-2

192.168.0.143     ww-3        ww-3

ww-2中的/etc/hosts文件看起来就应该是这样的:

127.0.0.0         localhost    localhost

192.168.0.141     ww-1        ww-1

192.168.0.143     ww-3        ww-3

下面是在centos6平台下安装Hadoop的过程:

在usr下建立hadoop文件夹,将hadoop下载文件解压。

在etc/profile文件中设置环境变量:

export  HADOOP_HOME=/home/ww/hadoop.020.204.0/hadoop

集群配置

在这里我们使用141作为NameNode与JobTracker,其它两台机器作为DataNode和TaskTracker,具体的配置如下:

环境的配置

在$HADOOP_HOME/conf/hadoop-env.sh中定义了Hadoop启动时需要的环境变量设置,其中我们至少需要配置JAVA_HOME(Jdk的路径)变量;另外我们一般还需要更改HADOOP_LOG_DIR(Hadoop的日志路径)这个变量,默认的设置是“export HADOOP_LOG_DIR=${HADOOP_HOME}/logs”,一般需要将其配置到一个磁盘空间比较大的目录下。(不是必要)

Hadoop核心程序配置

Hadoop 包括一组默认配置文件($HADOOP_HOME/src目录下的core/core-default.xml, hdfs/hdfs-default.xml 和mapred/mapred-default.xml)。虽然默认配置文件能让Hadoop核心程序顺利启动,一般需要自己来设置一些常规配置以满足开发和业务的需求,所以我们需要对默认配置文件的值进行覆盖,具体方法如下。

$HADOOP_HOME/conf/core-site.xml是Hadoop的核心配置文件,对应并覆盖core-default.xml中的配置项。我们一般在这个文件中增加如下配置:

Core-site.xml代码

<configuration><property><!-- 用于dfs命令模块中指定默认的文件系统协议 --><name>fs.default.name</name><value>hdfs://192.168.1.111:9000</value></property>
</configuration>

$HADOOP_HOME/conf/hdfs-site.xml是HDFS的配置文件,对应并覆盖hdfs-default.xml中的配置项。我们一般在这个文件中增加如下配置:

<configuration><property><!-- DFS中存储文件命名空间信息的目录 --><name>dfs.name.dir</name><value>/opt/hadoop/data/dfs.name.dir</value></property><property><!-- DFS中存储文件数据的目录 --><name>dfs.data.dir</name><value>/opt/hadoop/data/dfs.data.dir</value></property><property><!-- 是否对DFS中的文件进行权限控制(测试中一般用false)--><name>dfs.permissions</name><value>false</value></property>
</configuration>

$HADOOP_HOME/conf/mapred-site.xml是Map/Reduce的配置文件,对应并覆盖mapred-default.xml中的配置项。我们一般在这个文件中增加如下配置:

<configuration><property><!-- 用来作JobTracker的节点的(一般与NameNode保持一致) --><name>mapred.job.tracker</name><value>192.168.0.141:9001</value></property><property><!-- map/reduce的系统目录(使用的HDFS的路径) --><name>mapred.system.dir</name><value>/system/mapred.system.dir</value></property><property><!-- map/reduce的临时目录(可使用“,”隔开,设置多重路径来分摊磁盘IO) --><name>mapred.local.dir</name><value>/opt/hadoop/data/mapred.local.dir</value></property>
</configuration>

主从配置

  在$HADOOP_HOME/conf目录中存在masters和slaves这两个文件,用来做Hadoop的主从配置。上面已经提到了Hadoop主要由NameNode/DataNode 和JobTracker/TaskTracker构成,在主从配置里我们一般将NameNode和JobTracker列为主机,其它的共为从机,于是对于此处的配置应该是:

Masters代码

192.168.0.141

 Slaves代码

192.168.0.142  

192.168.0.143  

如果你对以上介绍的配置项做了正确的配置,那么你的Hadoop集群只差启动和初体念了,当然,在$HADOOP_HOME/conf目录下还包括其它的一些配置文件,但那些都不是必须设置的,如果有兴趣你可以自己去了解了解。

值得注意的是Hadoop集群的所有机器的配置应该保持一致,一般我们在配置完master后,使用scp将配置文件同步到集群的其它服务器上。

SSH配置

经过以上两个步骤,Hadoop的安装和配置已经OK了,那么下面我们就来启动Hadoop集群。启动前我们需要做一些准备,因为集群的启动是从NameNode开始的,于是DataNode的运行需要NameNode的远程调用,Hadoop使用ssh命令远程运行DataNode节点,这就是为什么Hadoop需要ssh的支持。我们可以想象一下,如果集群里有100台机器,那么我们就需要输入100遍主机的访问密码,但如果配置SSH使用无密码公钥认证的方式,就解决了此问题。

简单的说,在141上需要生成一个密钥对,即一个私钥和一个公钥。将公钥拷贝到142和143上,如此一来,当141向142发起ssh连接的时候,142上就会生成一个随机数并用141的公钥对这个随机数进行加密,并且发送给141,141收到这个加密的数以后用私钥进行解密,并将解密后的数返回142,142确认解密的数无误后就允许141进行连接了。这就完成了一次公钥认证过程。

公钥生成的步骤如下:

在每台电脑的用户文件夹下面建立.ssh文件夹

命令为:#mkdir .ssh

然后生成密钥:命令为:

# ssh-keygen -t rsa

之后三次回车,完成之后,会在ssh文件夹下面建立id_rsa.pub,id_rsa两个文件。所有计算机都生成完密钥后。

将主机生成的id_rsa.pub的内容复制到authorized_keys文件中。如果authorized_keys不存在,则使用touch ~/.ssh/authorized_keys生成一个;如果该文件已经存在,则追加内容进去就OK了。

最后将生成主机的.ssh文件夹拷贝到其它计算机中。

这里我们推荐使用如下命令:

本机:

#cd .ssh

 #cp id_rsa.pub authorized_keys

在往远程计算机copy文件之前,要先对本机取得ssh权限

即在本机:#ssh 192.168.0.141按提示进行。

远程:scp –r /home/ww/.ssh 192.168.0.142:/home/ww

scp –r /home/ww/.ssh 192.168.0.143:/home/ww

#chmod go-rwx authorized_keys  644权限 所有计算机上都要进行,必须保证authorized_keys只对其所有者有读写权限,其他人不允许有写的权限,否则SSH是不会工作的。

测试是否成功命令:ssh 192.168.0.142

经过以上步骤,我们的无密码访问就配置好了。

部署远程计算机

前面讲的这么多Hadoop的环境变量和配置文件都是在ww-1这台机器上的,现在需要将hadoop部署到其他的机器上,保证目录结构一致。

[ww@ww-1:~]$scp  -r  /home/ww/Hadoop0.20.204.0  ww-2:/home/ww/

[ww@ww-1:~]$scp  -r  /home/ww/Hadoop0.20.204.0  ww-3:/home/ww/

至此,可以说,Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop吧。

启动

启动方式如下:

启动服务之前,我们需要做一件事情,非常重要,那就是格式化命名空间

#bin/hadoop namenode –format

启动dfs和map/reduce服务

bin/start-all.sh(开启服务时,使用有管理员权限的帐户)

我们用如下命令验证一下是否启动成功:

bin/hadoop dfs -ls

如果没有错误提示或者出现文件列表,那么恭喜你,Hadoop成功启动了,另外,我们可以通过访问http://192.168.0.141:50070来查看hdfs的状态,访问http://192.168.0.141:50030来查看map/reduce的状态。

如果出现错误,或Hadoop集群未启动,可以查看$HADOOP_HOME/logs/下的日志文件。

HDFS操作

运行bin/目录的hadoop命令,可以查看Hadoop所有支持的操作及其用法,这里以几个简单的操作为例。

建立目录

[ww@ww-1:hadoop]$bin/hadoop dfs –mkdir testdir

在HDFS中建立一个名为testdir的目录

复制文件

[ww@ww-1:hadoop]$bin/hadoop dfs –put /home/ww/large.zip testfile.zip

把本地文件large.zip拷贝到HDFS的根目录/user/ww/下,文件名为testfile.zip

查看现有文件

[ww@ww-1:hadoop]$bin/hadoop dfs –ls

安装和配置ZooKeeper

HBase从0.20.0开始,需要首先安装ZooKeeper。从apache上下载zookeeper-3.3.3.tar.gz(Stable版本),解压到/home/hdfs/目录下。

(1),在namenode节点新建zookeeper目录,在该目录下新建myid文件。

(2),在zookeeper-3.3.3/conf目录下,拷贝zoo_sample.cfg为zoo.cfg。在zoo.cfg中将dataDir改为/home/hdfs/zookeeper,在文件末位添加所有的主机:

server.1=master:2888:3888server.2=slave1:2888:3888server.3=slave2:2888:3888

(3)用scp命令将namenode节点的的/home/hdfs/ zookeeper-3.3.3和/home/hdfs/ zookeeper拷贝到其余所有主机的/home/hdfs目录下。

(4)参照zoo.cfg中的配置,在各主机myid文件中写入各自的编号。如:server.1写入1, server.2写入2

在所有节点上执行bin/zkServer.sh start,分别启动。

刚启动一台机器时,会报错,机器全部启动后就正常了。

执行bin/zkCli.sh -server slave2:2181,检查指定服务器是否成功启动。

检查zookeeper状态,echo ruok| nc master 2181(不用做这些HBase会帮我们启动ZK)

HBase安装:(版本0.90.4)

修改文件:/etc/profile

export HBASE_HOME=/usr/local/hbaseexport PATH=$PATH:$HBASE_HOME/bin

先关闭hadoop的安全模式

#bin/hadoop dfsadmin savemodel leave

不然会出现mismatch错误

(1)系统所有配置项的默认设置在hbase-default.xml中查看,如果需要修改配置项的值,在hbase-site.xml中添加配置项。

在分布式模式下安装HBase,需要添加的最基本的配置项如下:

  <property><name>hbase.rootdir</name><value>hdfs://master:54310/hbase</value></property><property><name>hbase.cluster.distributed</name><value>true</value></property><property><name>hbase.master</name><value>hdfs://master:60000</value></property><property>    <name>hbase.zookeeper.quorum</name>    <value>slave-001,slave-002,slave-003</value>    <description>Comma separated list of servers in the ZooKeeper Quorum.    For example, "host1.mydomain.com,host2.mydomain.com,host3.mydomain.com".    By default this is set to localhost for local and pseudo-distributed modes    of operation. For a fully-distributed setup, this should be set to a full    list of ZooKeeper quorum servers. If HBASE_MANAGES_ZK is set in hbase-env.sh    this is the list of servers which we will start/stop ZooKeeper on.   </description>  </property><property>    <name>hbase.zookeeper.property.dataDir</name>    <value>/data/work/zookeeper</value>    <description>Property from ZooKeeper's config zoo.cfg.    The directory where the snapshot is stored.    </description>  </property>

(2)在conf/hbase-env.sh中修改添加配置项:

export JAVA_HOME=/usr/java/jdk1.6.0_22
export HBASE_MANAGES_ZK=true
export HADOOP_CONF_DIR=/hadoop/hadoop-config(如果默认,则不添加)

并把~/hadoop-0.20.1/conf/hdfs-site.xml拷贝至~/hbase-3.2.1/conf/目录下(不知道什么用)。

(3)使用hadoop目录下hadoop-0.20.2-core.jar替换hbase-0.90.4/lib下的hadoop-core-0.20-append-r1056497.jar,如果不这样做,会出现版本不一致,导致HMaster启动失败。

(4)在conf/regionservers中添加hadoop-0.20.1/conf/slaves中所有的datanode节点。

Slave1

Slave2

(5)启动

启动/关闭HBase

   bin/start-hbase.sh

   bin/stop-hbase.sh

测试HBase

   bin/hbase shell

   create ‘bigtable1’ ‘data’

   put ‘bigtable1’,’row1’,’data:aa’,’value1’

   put ‘bigtable1’,’row2’,’data:bb’,’value2’

   list

   scan ‘bigtable1’

删除表:

#disable ‘table1’

#drop ‘table1’

先启动Hadoop再启动HBase,命令如下

所有命令如下:

Bin/start-all.sh—>Bin/start-hbase.sh

Bin/stop-hbase.sh—>Bin/ stop -all.sh

HBase java编程时需要导入下列包:

     hbase-0.20.6.jar

      hadoop-core-0.20.1.jar

     commons-logging-1.1.1.jar

     zookeeper-3.3.0.jar

     log4j-1.2.91.jar

Hive安装步骤

http://victorzhzh.iteye.com/blog/972406

第一步,启动hadoop,命令:./start-all.sh

第二步,启动hive,命令:

#bin/hive

第三步,启动hbase,命令:./start-hbase.sh

第四步,建立关联表,这里我们要查询的表在hbase中已经存在所以,使用CREATE EXTERNAL TABLE来建立,如下:

CREATE EXTERNAL TABLE hbase_table_2(key string, value1 string,value2 string)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'    WITH SERDEPROPERTIES ("hbase.columns.mapping" = "data:1,data1:1")    TBLPROPERTIES("hbase.table.name" = "test");    CREATE EXTERNAL TABLE hbase_table_2(key string, value string)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("hbase.columns.mapping" = "data:1")TBLPROPERTIES("hbase.table.name" = "test");  

 hbase.columns.mapping指向对应的列族;多列时,data:1,data:1;多列族时,data1:1,data1:2;

 hbase.table.name指向对应的表;

 hbase_table_2(key string, value string),这个是关联表

我们看一下HBase中要查询的表的结构,

hbase(main):001:0> describe 'test'

DESCRIPTION                                                             ENABLED                               

 {NAME => 'test', FAMILIES => [{NAME => 'data', COMPRESSION => 'NONE',  true                                  

 VERSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY                                        

 => 'false', BLOCKCACHE => 'true'}]}                                                                          

1 row(s) in 0.0810 seconds

hbase(main):002:0>

 在看一下表中的数据,

hbase(main):002:0> scan 'test'

ROW                          COLUMN+CELL                                                                      

 row1                        column=data:1, timestamp=1300847098583, value=value1                             

 row12                       column=data:1, timestamp=1300849056637, value=value3                             

 row2                        column=data:2, timestamp=1300847106880, value=value2                             

3 row(s) in 0.0160 seconds

hbase(main):003:0>

 列族:data:1、data:1两个

 Key:row1、row12、row2

 value:value1、value3、value2

 hbase_table_2(key string, value string)中对应的test表中的row,value字段对应的是test表中的value

OK,现在可以来看看查询结果了,

我们在hive命令行中先查看一下hbase_table_2,

hive> select * from hbase_table_2;

OK

row1 value1

row12 value3

Time taken: 0.197 seconds

hive>

 对比一下test表中的列族为data:1的数据,

column=data:1, timestamp=1300847098583, value=value1                                
column=data:1, timestamp=1300849056637, value=value3    

 row1                        column=data:1, timestamp=1300847098583, value=value1                             

 row12                       column=data:1, timestamp=1300849056637, value=value3  

和查询结果相符,没问题,然后我们在hbase中在给列族data:1新增一条数据,

hbase(main):003:0> put 'test','row13','data:1','value4'

0 row(s) in 0.0050 seconds

hbase(main):004:0>

 再查看hbase_table_2表,

hive> select * from hbase_table_2;

OK

row1 value1

row12 value3

row13 value4

Time taken: 0.165 seconds

hive>

 新增数据value4出现了,说明可以通过hbase_table_2查询hbase的test表

下面我们来查询一下test表中value值为value3的数据,

hive> select * From hbase_table_2 where value='value3';

Total MapReduce jobs = 1

Launching Job 1 out of 1

Number of reduce tasks is set to 0 since there's no reduce operator

Starting Job = job_201103231022_0001, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201103231022_0001

Kill Command = /home/dream-victor/hadoop-0.20.2/bin/hadoop job  -Dmapred.job.tracker=localhost:9001 -kill job_201103231022_0001

2011-03-23 11:23:27,807 Stage-1 map = 0%,  reduce = 0%

2011-03-23 11:23:30,824 Stage-1 map = 100%,  reduce = 0%

2011-03-23 11:23:33,854 Stage-1 map = 100%,  reduce = 100%

Ended Job = job_201103231022_0001

OK

row12 value3

Time taken: 11.929 seconds

hive>

 和hbase的test表对比一下,

column=data:1, timestamp=1300849056637, value=value3  

column=data:1, timestamp=1300849056637, value=value3

 OK,这样我们就可以使用SQL来对hbase进行查询了。

 以上只是在命令行里左对应的查询,我们的目的是使用JAVA代码来查询出有用的数据,其实这个也很简单,

首先,启动Hive的命令有点变化,使用如下命令:

bin/hive --service hiveserver  

./hive --service hiveserver

 这里我们默认使用嵌入的Derby数据库,这里可以在hive-site.xml文件中查看到:

<property>   <name>javax.jdo.option.ConnectionURL</name>   <value>jdbc:derby:;databaseName=metastore_db;create=true</value>//指定了数据库默认的名字和地址   
</property>   <property>   <name>javax.jdo.option.ConnectionDriverName</name>   <value>org.apache.derby.jdbc.EmbeddedDriver</value>   
</property>  <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:derby:;databaseName=metastore_db;create=true</value>//指定了数据库默认的名字和地址
</property><property><name>javax.jdo.option.ConnectionDriverName</name><value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>

 在此,数据库链接的URL可以使用默认的:jdbc:hive://localhost:10000/default

 有了上面的准备,下面我们就可以使用JAVA代码来读取数据了,如下:

Java代码

public class HiveTest extends TestCase {   private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";   private Connection con;   private boolean standAloneServer = true;   public void testSelect() throws SQLException {   Statement stmt = con.createStatement();   ResultSet res = stmt.executeQuery("select * from hbase_table_2");   boolean moreRow = res.next();   while (moreRow) {   System.out.println(res.getString(1)+","+res.getString(2));   moreRow = res.next();   }   }   @Override  protected void setUp() throws Exception {   super.setUp();   Class.forName(driverName);   con = DriverManager.getConnection(   "jdbc:hive://localhost:10000/default", "", "");   }   
}  
public class HiveTest extends TestCase {private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";private Connection con;private boolean standAloneServer = true;public void testSelect() throws SQLException {Statement stmt = con.createStatement();ResultSet res = stmt.executeQuery("select * from hbase_table_2");boolean moreRow = res.next();while (moreRow) {System.out.println(res.getString(1)+","+res.getString(2));moreRow = res.next();}}@Overrideprotected void setUp() throws Exception {super.setUp();Class.forName(driverName);con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");}}

 结果,

row1,value1   
row12,value3   
row13,value4   
row14,test  

 查看一下hbase中的结果,

ROW                          COLUMN+CELL                                                                      

 row1                        column=data:1, timestamp=1300847098583, value=value1                             

 row12                       column=data:1, timestamp=1300849056637, value=value3                             

 row13                       column=data:1, timestamp=1300850443699, value=value4                             

 row14                       column=data:1, timestamp=1300867550502, value=test

 OK,完美了,不过还是希望这样的需求少一点,毕竟Hbase产生的初衷不是为了支持结构化查询。

在hive中创建索引

create table TBL_FACT_SYMBIAN_PACKET(PROVICE_FK  INT,DATE_FK  INT,MODEL_FK  INT,COUNTRY_FK  INT,NETWORK_FK  INT,OSLAG_FK  INT,OS_FK  INT,NQ_SOFTWARE_VER  INT,SUBCOOP_FK  INT,NQ_SOFTWARE_TYPE_FK  INT,SCANTYPE_FK  INT,SCANID  STRING,NAME  STRING,SECURITY  STRING,CA_ISSUER  STRING,CA_SUBJECT  STRING,HAS_NOTE  STRING,VIRUS_NAME  STRING)partitioned BY(dt STRING) row format delimited fields terminated by '\t'STORED AS textfileload data local inpath '/home/boss/symbian_pkgs_20110529.log.hive' overwrite into table TBL_FACT_SYMBIAN_PACKET partition(dt='2011-05-29');

1 创建索引

create index index_model_fk on table TBL_FACT_SYMBIAN_PACKET(model_fk) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' WITH DEFERRED REBUILD ;

2. 更新数据

ALTER INDEX index_model_fk ON TBL_FACT_SYMBIAN_PACKET REBUILD;

3. 删除索引

drop index index_model_fk on tbl_fact_symbian_packet;

4. 查看索引

show index on tbl_fact_symbian_packet;


http://www.ppmy.cn/news/163126.html

相关文章

Java模块化概述

3 模块化 3.1 模块化概述 Java语言随着这些年的发展已经成为了一]影响深远的编程语言,无数平台,系统都采用Java语言编写。但是,伴随着发展,Java也越来越庞大,逐渐发展成为-门“臃肿” 的语言。而且,无论是运行个大型的软件系统,还是运行一一个小的程序,即使程序只需要使…

python高并发优选之FastAPI

FastAPI是一个基于Python 3.6的现代Web框架&#xff0c;它专注于高性能和易用性。FastAPI通过结合多种技术实现了出色的性能&#xff0c;包括异步编程、类型提示和自动文档生成。FastAPI基于Starlette框架&#xff0c;并且使用Pydantic库进行数据验证和转换&#xff0c;从而使R…

springboot X-Accel-Redirect 大文件下载实现

文章目录 前言一、什么是 X-Sendfile&#xff1f;二、相关请求头说明三、食用步骤总结 前言 文件下载的方式&#xff1a; nginx代理附件路径&#xff0c;直接访问。无法控制用户的权限。服务端流式读取文件内容。这个过程需要后端进程将文件读取到内存中然后再发给用户&#…

HMDB 51

HMDB 51 内容&#xff1a; 1 共51个类别&#xff0c;6849个视频。每一个类别至少包含101个视频。 2 从电影、视频网站上采集。 3 包含5大类&#xff1a; 面部动作&#xff08;微笑、大笑、咀嚼、说话&#xff09;&#xff1b; 面部与物交互动作&#xff08;吃饭、喝水、…

.md文件是什么?.md如何打开?

可能有些朋友会看到以md为结尾的文件&#xff0c;但是不知道用什么打开。下面就来说一下.md文件如何打开&#xff0c;markdown文件用什么打开。 1、首先来普及一下什么是md文件&#xff0c; md全称markdown&#xff0c;markdown也是一种标记语言。   2、md文件其实可以用常用…

md文件的打开

可能有些朋友会看到以md为结尾的文件&#xff0c;但是不知道用什么打开。推荐大家用typora。 下载 下载(免费版)&#xff1a; https://www.123pan.com/s/c8zA-wkzN3 官方网站&#xff1a; 添加链接描述 Markdown教程&#xff1a; 添加链接描述 打开md文件效果&#xff1a;

md文件的正确打开方式

常常会遇到md格式的文件&#xff0c;默认打开方式是记事本&#xff0c;但是打开后不利于阅读&#xff0c;体验很差。 直到今天才明白&#xff0c;正确打开md文件是一件多么美妙的事情&#xff01;&#xff01;&#xff01; 可以使用**Notepad**来打开&#xff0c;该软件在编程方…

MD290,MD380,MD500变频器源码

汇川三种变频器源码&#xff0c;MD290,MD380,MD500变频器源码,基于TMS320F28035。 新的SVC3算法&#xff0c;高速速度波动小&#xff0c;新的转子电阻&#xff0c;漏感辩识算法&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1sXD-QgRP2rLtGE6vn7geyw?pwd1sl3 提取码…