Tachyon的安装、配置和使用

2024-06-20 17:58
文章标签 配置 安装 使用 tachyon

本文主要是介绍Tachyon的安装、配置和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

发布人:南京大学PASA大数据实验室董乾豪

0. 前言

在上一篇博文《Tachyon简介》中,我们简要地介绍了Tachyon,一个以内存为中心的分布式文件系统,及其一些基本工作原理。这一次,我们重点介绍如何在你自己的单机或集群环境下去安装、配置和使用Tachyon。具体地,会从怎样编译源码开始,到各项配置、命令的说明,再加上API的使用举例,让大家能够一步步地把Tachyon用起来。

版本选择

Tachyon目前的最新发布版为0.5.0,最新开发版为0.6.0-SNAPSHOT。由于两者向上层提供的API有了不小的差异,这里以最新的0.6.0-SNAPSHOT开发版为基础进行介绍。它具有更多功能,更多新特性,更方便用户使用。在介绍时,我们也会标注出那些和0.5.0版本兼容的部分,让大家能够同时Hold住不同的版本。

官方资料: Tachyon-0.5.0; 最新开发版。(本文章介绍的Tachyon基于的版本是0.6.0-SNAPSHOT,2014-12-27)

1. Tachyon的安装

由于目前Tachyon使用了RamFS作为内存层,因此推荐在Linux环境下安装Tachyon。


第①步——下载&编译

对于已经发布的版本,如Tachyon-0.5.0或更早的版本,可以直接下载已经编译好的包,并解压。下载地址为https://github.com/amplab/tachyon/releases

为了更好地契合用户的本地环境,如Java版本、Hadoop版本或其他一些软件包的版本,可以下载Tachyon源码自行编译。Tachyon开源在GitHub上,可以很方便地获得其不同版本的源码:Tachyon-0.5.0;最新开发版。Tachyon项目采用Maven进行管理,因此可以采用 mvn package 命令进行编译打包。在Tachyon-0.6.0-SNAPSHOT版本中,默认依赖的java版本为1.6,默认依赖的hadoop版本为1.0.4,如果要更改这些依赖的版本号可以在编译时加入选项,如:

[plain]  view plain copy
  1. mvn clean package -Djava.version=1.7 -Dhadoop.version=2.3.0 -DskipTests  

完成这一步后,我们就得到了能够运行在用户本地环境的Tachyon,下面我们分别介绍如何在单机和分布式环境下配置和启动Tachyon。

1.1 单机安装Tachyon

这里要注意一点,Tachyon在单机(local)模式下启动时会自动挂载RamFS,所以请保证使用的账户具有sudo权限。


第②步——配置

conf/workers文件中配置需要启动TachyonWorker的节点,默认是localhost,所以在单机模式下不用更改。(在Tachyon-0.5.0版本中,该文件为conf/slaves

conf/tachyon-env.sh.template复制为conf/tachyon-env.sh,并在conf/tachyon-env.sh中修改具体配置,下面列举了一些重要的配置项,稍后会详细地介绍更多的配置项。

  • JAVA_HOME —— 系统中java的安装路径
  • TACHYON_MASTER_ADDRESS —— 启动TachyonMaster的地址,默认为localhost,所以在单机模式下不用更改
  • TACHYON_UNDERFS_ADDRESS —— Tachyon使用的底层文件系统的路径,在单机模式下可以直接使用本地文件系统,如"/tmp/tachyon",也可以使用HDFS,如"hdfs://ip:port"
  • TACHYON_WORKER_MEMORY_SIZE —— 每个TachyonWorker使用的RamFS大小

第③步——启动

完成配置后,即可以单机模式启动Tachyon,格式化、启动和停止Tachyon的命令分别为:

[plain]  view plain copy
  1. bin/tachyon format  
  2. bin/tachyon-start.sh local  
  3. bin/tachyon-stop.sh  

1.2 分布式安装Tachyon

这里我们以一个三个节点的集群为例,分别为slave201,slave202和slave203。三个节点都运行TachyonWorker,slave201运行TachyonMaster。


第②步——配置(该过程在TachyonMaster节点,即slave201上完成)

conf/workers文件中配置需要启动TachyonWorker的节点,即

[plain]  view plain copy
  1. slave201  
  2. slave202  
  3. slave203  

conf/tachyon-env.sh.template复制为conf/tachyon-env.sh,并在conf/tachyon-env.sh中修改具体配置。不同于单机模式,这里需要修改TachyonMaster地址以及底层文件系统路径

[plain]  view plain copy
  1. export TACHYON_MASTER_ADDRESS=slave201  
  2. export TACHYON_UNDERFS_ADDRESS=hdfs://slave201:9000  

完成配置文件的修改后,将整个tachyon文件夹复制到每个节点的相同路径下

[plain]  view plain copy
  1. scp –r tachyon-master slave202:/home/.../  
  2. scp –r tachyon-master slave203:/home/.../  

第③步——启动

在分布式模式下,格式化和停止Tachyon的命令仍然为:

[plain]  view plain copy
  1. bin/tachyon format  
  2. bin/tachyon-stop.sh  

但启动Tachyon有了更多的选项:

  • bin/tachyon-start.sh all Mount #在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于直接使用mount命令,所以需要用户为root
  • bin/tachyon-start.sh all SudoMount #在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于使用sudo mount命令,所以需要用户有sudo权限
  • bin/tachyon-start.sh all NoMount #认为RamFS已经挂载好,不执行挂载操作,只启动TachyonMaster和所有TachyonWorker

因此,如果不想每次启动Tachyon都挂载一次RamFS,可以先使用命令 bin/tachyon-mount.sh Mount workers 或 bin/tachyon-mount.sh SudoMount workers 挂载好所有RamFS,然后使用 bin/tachyon-start.sh all NoMount 命令启动Tachyon。


单机和分布式模式的区别就在于配置和启动步骤,事实上,也可以在分布式模式下只设置一个TachyonWorker(伪分布式),在这种情况下两者就基本一样了。


第④步——查看&测试

启动Tachyon后,可以用 jps 命令查看TachyonMaster和TachyonWorker进程是否存在


也可以在浏览器内打开Tachyon的WebUI,如 http://slave201:19999 ,查看整个Tachyon的状态,各个TachyonWorker的运行情况,各项配置信息,浏览文件系统等。




此外,还能在任一启动了TachyonWorker的节点上执行 bin/tachyon runTests 命令来测试Tachyon是否运行正常。

步骤①-④即完成了Tachyon的安装和启动,之后我们也会给出具体地如何使用Tachyon。

2. Tachyon的配置

Tachyon的可配置项远不止上面步骤②的配置文件中的那些,用户可以根据自己的需求更改Tachyon的各项配置。这里以0.6.0-SNAPSHOT版本为例,介绍Tachyon中可配置参数的具体含义。(Tachyon-0.5.0的可配置项基本上是Tachyon-0.6.0-SNAPSHOT的一个子集)

Tachyon中的可配置项分为两类,一种是系统环境变量,用于在不同脚本间共享配置信息;另一种是程序运行参数,通过-D选项传入运行Tachyon的JVM中。程序运行参数又分为通用配置(Common Configuration)、TachyonMaster配置(Master Configuration)、TachyonWorker配置(Worker Configuration)和用户配置(User Configuration)。要修改或添加这些可配置项,请修改conf/tachyon-env.sh文件。

2.1 Tachyon环境变量

  • JAVA_HOME:系统中java的安装路径
  • TACHYON_RAM_FOLDER:配置ramfs挂载的文件目录,默认为/mnt/ramdisk。
  • TACHYON_MASTER_ADDRESS:启动TachyonMaster的地址,默认为localhost,所以在单机模式下不用更改
  • TACHYON_UNDERFS_ADDRESS:Tachyon使用的底层文件系统的路径,本地文件系统(单机模式下),如"/tmp/tachyon",或HDFS,如"hdfs://ip:port"
  • TACHYON_WORKER_MEMORY_SIZE:每个TachyonWorker使用的RamFS大小,默认为1GB

2.2 通用配置

  • tachyon.underfs.address:Tachyon在底层文件系统的的路径,默认为$TACHYON_UNDERFS_ADDRESS
  • tachyon.home:Tachyon的安装路径,启动Tachyon时为当前 tachyon 文件夹的路径
  • tachyon.data.folder:Tachyon数据在底层文件系统的存放路径,默认为$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/data
  • tachyon.workers.folder:TachyonWorkers在底层文件系统的工作路径,默认为$TACHYON_UNDERFS_ADDRESS/tmp/tachyon/workers
  • tachyon.usezookeeper:TachyonMaster是否使用ZooKeeper容错,默认为false。
  • tachyon.zookeeper.adress:如果启用,ZooKeeper的地址
  • tachyon.zookeeper.election.path:如果启用,Zookeeper的election文件夹路径,默认为/election
  • tachyon.zookeeper.leader.path:如果启用,Zookeeper的leader文件夹路径,默认为/leader
  • tachyon.underfs.hdfs.impl:实现HDFS的类,默认org.apache.hadoop.hdfs,DistributedFileSystem
  • tachyon.max.columns:Tachyon中RawTable允许的最大列数,默认为1000
  • tachyon.table.metadata.byte:Tachyon中RawTable元数据允许存储的最大字节数,默认为5242880,即5MB
  • tachyon.underfs.glusterfs.impl:如果使用GlusterFS为底层文件系统,实现GlusterFS的类,默认为org.apache.hadoop.fs.glusterfs.GlusterFileSystem
  • tachyon.underfs.glusterfs.mounts:如果使用GlusterFS为底层文件系统,GlusterFS卷的挂载目录
  • tachyon.underfs.glusterfs.volumes:如果使用GlusterFS为底层文件系统,GlusterFS的卷名
  • tachyon.underfs.glusterfs.mapred.system.dir:如果使用GlusterFS为底层文件系统,GlusterFS用于存放MapReduce中间数据的可选子目录,默认为glusterfs:///mapred/system
  • tachyon.web.resources:Tachyon WebUI可用的资源,默认为$tachyon.home/core/src/main/webapp
  • tachyon.async.enabled:是否启用异步模式,默认为false
  • tachyon.underfs.hadoop.prefixes:底层使用hadoop文件系统的前缀列表,默认为"hdfs://","s3://","s3n://","glusterfs:///"
  • tachyon.test.mode:是否启用测试模式,默认为false
  • tachyon.master.retry:连接重试次数,默认为29

2.3 TachyonMaster配置

  • tachyon.master.worker.timeout.ms:TachyonMaster和TachyonWorker心跳包失效时长,默认为60000ms
  • tachyon.master.journal.folder:TachyonMaster的journal日志存放路径,默认为$TACHYON_HOME/journal/
  • tachyon.master.hostname:TachyonMaster的主机名
  • tachyon.master.port:TachyonMaster的远程调用通讯端口,默认为19998
  • tachyon.master.web.port:TachyonMaster的WebUI端口,默认为19999
  • tachyon.master.web.threads:TachyonMaster的WebUI线程数,默认为9
  • tachyon.master.whitelist:可缓存的路径前缀列表,列表以逗号隔开,表示该路径下的文件能够被缓存至内存,默认为/,即根目录
  • tachyon.master.temporary.folder:TachyonMaster的临时文件夹,默认为/tmp
  • tachyon.master.heartbeat.interval.ms:TachyonMaster心跳包间隔时间,默认为1000ms
  • tachyon.master.selector.threads:TachyonMaster的thrift监听线程数,默认为3
  • tachyon.master.queue.size.per.selector:TachyonMaster的thrift消息队列长度,默认为3000
  • tachyon.master.server.threads:TachyonMaster节点的thrift服务线程数,默认为CPU核数的2倍
  • tachyon.master.pinlist:常驻内存的文件列表,以逗号隔开,表示该路径下的文件不会从内存中剔除,默认为null

2.4 TachyonWorker配置

  • tachyon.worker.data.folder:TachyonWorker在RamFS中的工作路径,默认为$TACHYON_RAM_FOLDER/tachyonworker/
  • tachyon.work.port:TachyonWorker的远程调用通讯端口,默认为29998
  • tachyon.worker.data.port:TachyonWorker的数据传输服务的端口,默认为29999
  • tachyon.worker.memory.size:TachyonWorker所使用的RamFS大小,默认为$TACHYON_WORKER_MEMORY_SIZE
  • tachyon.worker.heartbeat.timeout.ms:TachyonWorker心跳包失效的时长,默认为10000ms
  • tachyon.worker.to.master.heartbeat.interval.ms:TachyonWorker向TachyonMaster发送心跳包的时间间隔,默认为1000ms
  • tachyon.worker.selector.threads:TachyonWorker的thrift监听线程数,默认为3
  • tachyon.worker.queue.size.per.selector:TachyonWorker的thrift消息队列长度,默认为3000
  • tachyon.worker.server.threads:TachyonWorker的thrift服务线程数,默认为CPU核数
  • tachyon.worker.user.timeout.ms:TachyonWorker和用户之间心跳包失效时长,默认为10000ms
  • tachyon.worker.checkpoint.threads:TachyonWorker的checkpoint线程数,默认为1
  • tachyon.worker.per.thread.checkpoint.cap.mb.sec:TachyonWorker的checkpoint的速度,默认为1000MB/s
  • tachyon.worker.network.type:TachyonWorker在传输文件数据时使用的传输方式,默认为NETTY,可选为NIO或NETTY

2.5 用户配置

  • tachyon.user.failed.space.request.limits:用户向文件系统请求空间失败时的最大重试次数,默认为3
  • tachyon.user.quota.unit.bytes:客用户一次向TachyonWorker请求的最少字节数,默认为8388608,即8MB
  • tachyon.user.file.buffer.byte:用户读写文件时的缓存区大小,默认为1048576,即1MB
  • tachyon.user.default.block.size.byte:用户创建文件时的默认块大小,默认为1073741824,即1GB
  • tachyon.user.remote.read.buffer.size.byte:用户读远程文件时的缓冲区大小,默认为1048576,即1MB
  • tachyon.user.heartbeat.interval.ms:用户心跳包时间间隔,默认为1000ms
  • tachyon.user.file.writetype.default:用户在使用tachyon.hadoop.TFS时的默认写类型,默认为CACHE_THROUGH

3. Tachyon的使用

受益于Tachyon良好的设计和兼用性,用户可以很方便地将现有的利用HDFS进行存储的程序移植至Tachyon。同时,Tachyon也提供了自己的命令行工具和一套完整的文件系统API,用户可以灵活地使用Tachyon。

3.1 从HDFS到Tachyon

对于现有的运行在Hadoop MapReduce或者Spark上,使用 "hdfs://ip:port/" 为存储路径的程序,能够很方便地移植至Tachyon。

3.1.1 Hadoop MapReduce

  • 将tachyon-client jar包添加至$HADOOP_CLASSPATH,jar包位于 tachyon/client/target/tachyon-client-0.6.0-SNAPSHOT-jar-with-dependencies.jar(如果是Tachyon-0.5.0,则文件名为tachyon-client-0.5.0-jar-with-dependencies.jar
  • 添加配置项<”fs.tachyon.impl”, ” tachyon.hadoop.TFS”>,可以在core-site.xml文件中添加,也可以在程序中使用Configuration.set()方法添加
  • 将原有的”hdfs://ip:port/path”路径更改为”tachyon://ip:port/path”

3.1.2 Spark

同样地,添加依赖包,添加配置项,然后更改文件系统路径。

额外地,添加配置项<”spark.tachyonStore.url”, “tachyon://ip:port/”>后,能够使用”rdd.persist(StorageLevel.OFF_HEAP)”语句将Spark RDD缓存至Tachyon中以减少Java GC的开销。

3.2 命令行工具

Tachyon提供了命令行工具为用户提供了简单的交互功能,使用方式为

[plain]  view plain copy
  1. bin/tachyon tfs [COMMAND]  

具体的命令有:

  • cat:将文件内容输出到控制台
  • count:输出符合路径前缀的文件总数
  • ls:输出目录中的文件信息
  • lsr:递归输出目录中的文件信息
  • mkdir:创建指定目录包括路径中的父目录,如果目录已经存在则创建失败
  • rm:删除文件或者目录
  • tail:将文件的最末1KB输出到控制台
  • touch:在指定的位置创建空的文件
  • mv:将文件移动到指定位置
  • copyFromLocal:将文件从本地文件系统拷贝到Tachyon文件系统指定位置
  • copyToLocal:将文件从Tachyon文件系统拷贝到本地文件系统指定位置
  • fileinfo:打印指定文件的块信息
  • pin:将指定文件常驻内存
  • unpin:将常驻内存的文件撤销常驻状态

3.3 Java API

Tachyon是用Java开发实现的,因此提供的API也是Java函数。要使用这些API需要依赖tachyon-client jar包,位于 tachyon/client/target/tachyon-client-0.6.0-SNAPSHOT-jar-with-dependencies.jar (如果是Tachyon-0.5.0,则文件名为tachyon-client-0.5.0-jar-with-dependencies.jar)此外,如果是已发布的Tachyon-0.5.0并且目标项目由Maven管理,可以在 pom.xml 文件中添加如下内容以获取依赖包:

[html]  view plain copy
  1. <dependency>  
  2.           <groupId>org.tachyonproject</groupId>  
  3.           <artifactId>tachyon-client</artifactId>  
  4.           <version>0.5.0</version>  
  5.  </dependency>  

(Tachyon-0.5.0和Tachyon-0.6.0-SNAPSHOT提供的Java API一大不同之处在于Tachyon-0.6.0-SNAPSHOT中新增了tachyon.TachyonURI类,用来表示Tachyon文件系统中的路径,类似于Hadoop中的org.apache.hadoop.fs.Path。Tachyon-0.5.0中的大部分API在Tachyon-0.6.0-SNAPSHOT中仍然存在,但被标记为@Deprecated

Tachyon的Java API功能大部分集中于tachyon.client.TachyonFStachyon.client.TachyonFile两个类中

3.3.1 TachyonFS

[java]  view plain copy
  1. //获取TachyonFS对象  
  2. public static TachyonFS get(String tachyonPath) throws IOException  
  3. public static TachyonFS get(final TachyonURI tachyonURI) throws IOException  
  4. public static TachyonFS get(String masterHost, int masterPor boolean zookeeperMode) throws IOException  
  5.   
  6. //创建Tachyon文件  
  7. public int createFile(String path) throws IOException  
  8. public int createFile(TachyonURI path, TachyonURI ufsPath, long blockSizeByte,boolean recursive) throws IOException  
  9.   
  10. //删除Tachyon文件     
  11. public boolean delete(String path,boolean recursive) throws IOException  
  12. public boolean delete(int fileId, TachyonURI path, boolean recursive) throws IOException  
  13.   
  14. //判断文件是否存在  
  15. public boolean exist(TachyonURI path) throws IOException  
  16.   
  17. //获取TachyonFile对象  
  18. public TachyonFile getFile(int fid) throws IOException  
  19. public TachyonFile getFile(int fid,boolean useCachedMetadata) throws IOException  
  20. public TachyonFile getFile(String path) throws IOException  
  21. public TachyonFile getFile(TachyonURI path) throws IOException  
  22. public TachyonFile getFile(String path,boolean useCachedMetadata) throws IOException  
  23. public TachyonFile getFile(TachyonURI path, boolean useCachedMetadata) throws IOException  
  24.   
  25. //判断文件是否为目录  
  26. boolean isDirectory(int fid)  
  27.   
  28. //获取文件状态信息  
  29. public ClientFileInfo getFileStatus(int fileId, TachyonURI path) throws IOException  
  30. public ClientFileInfo getFileStatus(int fileId, boolean useCachedMetadata) throws IOException  
  31. public ClientFileInfo getFileStatus(int fileId, TachyonURI path,boolean useCachedMetadata) throws IOException  
  32.   
  33. //列出指定目录下的文件信息,如果是文件则列出该文件的文件信息  
  34. public List<ClientFileInfo> listStatus(TachyonURI path) throws IOException              
  35.   
  36. //创建指定的目录  
  37. public boolean mkdirs(TachyonURI path, boolean recursive) throws IOException           
  38.   
  39. //重命名文件  
  40. public boolean rename(int fileId, TachyonURI srcPath, TachyonURI dstPath) throws IOException  
  41.   
  42. //设置文件是否常驻内存  
  43. public void setPinned(int fid,boolean pinned) throws IOException  
  44.   
  45. //设置文件常驻内存  
  46. public void pinFile(int fid) throws IOException  
  47.   
  48. //取消文件常驻内存状态  
  49. public void unpinFile(int fid) throws IOException  
  50.   
  51. //判断文件是否常驻内存  
  52. public boolean isPinned(int fid,boolean useCachedMetadata) throws IOException  

3.3.2 TachyonFile

[java]  view plain copy
  1. //获取TachyonFile的输入流,ReadType的类型为CACHE或NO_CACHE  
  2. public InStream getInStream(ReadType readType) throws IOException  
  3.   
  4. //获取TachyonFile的输出流,WriteType的类型为MUST_CACHE,TRY_CACHE,CACHE_THROUGH,THROUGH或ASYNC_THROUGH  
  5. public OutStream getOutStream(WriteType writeType) throws IOException  
  6.   
  7. //获取文件的路径  
  8. public String getPath()  
  9.   
  10. //获取底层文件系统的配置  
  11. public Object getUFSConf()  
  12.   
  13. //判断文件是否完整  
  14. public boolean isComplete() throws IOException  
  15.   
  16. //判断是否为目录  
  17. public boolean isDirectory()  
  18.   
  19. //判断是否为文件  
  20. public boolean isFile()  
  21.   
  22. //判断文件是否全在内存  
  23. public boolean isInMemory() throws IOException  
  24.   
  25. //获取文件的长度  
  26. public long length() throws IOException  
  27.   
  28. //判断文件是否常驻内存  
  29. public boolean needPin()  
  30.   
  31. //重命名文件  
  32. public boolean rename(TachyonURI path) throws IOException  
  33.   
  34. //设置底层文件系统的配置  
  35. public void setUFSConf(Object conf)  
  36.   
  37. //获取文件的创建时间  
  38. public long getCreationTimeMs()  
  39.   
  40. //获取对应块所属的文件名  
  41. public String getLocalFilename(int blockIndex) throws IOException  
  42.   
  43. //获取文件所在的主机集合  
  44. public List<String> getLocationHosts() throws IOException  
  45.   
  46. //获取文件的块数  
  47. public int getNumberOfBlocks() throws IOException  

3.3.3 Tachyon Java API使用Demo

这个Demo使用了上面介绍的Java API实现简单的Tachyon文件读写操作。

[java]  view plain copy
  1. <pre name="code" class="java">import java.io.IOException;  
  2.   
  3. import tachyon.TachyonURI;  
  4. import tachyon.client.FileOutStream;  
  5. import tachyon.client.InStream;  
  6. import tachyon.client.OutStream;  
  7. import tachyon.client.ReadType;  
  8. import tachyon.client.TachyonFS;  
  9. import tachyon.client.TachyonFile;  
  10. import tachyon.client.WriteType;  
  11. import tachyon.util.CommonUtils;  
  12.   
  13. /* 
  14. * 
  15. *   将0~9的数字写到tachyon文件/tmp/test,然后将写入的文件内容读出到控制台。 
  16. * 
  17. */  
  18. public class test {  
  19.     public final TachyonURI masteruri = new TachyonURI("tachyon://slave201:19998");  
  20.     public final TachyonURI filepath = new TachyonURI("/tmp/test");  
  21.     public WriteType writeType = WriteType.CACHE_THROUGH;  
  22.     public ReadType readType = ReadType.CACHE;  
  23.   
  24.     public static void writeFile() throws IOException  
  25.     {  
  26.         TachyonFS tachyonClient = TachyonFS.get(masteruri);  
  27.         if(tachyonClient.exist(filepath)) {  
  28.             tachyonClient.delete(filepath, true);  
  29.         }  
  30.         tachyonClient.createFile(filepath);  
  31.         TachyonFile file = tachyonClient.getFile(filepath);  
  32.         FileOutStream os = (FileOutStream) file.getOutStream(writeType);  
  33.         for(int i = 0; i < 10; i ++)  
  34.         {  
  35.             os.write(Integer.toString(i).getBytes());  
  36.         }  
  37.         os.close();  
  38.         tachyonClient.close();  
  39.     }  
  40.   
  41.     public static void readFile() throws IOException  
  42.     {  
  43.         TachyonFS tachyonClient = TachyonFS.get(masteruri);  
  44.         TachyonFile file = tachyonClient.getFile(filepath);  
  45.         InStream in = file.getInStream(readType);  
  46.         byte[] bytes = new byte[20];  
  47.         in.read(bytes);  
  48.         System.out.println(new String(bytes));  
  49.         in.close();  
  50.         tachyonClient.close();  
  51.     }  
  52.       
  53.     public static void main(String[] args) throws IOException  
  54.     {  
  55.         writeFile();  
  56.         readFile();  
  57.     }  
  58. }  
 

执行后在Tachyon的WebUI上可以查看测试文件的信息,文件内容为预期的字符串"0123456789"


这篇关于Tachyon的安装、配置和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078851

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd