精华内容
下载资源
问答
  • 怎样对数据库进行优化

    千次阅读 2009-07-07 09:45:00
    ●查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度...

     ●查询速度慢的原因很多,常见如下几种:
    1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
    2、I/O吞吐量小,形成了瓶颈效应。
    3、没有创建计算列导致查询不优化。
    4、内存不足
    5、网络速度慢
    6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
    7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
    8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
    9、返回了不必要的行和列
    10、查询语句不好,没有优化 ●可以通过如下方法来优化查询 :
    1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
    2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
    3、升级硬件
    4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
    5、提高网速;
    6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。
    7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT,DELETE还不能并行处理。
    8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。
    9、DB Server 和APPLication Server 分离;OLTP和OLAP分离
    10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图')
      a、在实现分区视图之前,必须先水平分区表
      b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
    11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。 在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:
      1、 查询语句的词法、语法检查
      2、 将语句提交给DBMS的查询优化器
      3、 优化器做代数优化和存取路径的优化
      4、 由预编译模块生成查询规划
      5、 然后在合适的时间提交给系统处理执行
      6、 最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
    12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。
    13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
    14、SQL的注释申明对执行没有任何影响
    15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。 选择这个并发选项OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 SELECT 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。
    16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
    17、注意UNion和UNion all 的区别。UNION all好
    18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
    19、查询时不要返回不需要的行、列
    20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。SET LOCKTIME设置锁的时间
    21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
    22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在WHere字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代.还可以变通写法:WHERE SUBSTRING(firstname,1,1) = 'm'改为WHERE firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,“NOT", "NOT EXISTS", "NOT IN"能优化她,而”<>”等还是不能优化,用不到索引。
    23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
    24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN (‘男’,‘女’)
    25、将需要查询的结果预先计算好放在表中,查询的时候再SELECT。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
    26、MIN() 和 MAX()能使用到合适的索引。
    27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程序质量高,并且执行的速度快。
    28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
    29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。
    30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表一样。
    31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。
    32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
    33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
    34、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNION ALL一样的道理。 SELECT top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345','JCNAD00333138','JCNAD00303570', 'JCNAD00303569','JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933','JCNAD00254567', 'JCNAD00254585','JCNAD00254608','JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618', 'JCNAD00279196','JCNAD00268613') order by postdate desc
    35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
    36、当用SELECT INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume where name = 'XYZ' --commit 在另一个连接中SELECT * from sysobjects可以看到 SELECT INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它!!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。
    37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
    38、一次更新多条记录比分多次更新每次一条快,就是说批处理好
    39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好
    40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:
      a、计算字段的表达是确定的
      b、不能用在TEXT,Ntext,Image数据类型
      c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….
    41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源,如果返回大的结果采用存储过程
    42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快
    43、SELECT COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count(Field of null) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的!!!
    44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。
    45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现
    46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。 Process:
      1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间 百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。
      2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。
      3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。 特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。  
      4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。
    47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。
    48、查询的关联同写的顺序 select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = ‘号码’) select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = ‘号码’, A = ‘号码’) select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = ‘号码’, A = ‘号码’)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gaochuan1983/archive/2009/07/07/4326999.aspx

    展开全文
  • 近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。  目前已经使用基于内存计算的分布式计算框架有:Sp

    1 Tachyon介绍

    1.1 Tachyon简介

    随着实时计算的需求日益增多,分布式内存计算也持续升温,怎样将海量数据近乎实时地处理,或者说怎样把离线批处理的速度再提升到一个新的高度是当前研究的重点。近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。 
    目前已经使用基于内存计算的分布式计算框架有:Spark、Impala及SAP的HANA等。但是其中不乏一些还是有文件落地磁盘的操作,如果能让这些落地磁盘的操作全部落地到一个共享的内存中,那么这些基于内存的计算框架的效率会更高。 
    Tachyon是AmpLab的李浩源所开发的一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在Tachyon里的文件。Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件落地到分布式内存文件系统中来达到共享内存,从而提高效率。同时可以减少内存冗余、GC时间等,Tachyon的在大数据中层次关系如下图所示: 
    这里写图片描述

    Tachyon允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和 MapReduce那样。通过利用信息继承、内存侵入,Tachyon获得了高性能。Tachyon工作集文件缓存在内存中,并且让不同的 Jobs/Queries以及框架都能以内存的速度来访问缓存文件。因此,Tachyon可以减少那些需要经常使用数据集通过访问磁盘来获得的次数。

    1.2 Tachyon系统架构

    1.2.1 系统架构

    Tachyon在Spark平台的部署:总的来说,Tachyon有三个主要的部件:Master, Client,与Worker。在每个Spark Worker节点上,都部署了一个Tachyon Worker,Spark Worker通过Tachyon Client访问Tachyon进行数据读写。所有的Tachyon Worker都被Tachyon Master所管理,Tachyon Master通过Tachyon Worker定时发出的心跳来判断Worker是否已经崩溃以及每个Worker剩余的内存空间量。 
    这里写图片描述

    1.2.2 Tachyon Master结构

    Tachyon Master的结构其主要功能如下:首先,Tachyon Master是个主管理器,处理从各个Client发出的请求,这一系列的工作由Service Handler来完成。这些请求包括:获取Worker的信息,读取File的Block信息, 创建File等等;其次,Tachyon Master是个Name Node,存放着所有文件的信息,每个文件的信息都被封装成一个Inode,每个Inode都记录着属于这个文件的所有Block信息。在Tachyon中,Block是文件系统存储的最小单位,假设每个Block是256MB,如果有一个文件的大小是1GB,那么这个文件会被切为4个Block。每个Block可能存在多个副本,被存储在多个Tachyon Worker中,因此Master里面也必须记录每个Block被存储的Worker地址;第三,Tachyon Master同时管理着所有的Worker,Worker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是通过Master Worker Info去记录每个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。 
    这里写图片描述

    1.2.3 Tachyon Worker结构

    Tachyon Worker主要负责存储管理:首先,Tachyon Worker的Service Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的内存文件系统)以及Under File System(Tachyon以下的磁盘文件系统,比如HDFS)。第三,Tachyon Worker还有个Data Server以便处理其他的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,如果没有找到则会尝试去其他的Tachyon Worker的内存存储中进行查找。如果数据完全不在Tachyon里,则需要通过Under File System的接口去磁盘文件系统(HDFS)中读取。 
    这里写图片描述

    1.2.4 Tachyon Client结构

    Tachyon Client主要功能是向用户抽象一个文件系统接口以屏蔽掉底层实现细节。首先,Tachyon Client会通过Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查询某个文件的某个Block在哪里。Tachyon Client也会通过Worker Client部件跟Tachyon Worker交互, 比如向某个Tachyon Worker请求存储空间。在Tachyon Client实现中最主要的是Tachyon File这个部件。在Tachyon File下实现了Block Out Stream,其主要用于写本地内存文件;实现了Block In Stream主要负责读内存文件。在Block In Stream内包含了两个不同的实现:Local Block In Stream主要是用来读本地的内存文件,而Remote Block In Stream主要是读非本地的内存文件。请注意,非本地可以是在其它的Tachyon Worker的内存文件里,也可以是在Under File System的文件里。
    这里写图片描述

    1.2.5 场景说明

    现在我们通过一个简单的场景把各个部件都串起来:假设一个Spark作业发起了一个读请求,它首先会通过Tachyon Client去Tachyon Master查询所需要的Block所在的位置。如果所在的Block不在本地的Tachyon Worker里,此Client则会通过Remote Block In Stream向别的Tachyon Worker发出读请求,同时在Block读入的过程中,Client也会通过Block Out Stream把Block写入到本地的内存存储里,这样就可以保证下次同样的请求可以由本机完成。

    1.3 HDFS与Tachyon

    HDFS(Hadoop Distributed File System)是一个分布式文件系统。HDFS具有高容错性(fault-tolerant)特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,这样可以实现以流的形式访问(streaming access)文件系统中的数据。 
    HDFS采用Master/Slave架构。HDFS集群是由一个Namenode和一定数目的Datanode组成的。Namenode是一台中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在Namenode的统一调度下对数据块进行创建、删除和复制。 
    HDFS架构示意图如下图所示。

    这里写图片描述

    Namenode和Datanode被设计成可以在普通的商用机器上运行,这些机器一般运行着GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其他机器则分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。 
    集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样用户数据永远不会流过Namenode。 
    对比HDFS和Tachyon,首先从两者的存储结构来看,HDFS设计为用来存储海量文件的分布式系统,Tachyon设计为用来缓存常用数据的分布式内存文件系统。从这点来看,Tachyon可以认为是操作系统层面上的Cache,HDFS可以认为是磁盘。 
    在可靠性方面,HDFS采用副本技术来保证出现系统宕机等意外情况时文件访问的一致性以及可靠性;而Tachyon是依赖于底层文件系统的可靠性来实现自身文件的可靠性的。由于相对于磁盘资源来说,内存是非常宝贵的,所以Tachyon通过在其underfs(一般使用HDFS)上写入CheckPoint日志信息来实现对文件系统的可恢复性。 
    从文件的读取以及写入方式来看,Tachyon可以更好地利用本地模式来读取文件信息,当文件读取客户端和文件所在的Worker位于一台机器上时,客户端会直接绕过Worker直接读取对应的物理文件,减少了本机的数据交互。而HDFS在遇到这样的情况时,会通过本地Socket进行数据交换,这也会有一定的系统资源开销。在写入文件时,HDFS只能写入磁盘,而Tachyon却提供了5种数据写入模式用以满足不同需求。

    2 Tachyon编译部署

    Tachyon目前的最新发布版为0.7.1,其官方网址为http://tachyon-project.org/。Tachyon文件系统有3种部署方式:单机模式、集群模式和高可用集群模式,集群模式相比于高可用集群模式区别在于多Master节点。下面将介绍单机和集群环境下去安装、配置和使用Tachyon。

    2.1 编译Tachyon

    2.1.1 下载并上传源代码

    第一步 下载到Tachyon源代码: 
    对于已经发布的版本可以直接从github下载Tachyon编译好的安装包并解压,由于Tachyon与Spark版本有对应关系,另外该系列搭建环境为Spark1.1.0,对应下载Tachyon0.5.0,版本对应参考http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html描述:

    这里写图片描述

    下载地址为https://github.com/amplab/tachyon/releases ,为以下演示我们在这里下载的是tachyon-0.5.0.tar.gz源代码包,文件大小为831K,如下图所示:

    这里写图片描述

    第二步 在主节点上解压缩

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /home/hadoop/upload<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">/</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$tar</span> <span class="hljs-attribute" style="box-sizing: border-box;">-xzf</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>tar<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>gz</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第三步 把tachyon-0.5.0.tar.gz改名并移动到/app/complied目录下

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mv</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /app/complied</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.1.2 编译代码

    为了更好地契合用户的本地环境,如Java版本、Hadoop版本或其他一些软件包的版本,可以下载Tachyon源码自行编译。Tachyon开源在GitHub上,可以很方便地获得其不同版本的源码。Tachyon项目采用Maven进行管理,因此可以采用 mvn package 命令进行编译打包。编译Tachyon源代码的时候,需要从网上下载依赖包,所以整个编译过程机器必须保证在联网状态。编译执行如下脚本:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$export</span> MAVEN_OPTS<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mvn</span> clean package <span class="hljs-attribute" style="box-sizing: border-box;">-Djava</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>version<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span> <span class="hljs-attribute" style="box-sizing: border-box;">-Dhadoop</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>version<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> <span class="hljs-attribute" style="box-sizing: border-box;">-DskipTests</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    整个编译过程编译了约3个任务,整个过程耗时大约4分钟。 
    这里写图片描述

    使用如下命令查看编译后该Tachyon项目大小为72M

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> 
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$du</span> <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    完成这一步后,我们就得到了能够运行在用户本地环境的Tachyon,下面我们分别介绍如何在单机和分布式环境下配置和启动Tachyon,在进行部署之前先把编译好的文件复制到/app/hadoop下并把文件夹命名为Tachyon-0.5.0:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> <span class="hljs-attribute" style="box-sizing: border-box;">-r</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /app/hadoop</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    2.2 单机部署Tachyon

    这里要注意一点,Tachyon在单机(local)模式下启动时会自动挂载RamFS,所以请保证使用的账户具有sudo权限。 
    【注】编译好的Tachyon将本系列附属资源/install中提供,具体名称为10.tachyon-0.5.0-hadoop2.2.0-complied.zip

    2.2.1 配置Tachyon

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,在workers文件中配置需要启动TachyonWorker的节点,默认是localhost,所以在单机模式下不用更改(在Tachyon-0.5.0版本中,该文件为slaves)。在这里需要修改tachyon-env.sh配置文件,具体操作是将tachyon-env.sh.template复制为tachyon-env.sh:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh.template tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh 
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

    这里写图片描述

    并在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大小

    这里写图片描述

    2.2.2 格式化Tachyon

    完成配置后即可以单机模式启动Tachyon,启动前需要格式化存储文件,格式化和启动Tachyon的命令分别为:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">format</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    存储文件为$TACHYON_HOME/underfs/tmp/tachyon目录下

    2.2.3 启动Tachyon

    使用如下命令启动Tachyon,可以看到在/nmt/ramdisk目录下格式化RamFS

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin 
    $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">local</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.2.4 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    这里写图片描述

    查看Tachyon监控页面,访问地址为http://hadoop1:19999

    这里写图片描述

    2.2.5 停止Tachyon

    停止Tachyon的命令为:

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>/bin 
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon-stop.sh  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3 集群模式部署Tachyon

    2.3.1 集群环境

    集群包含三个节点(该集群环境可以参考第二课《2.Spark编译与部署(上)–基础环境搭建》进行搭建),运行进程分布如下: 
    这里写图片描述

    2.3.2 配置conf/worker

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,对slaves文件中配置需要启动TachyonWorker的节点,在这里需要设置hadoop1、hadoop2和hadoop3三个节点:

    <code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> slaves </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.3 配置conf/tachyon-env.sh

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

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh.template tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh 
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    在该文件中修改一下两个参数,这里使用底层文件系统为HDFS:

    <code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">export</span> TACHYON_MASTER_ADDRESS=hadoop1
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">export</span> TACHYON_UNDERFS_ADDRESS=hdfs:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:9000</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.4 向各个节点分发Tachyon

    使用如下命令把hadoop文件夹复制到hadoop2和hadoop3机器

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$scp</span> -r tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span> hadoop<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@hadoop2</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:/app/hadoop/</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$scp</span> -r tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span> hadoop<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@hadoop3</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:/app/hadoop/</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    2.3.5 启动HDFS

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-dfs.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.6 格式化Tachyon

    启动前需要格式化存储文件,格式化命令为:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">format</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    可以看到在HDFS的/tmp创建了tachyon文件夹

    这里写图片描述

    2.3.7 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">all</span> SudoMount</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    启动Tachyon有了更多的选项:

    • ./tachyon-start.sh all Mount 在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于直接使用mount命令,所以需要用户为root;
    • ./tachyon-start.sh all SudoMount在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于使用sudo mount命令,所以需要用户有sudo权限;
    • ./tachyon-start.sh all NoMount 认为RamFS已经挂载好,不执行挂载操作,只启动TachyonMaster和所有TachyonWorker 
      因此,如果不想每次启动Tachyon都挂载一次RamFS,可以先使用命令./tachyon-mount.sh Mount workers 或./tachyon-mount.sh SudoMount workers 挂载好所有RamFS,然后使用./tachyon-start.sh all NoMount 命令启动Tachyon。 
      单机和集群式模式的区别就在于节点配置和启动步骤,事实上,也可以在集群模式下只设置一个TachyonWorker,此时就成为伪分布模式。

    2.3.8 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    这里写图片描述

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

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon runTests</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    2.4 Tachyon的配置

    这里以0.5.0版本为例,介绍Tachyon中可配置参数的具体含义。Tachyon中的可配置项分为两类,一种是系统环境变量,用于在不同脚本间共享配置信息;另一种是程序运行参数,通过-D选项传入运行Tachyon的JVM中。程序运行参数又分为:

    • 通用配置(Common Configuration)
    • TachyonMaster配置(Master Configuration)
    • TachyonWorker配置(Worker Configuration)
    • 用户配置(User Configuration)

    要修改或添加这些可配置项,可修改conf/tachyon-env.sh文件。

    2.4.1 Tachyon环境变量

    这里写图片描述

    2.4.2 Tachyon通用配置

    这里写图片描述

    这里写图片描述

    2.4.3 TachyonMaster配置

    这里写图片描述

    这里写图片描述

    2.4.4 TachyonWorker配置

    这里写图片描述

    这里写图片描述

    2.4.5 用户配置

    这里写图片描述

    3 Tachyon命令行使用

    Tachyon的命令行界面让用户可以对文件系统进行基本的操作。调用命令行工具使用以下脚本:

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    文件系统访问的路径格式如下:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">tachyon://<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">master</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">node</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">address</span>></span>:<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">master</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">node</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>></span>/<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">path</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    在Tachyon命令行使用中tachyon://:前缀可以省略,该信息从配置文件中读取。

    3.1 接口说明

    可以通过如下命令查看Tachyon所有接口命令

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs -<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">help</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    其中大部分的命令含义可以参考Linux下同名命令,命令含义:

    这里写图片描述

    这里写图片描述

    3.2 接口操作示例

    在操作之前需要把$TACHYON_HOME/bin配置到/etc/profile 配置文件的PATH中,并通过source /etc/profile生效

    这里写图片描述

    3.2.1 copyFromLocal

    将本地$TACHYON_HOME/conf目录拷贝到Tachyon文件系统的根目录下的conf子目录

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyFromLocal ../conf /conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /conf</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    3.2.2 copyToLocal

    把Tachyon文件系统文件复制到本地,需要注意的是命令中的src必须是Tachyon文件系统中的文件不支持目录拷贝,否则报错无法复制

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mkdir</span> -p /home/hadoop/upload/class10/conflocal
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyToLocal /conf /home/hadoop/upload/class10/conflocal
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyToLocal /conf/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh /home/hadoop/upload/class10/conflocal/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /home/hadoop/upload/class10/conflocal</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

    这里写图片描述

    3.2.3 ls和lsr

    使用ls和lsr命令查看Tachyon文件系统下的文件信息,其中lsr命令可以递归地查看子目录。

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> tachyon:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:19998/conf</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    3.2.4 count

    统计当前路径下的目录、文件信息,包括文件数、目录树以及总的大小

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs count /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    3.2.5 cat

    查看指定文件的内容

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs cat /conf/slaves
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs cat <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">tachyon:</span>/<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/hadoop1:19998/conf</span><span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/slaves</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    3.2.6 mkdir、rm、rmr和touch

    (1) mkdir:创建目录,支持自动创建不存在的父目录; 
    (2) rm:删除文件,不能删除目录,注意,递归删除根目录是无效的 
    (3) rmr:删除目录,支持递归,包含子目录和文件,其中0.5.0版本不提供该命令 
    (4) touch:创建文件,不能创建已经存在的文件。

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs mkdir /mydir
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs touch /mydir/my.txt
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /mydir
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir/my.txt</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs touch /mydir2/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/my.txt
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /mydir2
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir2
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

    这里写图片描述

    3.2.7 pin和unpin

    pin命令将指定的路径常驻在内存中,如果指定的是一个文件夹会递归地包含所有文件以及任何在这个文件夹中新创建的文件。unpin命令撤销指定路径的常驻内存状态。

    这里写图片描述

    pin执行前或unpin执行后的Web Interface界面

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs pin /conf/log4j.properties</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs unpin /conf/log4j.properties</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    4 Tachyon实战应用

    4.1 配置及启动环境

    4.1.1 修改spark-env.sh

    修改$SPARK_HOME/conf目录下spark-env.sh文件:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> spark-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    在该配置文件中添加如下内容:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">export SPARK_CLASSPATH<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span>/app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/client/target/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-client</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-jar</span><span class="hljs-attribute" style="box-sizing: border-box;">-with</span><span class="hljs-attribute" style="box-sizing: border-box;">-dependencies</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar:<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$SPARK_CLASSPATH</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    4.1.2 启动HDFS

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-dfs.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.1.3 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">all</span> SudoMount</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.2 Tachyon上运行Spark

    4.2.1 添加core-site.xml

    在Tachyon的官方文档说Hadoop1.X集群需要添加该配置文件(参见http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html),实际在Hadoop2.2.0集群测试的过程中发现也需要添加如下配置文件,否则无法识别以tachyon://开头的文件系统,具体操作是在$SPARK_HOME/conf目录下创建core-site.xml文件

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$touch</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span>
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    在该配置文件中添加如下内容:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">configuration</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span>
        <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>
        <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFS<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">configuration</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

    这里写图片描述 
    4.2.2 启动Spark集群

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin 
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-all.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.2.3 读取文件并保存

    第一步 准备测试数据文件 
    使用Tachyon命令行准备测试数据文件

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyFromLocal ../conf/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh /tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述 
    第二步 启动Spark-Shell

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/spark-shell</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第三步 对测试数据文件进行计数并另存 
    对前面放入到Tachyon文件系统的文件进行计数

    <code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">scala>val s = sc<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.textFile</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tachyon://hadoop1:19998/tachyon-env.sh"</span>)
    scala>s<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.count</span>()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    这里写图片描述

    把前面的测试文件另存为tachyon-env-bak.sh文件

    <code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">scala>s<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.saveAsTextFile</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tachyon://hadoop1:19998/tachyon-env-bak.sh"</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    这里写图片描述

    第四步 在Tachyon的UI界面查看 
    可以查看到该文件在Tachyon文件系统中保存成tahyon-env-bak.sh文件夹 
    这里写图片描述

    该文件夹中包含两个文件,分别为part-00000和part-00001: 
    这里写图片描述

    其中tahyon-env-bak.sh/part-0001文件中内容如下: 
    这里写图片描述

    另外通过内存存在文件的监控页面可以观测到,这几个操作文件在内存中: 
    这里写图片描述

    4.3 Tachyon运行MapReduce

    4.3.1 修改core-site.xml

    该配置文件为$Hadoop_HOME/conf目录下的core-site.xml文件

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/etc/hadoop
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    修改core-site.xml文件配置,添加如下配置项:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFS<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon-ft.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>
      <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFSFT<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

    这里写图片描述

    4.3.2 启动YARN

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-yarn.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.3.3 运行MapReduce例子

    第一步 创建结果保存目录

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/bin
    <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/hadoop fs -mkdir /class1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第二步 运行MapReduce例子

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin
    $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/hadoop jar <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">..</span>/share/hadoop/mapreduce/hadoop<span class="hljs-attribute" style="box-sizing: border-box;">-mapreduce</span><span class="hljs-attribute" style="box-sizing: border-box;">-examples</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar wordcount <span class="hljs-attribute" style="box-sizing: border-box;">-libjars</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$TACHYON_HOME</span>/client/target/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-client</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-jar</span><span class="hljs-attribute" style="box-sizing: border-box;">-with</span><span class="hljs-attribute" style="box-sizing: border-box;">-dependencies</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar  tachyon:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:19998/tachyon-env.sh hdfs://hadoop1:9000/class10/output</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    这里写图片描述

    第三步 查看结果 
    查看HDFS,可以看到在/class10中创建了output目录 
    这里写图片描述

    查看part-r-0000文件内容,为tachyon-env.sh单词计数 
    这里写图片描述

    5 参考资料

    (1) 《Tachyon:Spark生态系统中的分布式内存文件系统》 http://www.csdn.net/article/2015-06-25/2825056 
    (2) 《Tachyon的安装、配置和使用》 http://blog.csdn.net/u014252240/article/details/42238081 
    (3) Tachyon官方网站http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html


    本文转自这里

    展开全文
  • 近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。 目前已经使用基于内存计算的分布式计算框架有:Spark、I

    1、Tachyon介绍

    1.1 Tachyon简介

    随着实时计算的需求日益增多,分布式内存计算也持续升温,怎样将海量数据近乎实时地处理,或者说怎样把离线批处理的速度再提升到一个新的高度是当前研究的重点。近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。

    目前已经使用基于内存计算的分布式计算框架有:Spark、Impala及SAP的HANA等。但是其中不乏一些还是有文件落地磁盘的操作,如果能让这些落地磁盘的操作全部落地到一个共享的内存中,那么这些基于内存的计算框架的效率会更高。

    Tachyon是AmpLab的李浩源所开发的一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在Tachyon里的文件。Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件落地到分布式内存文件系统中来达到共享内存,从而提高效率。同时可以减少内存冗余、GC时间等,Tachyon的在大数据中层次关系如下图所示:

    clip_image002

     Tachyon允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和 MapReduce那样。通过利用信息继承、内存侵入,Tachyon获得了高性能。Tachyon工作集文件缓存在内存中,并且让不同的 Jobs/Queries以及框架都能以内存的速度来访问缓存文件。因此,Tachyon可以减少那些需要经常使用数据集通过访问磁盘来获得的次数。

    1.2 Tachyon系统架构

    1.2.1 系统架构

    Tachyon在Spark平台的部署:总的来说,Tachyon有三个主要的部件:Master, Client,与Worker。在每个Spark Worker节点上,都部署了一个Tachyon Worker,Spark Worker通过Tachyon Client访问Tachyon进行数据读写。所有的Tachyon Worker都被Tachyon Master所管理,Tachyon Master通过Tachyon Worker定时发出的心跳来判断Worker是否已经崩溃以及每个Worker剩余的内存空间量。

    clip_image004

    1.2.2 Tachyon Master结构

    Tachyon Master的结构其主要功能如下:首先,Tachyon Master是个主管理器,处理从各个Client发出的请求,这一系列的工作由Service Handler来完成。这些请求包括:获取Worker的信息,读取File的Block信息,创建File等等;其次,Tachyon Master是个Name Node,存放着所有文件的信息,每个文件的信息都被封装成一个Inode,每个Inode都记录着属于这个文件的所有Block信息。在Tachyon中,Block是文件系统存储的最小单位,假设每个Block是256MB,如果有一个文件的大小是1GB,那么这个文件会被切为4个Block。每个Block可能存在多个副本,被存储在多个Tachyon Worker中,因此Master里面也必须记录每个Block被存储的Worker地址;第三,Tachyon Master同时管理着所有的Worker,Worker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是通过Master Worker Info去记录每个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。

    clip_image006

    1.2.3 Tachyon Worker结构

    Tachyon Worker主要负责存储管理:首先,Tachyon Worker的Service Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的内存文件系统)以及Under File System(Tachyon以下的磁盘文件系统,比如HDFS)。第三,Tachyon Worker还有个Data Server以便处理其他的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,如果没有找到则会尝试去其他的Tachyon Worker的内存存储中进行查找。如果数据完全不在Tachyon里,则需要通过Under File System的接口去磁盘文件系统(HDFS)中读取。

    clip_image008

    1.2.4 Tachyon Client结构

    Tachyon Client主要功能是向用户抽象一个文件系统接口以屏蔽掉底层实现细节。首先,Tachyon Client会通过Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查询某个文件的某个Block在哪里。Tachyon Client也会通过Worker Client部件跟Tachyon Worker交互, 比如向某个Tachyon Worker请求存储空间。在Tachyon Client实现中最主要的是Tachyon File这个部件。在Tachyon File下实现了Block Out Stream,其主要用于写本地内存文件;实现了Block In Stream主要负责读内存文件。在Block In Stream内包含了两个不同的实现:Local Block In Stream主要是用来读本地的内存文件,而Remote Block In Stream主要是读非本地的内存文件。请注意,非本地可以是在其它的Tachyon Worker的内存文件里,也可以是在Under File System的文件里。

    clip_image010

    1.2.5 场景说明

    现在我们通过一个简单的场景把各个部件都串起来:假设一个Spark作业发起了一个读请求,它首先会通过Tachyon Client去Tachyon Master查询所需要的Block所在的位置。如果所在的Block不在本地的Tachyon Worker里,此Client则会通过Remote Block In Stream向别的Tachyon Worker发出读请求,同时在Block读入的过程中,Client也会通过Block Out Stream把Block写入到本地的内存存储里,这样就可以保证下次同样的请求可以由本机完成。

    1.3 HDFS与Tachyon

    HDFS(Hadoop Distributed File System)是一个分布式文件系统。HDFS具有高容错性(fault-tolerant)特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,这样可以实现以流的形式访问(streaming access)文件系统中的数据。

    HDFS采用Master/Slave架构。HDFS集群是由一个Namenode和一定数目的Datanode组成的。Namenode是一台中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在Namenode的统一调度下对数据块进行创建、删除和复制。

    HDFS架构示意图如下图所示。

    clip_image012

    Namenode和Datanode被设计成可以在普通的商用机器上运行,这些机器一般运行着GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其他机器则分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。

    集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样用户数据永远不会流过Namenode。

    对比HDFS和Tachyon,首先从两者的存储结构来看,HDFS设计为用来存储海量文件的分布式系统,Tachyon设计为用来缓存常用数据的分布式内存文件系统。从这点来看,Tachyon可以认为是操作系统层面上的Cache,HDFS可以认为是磁盘。

    在可靠性方面,HDFS采用副本技术来保证出现系统宕机等意外情况时文件访问的一致性以及可靠性;而Tachyon是依赖于底层文件系统的可靠性来实现自身文件的可靠性的。由于相对于磁盘资源来说,内存是非常宝贵的,所以Tachyon通过在其underfs(一般使用HDFS)上写入CheckPoint日志信息来实现对文件系统的可恢复性。

    从文件的读取以及写入方式来看,Tachyon可以更好地利用本地模式来读取文件信息,当文件读取客户端和文件所在的Worker位于一台机器上时,客户端会直接绕过Worker直接读取对应的物理文件,减少了本机的数据交互。而HDFS在遇到这样的情况时,会通过本地Socket进行数据交换,这也会有一定的系统资源开销。在写入文件时,HDFS只能写入磁盘,而Tachyon却提供了5种数据写入模式用以满足不同需求。

    2、Tachyon编译部署

    Tachyon目前的最新发布版为0.7.1,其官方网址为http://tachyon-project.org/。Tachyon文件系统有3种部署方式:单机模式、集群模式和高可用集群模式,集群模式相比于高可用集群模式区别在于多Master节点。下面将介绍单机和集群环境下去安装、配置和使用Tachyon。

    2.1 编译Tachyon

    2.1.1 下载并上传源代码

    第一步   下载到Tachyon源代码:

    对于已经发布的版本可以直接从github下载Tachyon编译好的安装包并解压,由于Tachyon与Spark版本有对应关系,另外该系列搭建环境为Spark1.1.0,对应下载Tachyon0.5.0,版本对应参考http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html描述:

    clip_image014

    下载地址为https://github.com/amplab/tachyon/releases,为以下演示我们在这里下载的是tachyon-0.5.0.tar.gz源代码包,文件大小为831K,如下图所示:

    clip_image016

    第二步   在主节点上解压缩

    $cd /home/hadoop/upload/

    $tar -xzf tachyon-0.5.0.tar.gz

    第三步   把tachyon-0.5.0.tar.gz改名并移动到/app/complied目录下

    $mv tachyon-0.5.0 /app/complied/tachyon-0.5.0-src

    $ll /app/complied

    clip_image018

    2.1.2编译代码

    为了更好地契合用户的本地环境,如Java版本、Hadoop版本或其他一些软件包的版本,可以下载Tachyon源码自行编译。Tachyon开源在GitHub上,可以很方便地获得其不同版本的源码。Tachyon项目采用Maven进行管理,因此可以采用 mvn package 命令进行编译打包。编译Tachyon源代码的时候,需要从网上下载依赖包,所以整个编译过程机器必须保证在联网状态。编译执行如下脚本:

    $cd /app/complied/tachyon-0.5.0-src

    $export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

    $mvn clean package -Djava.version=1.7 -Dhadoop.version=2.2.0 -DskipTests

    clip_image020

    整个编译过程编译了约3个任务,整个过程耗时大约4分钟。

    clip_image022

    使用如下命令查看编译后该Tachyon项目大小为72M

    $cd /app/complied/tachyon-0.5.0-src

    $du -s /app/complied/tachyon-0.5.0-src

    clip_image024

    完成这一步后,我们就得到了能够运行在用户本地环境的Tachyon,下面我们分别介绍如何在单机和分布式环境下配置和启动Tachyon,在进行部署之前先把编译好的文件复制到/app/hadoop下并把文件夹命名为Tachyon-0.5.0:

    $cd /app/complied

    $cp -r tachyon-0.5.0-src /app/hadoop/tachyon-0.5.0

    $ll /app/hadoop

    clip_image026

    2.2 单机部署Tachyon

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

    【注】编译好的Tachyon将本系列附属资源/install中提供,具体名称为10.tachyon-0.5.0-hadoop2.2.0-complied.zip

    2.2.1 配置Tachyon

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,在workers文件中配置需要启动TachyonWorker的节点,默认是localhost,所以在单机模式下不用更改(在Tachyon-0.5.0版本中,该文件为slaves)。在这里需要修改tachyon-env.sh配置文件,具体操作是将tachyon-env.sh.template复制为tachyon-env.sh:

    $cd /app/hadoop/tachyon-0.5.0/conf

    $cp tachyon-env.sh.template tachyon-env.sh      

    $ll

    $vi tachyon-env.sh

    clip_image028

    并在tachyon-env.sh中修改具体配置,下面列举了一些重要的配置项:

    lJAVA_HOME:系统中java的安装路径

    lTACHYON_MASTER_ADDRESS:启动TachyonMaster的地址,默认为localhost,所以在单机模式下不用更改

    lTACHYON_UNDERFS_ADDRESS:Tachyon使用的底层文件系统的路径,在单机模式下可以直接使用本地文件系统,如"/tmp/tachyon",也可以使用HDFS,如"hdfs://ip:port"

    lTACHYON_WORKER_MEMORY_SIZE:每个TachyonWorker使用的RamFS大小

    clip_image030

    2.2.2 格式化Tachyon

    完成配置后即可以单机模式启动Tachyon,启动前需要格式化存储文件,格式化和启动Tachyon的命令分别为:

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon format

    clip_image032

    存储文件为$TACHYON_HOME/underfs/tmp/tachyon目录下

    2.2.3 启动Tachyon

    使用如下命令启动Tachyon,可以看到在/nmt/ramdisk目录下格式化RamFS

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon-start.sh local

    clip_image034

    2.2.4 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    clip_image036

    查看Tachyon监控页面,访问地址为http://hadoop1:19999

    clip_image038

    2.2.5 停止Tachyon

    停止Tachyon的命令为:

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon-stop.sh 

    clip_image040

    2.3 集群模式部署Tachyon

    2.3.1 集群环境

    集群包含三个节点(该集群环境可以参考第二课《2.Spark编译与部署(上)--基础环境搭建》进行搭建),运行进程分布如下:

    序号

    IP地址

    机器名

    运行进程

    核数/内存

    用户名

    目录

    1

    192.168.0.61

    hadoop1

    TachyonMaster

    TachyonWorker

    1核/3G

    hadoop

    /app

    /app/hadoop

    /app/hadoop/Tach...

    2

    192.168.0.62

    hadoop2

    TachyonWorker

    1核/2G

    hadoop

    3

    192.168.0.63

    hadoop3

    TachyonWorker

    1核/2G

    hadoop

    2.3.2 配置conf/worker

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,对slaves文件中配置需要启动TachyonWorker的节点,在这里需要设置hadoop1、hadoop2和hadoop3三个节点:

    $cd /app/hadoop/tachyon-0.5.0/conf

    $vi slaves                                                             

    clip_image042

    2.3.3 配置conf/tachyon-env.sh

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

    $cd /app/hadoop/tachyon-0.5.0/conf

    $cp tachyon-env.sh.template tachyon-env.sh      

    $vi tachyon-env.sh

    在该文件中修改一下两个参数,这里使用底层文件系统为HDFS

    export TACHYON_MASTER_ADDRESS=hadoop1

    export TACHYON_UNDERFS_ADDRESS=hdfs://hadoop1:9000

    clip_image044

    2.3.4 向各个节点分发Tachyon

    使用如下命令把hadoop文件夹复制到hadoop2和hadoop3机器

    $cd /app/hadoop/

    $scp -r tachyon-0.5.0 hadoop@hadoop2:/app/hadoop/

    $scp -r tachyon-0.5.0 hadoop@hadoop3:/app/hadoop/

    clip_image046

    2.3.5 启动HDFS

    $cd /app/hadoop/hadoop-2.2.0/sbin

    $./start-dfs.sh

    clip_image048

    2.3.6 格式化Tachyon

    启动前需要格式化存储文件,格式化命令为:

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon format

    clip_image050

    可以看到在HDFS的/tmp创建了tachyon文件夹

    clip_image052

    2.3.7 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon-start.sh all SudoMount

    clip_image054

    启动Tachyon有了更多的选项:

    l./tachyon-start.sh all Mount在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于直接使用mount命令,所以需要用户为root;

    l./tachyon-start.sh all SudoMount在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于使用sudo mount命令,所以需要用户有sudo权限;

    l./tachyon-start.sh all NoMount认为RamFS已经挂载好,不执行挂载操作,只启动TachyonMaster和所有TachyonWorker

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

    单机和集群式模式的区别就在于节点配置和启动步骤,事实上,也可以在集群模式下只设置一个TachyonWorker,此时就成为伪分布模式。

    2.3.8 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    clip_image056

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

    clip_image058

     

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon runTests

    2.4 Tachyon的配置

    这里以0.5.0版本为例,介绍Tachyon中可配置参数的具体含义。Tachyon中的可配置项分为两类,一种是系统环境变量,用于在不同脚本间共享配置信息;另一种是程序运行参数,通过-D选项传入运行Tachyon的JVM中。程序运行参数又分为:

    l  通用配置(Common Configuration)

    l  TachyonMaster配置(Master Configuration)

    l  TachyonWorker配置(Worker Configuration)

    l  用户配置(User Configuration)

    要修改或添加这些可配置项,可修改conf/tachyon-env.sh文件。

    2.4.1 Tachyon环境变量

    配置项

    配置项说明

    JAVA_HOME

    系统中JDK的安装路径

    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.4.2 Tachyon通用配置

    配置项

    配置项说明

    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.4.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.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.4.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的命令行界面让用户可以对文件系统进行基本的操作。调用命令行工具使用以下脚本:

    $./tachyon tfs

    文件系统访问的路径格式如下:

    tachyon://<master node address>:<master node port>/<path>

    在Tachyon命令行使用中tachyon://<master node address>:<master node port>前缀可以省略,该信息从配置文件中读取。

    3.1 接口说明

    可以通过如下命令查看Tachyon所有接口命令

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon tfs -help

    clip_image060

    其中大部分的命令含义可以参考Linux下同名命令,命令含义:

     

    命令

    含义

    cat

    将文件内容输出到控制台

    count

    显示匹配指定的前缀“路径”的文件夹和文件的数量。

    ls

    列出指定路径下所有的文件和目录信息,如大小等。

    lsr

    递归地列出指定路径下所有的文件和目录信息,如大小等。

    mkdir

    在给定的路径创建一个目录,以及任何必要的父目录。如果路径已经存在将会失败。

    rm

    删除一个文件。如果是一个目录的路径将会失败。

    rmr(0.5.0版本不包含)

    删除一个文件或目录,以及该目录下的所有文件夹和文件

    tail

    输出指定文件的最后1 kb到控制台。

    touch

    在指定的路径创建一个0字节的文件。

    mv

    移动指定的源文件或源目录到一个目的路径。如果目的路径已经存在将会失败。

    copyFromLocal

    将本地指定的路径复制到Tachyon中指定的路径。如果Tachyon中指定的路径已经存在将会失败。

    copyToLocal

    从Tachyon中指定的路径复制本地指定的路径。

    fileinfo

    输出指定文件的块信息。

    location

    输出存放指定文件的所在节点列表信息。

    report

    向master报告文件丢失

    request

    根据指定的dependency ID,请求文件。

    pin

    将指定的路径常驻在内存中。如果指定的是一个文件夹,会递归地包含所有文件以及任何在这个文件夹中新创建的文件。

    unpin

    撤销指定路径的常驻内存状态。如果指定的是一个文件夹,会递归地包含所有文件以及任何在这个文件夹中新创建的文件。

    Free(0.5.0版本不包含)

    释放一个文件或一个文件夹下的所有文件的内存。文件/文件夹在underfs仍然是可用的。

    3.2 接口操作示例

    在操作之前需要把$TACHYON_HOME/bin配置到/etc/profile 配置文件的PATH中,并通过source /etc/profile生效

    clip_image062

    3.2.1 copyFromLocal

    将本地$TACHYON_HOME/conf目录拷贝到Tachyon文件系统的根目录下的conf子目录

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon tfs copyFromLocal ../conf /conf

    $./tachyon tfs ls /conf

    clip_image064

    3.2.2 copyToLocal

    把Tachyon文件系统文件复制到本地,需要注意的是命令中的src必须是Tachyon文件系统中的文件不支持目录拷贝,否则报错无法复制

    $mkdir -p /home/hadoop/upload/class10/conflocal

    $./tachyon tfs copyToLocal /conf /home/hadoop/upload/class10/conflocal

    $./tachyon tfs copyToLocal /conf/tachyon-env.sh /home/hadoop/upload/class10/conflocal/tachyon-env.sh

    $ll /home/hadoop/upload/class10/conflocal

    clip_image066

    3.2.3 ls和lsr

    使用ls和lsr命令查看Tachyon文件系统下的文件信息,其中lsr命令可以递归地查看子目录。

    $./tachyon tfs ls /conf

    $./tachyon tfs ls tachyon://hadoop1:19998/conf

    $./tachyon tfs lsr /

    clip_image068

    3.2.4 count

    统计当前路径下的目录、文件信息,包括文件数、目录树以及总的大小

    $./tachyon tfs count /

    clip_image070

    3.2.5 cat

    查看指定文件的内容

    $./tachyon tfs cat /conf/slaves

    $./tachyon tfs cat tachyon://hadoop1:19998/conf/slaves

    clip_image072

    3.2.6 mkdir、rm、rmr和touch

    (1)mkdir:创建目录,支持自动创建不存在的父目录;

    (2)rm:删除文件,不能删除目录,注意,递归删除根目录是无效的

    (3)rmr:删除目录,支持递归,包含子目录和文件,其中0.5.0版本不提供该命令

    (4)touch:创建文件,不能创建已经存在的文件。

    $./tachyon tfs mkdir /mydir

    $./tachyon tfs ls /

    $./tachyon tfs rm /mydir

    clip_image074

    $./tachyon tfs touch /mydir/my.txt

    $./tachyon tfs lsr /mydir

    $./tachyon tfs rm /mydir/my.txt

    clip_image076

    $./tachyon tfs touch /mydir2/2/2/my.txt

    $./tachyon tfs lsr /mydir2

    $./tachyon tfs rm /mydir2

    $./tachyon tfs rm /

    $./tachyon tfs ls /

    clip_image078

    3.2.7 pin和unpin

    pin命令将指定的路径常驻在内存中,如果指定的是一个文件夹会递归地包含所有文件以及任何在这个文件夹中新创建的文件。unpin命令撤销指定路径的常驻内存状态。

    clip_image080

    pin执行前或unpin执行后的Web Interface界面

    $./tachyon tfs pin /conf/log4j.properties

    clip_image082

    $./tachyon tfs unpin /conf/log4j.properties

    clip_image084

    4、Tachyon实战应用

    4.1 配置及启动环境

    4.1.1 修改spark-env.sh

    修改$SPARK_HOME/conf目录下spark-env.sh文件:

    $cd /app/hadoop/spark-1.1.0/conf

    $vi spark-env.sh

    在该配置文件中添加如下内容:

    export SPARK_CLASSPATH=/app/hadoop/tachyon-0.5.0/client/target/tachyon-client-0.5.0-jar-with-dependencies.jar:$SPARK_CLASSPATH

    clip_image086

    4.1.2 启动HDFS

    $cd /app/hadoop/hadoop-2.2.0/sbin

    $./start-dfs.sh

    4.1.3 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon-start.sh all SudoMount

    4.2 Tachyon上运行Spark

    4.2.1 添加core-site.xml

    在Tachyon的官方文档说Hadoop1.X集群需要添加该配置文件(参见http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html),实际在Hadoop2.2.0集群测试的过程中发现也需要添加如下配置文件,否则无法识别以tachyon://开头的文件系统,具体操作是在$SPARK_HOME/conf目录下创建core-site.xml文件

    $cd /app/hadoop/spark-1.1.0/conf

    $touch core-site.xml

    $vi core-site.xml

    在该配置文件中添加如下内容:

    <configuration>

      <property>

        <name>fs.tachyon.impl</name>

        <value>tachyon.hadoop.TFS</value>

      </property>

    </configuration>

    clip_image088

    4.2.2 启动Spark集群

    $cd /app/hadoop/spark-1.1.0/sbin

    $./start-all.sh

    4.2.3 读取文件并保存

    第一步   准备测试数据文件

    使用Tachyon命令行准备测试数据文件

    $cd /app/hadoop/tachyon-0.5.0/bin

    $./tachyon tfs copyFromLocal ../conf/tachyon-env.sh /tachyon-env.sh

    $./tachyon tfs ls /

    clip_image090

    第二步   启动Spark-Shell

    $cd /app/hadoop/spark-1.1.0/bin

    $./spark-shell

    第三步   对测试数据文件进行计数并另存

    对前面放入到Tachyon文件系统的文件进行计数

    scala>val s = sc.textFile("tachyon://hadoop1:19998/tachyon-env.sh")

    scala>s.count()

    clip_image092

    clip_image094

    把前面的测试文件另存为tachyon-env-bak.sh文件

    scala>s.saveAsTextFile("tachyon://hadoop1:19998/tachyon-env-bak.sh")

    clip_image096

    clip_image098

    第四步   在Tachyon的UI界面查看

    可以查看到该文件在Tachyon文件系统中保存成tahyon-env-bak.sh文件夹

    clip_image100

    该文件夹中包含两个文件,分别为part-00000和part-00001:

    clip_image102

    其中tahyon-env-bak.sh/part-0001文件中内容如下:

    clip_image104

    另外通过内存存在文件的监控页面可以观测到,这几个操作文件在内存中:

    clip_image106

    4.3 Tachyon运行MapReduce

    4.3.1 修改core-site.xml

    该配置文件为$Hadoop_HOME/conf目录下的core-site.xml文件

    $cd /app/hadoop/hadoop-2.2.0/etc/hadoop

    $vi core-site.xml

    修改core-site.xml文件配置,添加如下配置项:

    <property>

      <name>fs.tachyon.impl</name>

      <value>tachyon.hadoop.TFS</value>

    </property>

    <property>

      <name>fs.tachyon-ft.impl</name>

      <value>tachyon.hadoop.TFSFT</value>

    </property>

    clip_image108

    4.3.2 启动YARN

    $cd /app/hadoop/hadoop-2.2.0/sbin

    $./start-yarn.sh

    4.3.3 运行MapReduce例子

    第一步   创建结果保存目录

    $cd /app/hadoop/hadoop-2.2.0/bin

    $./hadoop fs -mkdir /class10

    第二步   运行MapReduce例子

    $cd /app/hadoop/hadoop-2.2.0/bin

    $./hadoop jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount -libjars $TACHYON_HOME/client/target/tachyon-client-0.5.0-jar-with-dependencies.jar tachyon://hadoop1:19998/tachyon-env.sh hdfs://hadoop1:9000/class10/output

    clip_image110

    clip_image112

    第三步   查看结果

    查看HDFS,可以看到在/class10中创建了output目录

    clip_image114

    查看part-r-0000文件内容,为tachyon-env.sh单词计数

    clip_image116

     

    5 、参考资料

    (1)《Tachyon:Spark生态系统中的分布式内存文件系统》 http://www.csdn.net/article/2015-06-25/2825056

    (2)《Tachyon的安装、配置和使用》 http://blog.csdn.net/u014252240/article/details/42238081

    (3)Tachyon官方网站http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html

    展开全文
  • 近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。  目前已经使用基于内存计算的分布式计算框架有:Sp

    1 Tachyon介绍

    1.1 Tachyon简介

    随着实时计算的需求日益增多,分布式内存计算也持续升温,怎样将海量数据近乎实时地处理,或者说怎样把离线批处理的速度再提升到一个新的高度是当前研究的重点。近年来,内存的吞吐量成指数倍增长,而磁盘的吞吐量增长缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提高效率的优化点。 
    目前已经使用基于内存计算的分布式计算框架有:Spark、Impala及SAP的HANA等。但是其中不乏一些还是有文件落地磁盘的操作,如果能让这些落地磁盘的操作全部落地到一个共享的内存中,那么这些基于内存的计算框架的效率会更高。 
    Tachyon是AmpLab的李浩源所开发的一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存在Tachyon里的文件。Tachyon是架构在最底层的分布式文件存储和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件落地到分布式内存文件系统中来达到共享内存,从而提高效率。同时可以减少内存冗余、GC时间等,Tachyon的在大数据中层次关系如下图所示: 
    这里写图片描述

    Tachyon允许文件以内存的速度在集群框架中进行可靠的共享,就像Spark和 MapReduce那样。通过利用信息继承、内存侵入,Tachyon获得了高性能。Tachyon工作集文件缓存在内存中,并且让不同的 Jobs/Queries以及框架都能以内存的速度来访问缓存文件。因此,Tachyon可以减少那些需要经常使用数据集通过访问磁盘来获得的次数。

    1.2 Tachyon系统架构

    1.2.1 系统架构

    Tachyon在Spark平台的部署:总的来说,Tachyon有三个主要的部件:Master, Client,与Worker。在每个Spark Worker节点上,都部署了一个Tachyon Worker,Spark Worker通过Tachyon Client访问Tachyon进行数据读写。所有的Tachyon Worker都被Tachyon Master所管理,Tachyon Master通过Tachyon Worker定时发出的心跳来判断Worker是否已经崩溃以及每个Worker剩余的内存空间量。 
    这里写图片描述

    1.2.2 Tachyon Master结构

    Tachyon Master的结构其主要功能如下:首先,Tachyon Master是个主管理器,处理从各个Client发出的请求,这一系列的工作由Service Handler来完成。这些请求包括:获取Worker的信息,读取File的Block信息, 创建File等等;其次,Tachyon Master是个Name Node,存放着所有文件的信息,每个文件的信息都被封装成一个Inode,每个Inode都记录着属于这个文件的所有Block信息。在Tachyon中,Block是文件系统存储的最小单位,假设每个Block是256MB,如果有一个文件的大小是1GB,那么这个文件会被切为4个Block。每个Block可能存在多个副本,被存储在多个Tachyon Worker中,因此Master里面也必须记录每个Block被存储的Worker地址;第三,Tachyon Master同时管理着所有的Worker,Worker会定时向Master发送心跳通知本次活跃状态以及剩余存储空间。Master是通过Master Worker Info去记录每个Worker的上次心跳时间,已使用的内存空间,以及总存储空间等信息。 
    这里写图片描述

    1.2.3 Tachyon Worker结构

    Tachyon Worker主要负责存储管理:首先,Tachyon Worker的Service Handler处理来自Client发来的请求,这些请求包括:读取某个Block的信息,缓存某个Block,锁住某个Block,向本地内存存储要求空间等等。第二,Tachyon Worker的主要部件是Worker Storage,其作用是管理Local Data(本地的内存文件系统)以及Under File System(Tachyon以下的磁盘文件系统,比如HDFS)。第三,Tachyon Worker还有个Data Server以便处理其他的Client对其发起的数据读写请求。当由请求达到时,Tachyon会先在本地的内存存储找数据,如果没有找到则会尝试去其他的Tachyon Worker的内存存储中进行查找。如果数据完全不在Tachyon里,则需要通过Under File System的接口去磁盘文件系统(HDFS)中读取。 
    这里写图片描述

    1.2.4 Tachyon Client结构

    Tachyon Client主要功能是向用户抽象一个文件系统接口以屏蔽掉底层实现细节。首先,Tachyon Client会通过Master Client部件跟Tachyon Master交互,比如可以向Tachyon Master查询某个文件的某个Block在哪里。Tachyon Client也会通过Worker Client部件跟Tachyon Worker交互, 比如向某个Tachyon Worker请求存储空间。在Tachyon Client实现中最主要的是Tachyon File这个部件。在Tachyon File下实现了Block Out Stream,其主要用于写本地内存文件;实现了Block In Stream主要负责读内存文件。在Block In Stream内包含了两个不同的实现:Local Block In Stream主要是用来读本地的内存文件,而Remote Block In Stream主要是读非本地的内存文件。请注意,非本地可以是在其它的Tachyon Worker的内存文件里,也可以是在Under File System的文件里。
    这里写图片描述

    1.2.5 场景说明

    现在我们通过一个简单的场景把各个部件都串起来:假设一个Spark作业发起了一个读请求,它首先会通过Tachyon Client去Tachyon Master查询所需要的Block所在的位置。如果所在的Block不在本地的Tachyon Worker里,此Client则会通过Remote Block In Stream向别的Tachyon Worker发出读请求,同时在Block读入的过程中,Client也会通过Block Out Stream把Block写入到本地的内存存储里,这样就可以保证下次同样的请求可以由本机完成。

    1.3 HDFS与Tachyon

    HDFS(Hadoop Distributed File System)是一个分布式文件系统。HDFS具有高容错性(fault-tolerant)特点,并且设计用来部署在低廉的硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了POSIX的要求,这样可以实现以流的形式访问(streaming access)文件系统中的数据。 
    HDFS采用Master/Slave架构。HDFS集群是由一个Namenode和一定数目的Datanode组成的。Namenode是一台中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求,在Namenode的统一调度下对数据块进行创建、删除和复制。 
    HDFS架构示意图如下图所示。

    这里写图片描述

    Namenode和Datanode被设计成可以在普通的商用机器上运行,这些机器一般运行着GNU/Linux操作系统。HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其他机器则分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。 
    集群中单一Namenode的结构大大简化了系统的架构。Namenode是所有HDFS元数据的仲裁者和管理者,这样用户数据永远不会流过Namenode。 
    对比HDFS和Tachyon,首先从两者的存储结构来看,HDFS设计为用来存储海量文件的分布式系统,Tachyon设计为用来缓存常用数据的分布式内存文件系统。从这点来看,Tachyon可以认为是操作系统层面上的Cache,HDFS可以认为是磁盘。 
    在可靠性方面,HDFS采用副本技术来保证出现系统宕机等意外情况时文件访问的一致性以及可靠性;而Tachyon是依赖于底层文件系统的可靠性来实现自身文件的可靠性的。由于相对于磁盘资源来说,内存是非常宝贵的,所以Tachyon通过在其underfs(一般使用HDFS)上写入CheckPoint日志信息来实现对文件系统的可恢复性。 
    从文件的读取以及写入方式来看,Tachyon可以更好地利用本地模式来读取文件信息,当文件读取客户端和文件所在的Worker位于一台机器上时,客户端会直接绕过Worker直接读取对应的物理文件,减少了本机的数据交互。而HDFS在遇到这样的情况时,会通过本地Socket进行数据交换,这也会有一定的系统资源开销。在写入文件时,HDFS只能写入磁盘,而Tachyon却提供了5种数据写入模式用以满足不同需求。

    2 Tachyon编译部署

    Tachyon目前的最新发布版为0.7.1,其官方网址为http://tachyon-project.org/。Tachyon文件系统有3种部署方式:单机模式、集群模式和高可用集群模式,集群模式相比于高可用集群模式区别在于多Master节点。下面将介绍单机和集群环境下去安装、配置和使用Tachyon。

    2.1 编译Tachyon

    2.1.1 下载并上传源代码

    第一步 下载到Tachyon源代码: 
    对于已经发布的版本可以直接从github下载Tachyon编译好的安装包并解压,由于Tachyon与Spark版本有对应关系,另外该系列搭建环境为Spark1.1.0,对应下载Tachyon0.5.0,版本对应参考http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html描述:

    这里写图片描述

    下载地址为https://github.com/amplab/tachyon/releases ,为以下演示我们在这里下载的是tachyon-0.5.0.tar.gz源代码包,文件大小为831K,如下图所示:

    这里写图片描述

    第二步 在主节点上解压缩

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /home/hadoop/upload<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">/</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$tar</span> <span class="hljs-attribute" style="box-sizing: border-box;">-xzf</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>tar<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>gz</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第三步 把tachyon-0.5.0.tar.gz改名并移动到/app/complied目录下

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mv</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /app/complied</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.1.2 编译代码

    为了更好地契合用户的本地环境,如Java版本、Hadoop版本或其他一些软件包的版本,可以下载Tachyon源码自行编译。Tachyon开源在GitHub上,可以很方便地获得其不同版本的源码。Tachyon项目采用Maven进行管理,因此可以采用 mvn package 命令进行编译打包。编译Tachyon源代码的时候,需要从网上下载依赖包,所以整个编译过程机器必须保证在联网状态。编译执行如下脚本:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$export</span> MAVEN_OPTS<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mvn</span> clean package <span class="hljs-attribute" style="box-sizing: border-box;">-Djava</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>version<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.7</span> <span class="hljs-attribute" style="box-sizing: border-box;">-Dhadoop</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>version<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> <span class="hljs-attribute" style="box-sizing: border-box;">-DskipTests</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    整个编译过程编译了约3个任务,整个过程耗时大约4分钟。 
    这里写图片描述

    使用如下命令查看编译后该Tachyon项目大小为72M

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$du</span> <span class="hljs-attribute" style="box-sizing: border-box;">-s</span> /app/complied/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    完成这一步后,我们就得到了能够运行在用户本地环境的Tachyon,下面我们分别介绍如何在单机和分布式环境下配置和启动Tachyon,在进行部署之前先把编译好的文件复制到/app/hadoop下并把文件夹命名为Tachyon-0.5.0:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/complied <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> <span class="hljs-attribute" style="box-sizing: border-box;">-r</span> tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-src</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /app/hadoop</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    2.2 单机部署Tachyon

    这里要注意一点,Tachyon在单机(local)模式下启动时会自动挂载RamFS,所以请保证使用的账户具有sudo权限。 
    【注】编译好的Tachyon将本系列附属资源/install中提供,具体名称为10.tachyon-0.5.0-hadoop2.2.0-complied.zip

    2.2.1 配置Tachyon

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,在workers文件中配置需要启动TachyonWorker的节点,默认是localhost,所以在单机模式下不用更改(在Tachyon-0.5.0版本中,该文件为slaves)。在这里需要修改tachyon-env.sh配置文件,具体操作是将tachyon-env.sh.template复制为tachyon-env.sh:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh.template tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

    这里写图片描述

    并在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大小

    这里写图片描述

    2.2.2 格式化Tachyon

    完成配置后即可以单机模式启动Tachyon,启动前需要格式化存储文件,格式化和启动Tachyon的命令分别为:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">format</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    存储文件为$TACHYON_HOME/underfs/tmp/tachyon目录下

    2.2.3 启动Tachyon

    使用如下命令启动Tachyon,可以看到在/nmt/ramdisk目录下格式化RamFS

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">local</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.2.4 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    这里写图片描述

    查看Tachyon监控页面,访问地址为http://hadoop1:19999

    这里写图片描述

    2.2.5 停止Tachyon

    停止Tachyon的命令为:

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon-stop.sh </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3 集群模式部署Tachyon

    2.3.1 集群环境

    集群包含三个节点(该集群环境可以参考第二课《2.Spark编译与部署(上)–基础环境搭建》进行搭建),运行进程分布如下: 
    这里写图片描述

    2.3.2 配置conf/worker

    Tachyon相关配置文件在$TACHYON_HOME/conf目录下,对slaves文件中配置需要启动TachyonWorker的节点,在这里需要设置hadoop1、hadoop2和hadoop3三个节点:

    <code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> slaves </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.3 配置conf/tachyon-env.sh

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

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cp</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh.template tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    在该文件中修改一下两个参数,这里使用底层文件系统为HDFS:

    <code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">export</span> TACHYON_MASTER_ADDRESS=hadoop1 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">export</span> TACHYON_UNDERFS_ADDRESS=hdfs:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:9000</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.4 向各个节点分发Tachyon

    使用如下命令把hadoop文件夹复制到hadoop2和hadoop3机器

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/ <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$scp</span> -r tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span> hadoop<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@hadoop2</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:/app/hadoop/</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$scp</span> -r tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span> hadoop<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@hadoop3</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:/app/hadoop/</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    2.3.5 启动HDFS

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-dfs.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    2.3.6 格式化Tachyon

    启动前需要格式化存储文件,格式化命令为:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">format</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    可以看到在HDFS的/tmp创建了tachyon文件夹

    这里写图片描述

    2.3.7 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">all</span> SudoMount</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    启动Tachyon有了更多的选项:

    • ./tachyon-start.sh all Mount 在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于直接使用mount命令,所以需要用户为root;
    • ./tachyon-start.sh all SudoMount在启动前自动挂载TachyonWorker所使用的RamFS,然后启动TachyonMaster和所有TachyonWorker。由于使用sudo mount命令,所以需要用户有sudo权限;
    • ./tachyon-start.sh all NoMount 认为RamFS已经挂载好,不执行挂载操作,只启动TachyonMaster和所有TachyonWorker 
      因此,如果不想每次启动Tachyon都挂载一次RamFS,可以先使用命令./tachyon-mount.sh Mount workers 或./tachyon-mount.sh SudoMount workers 挂载好所有RamFS,然后使用./tachyon-start.sh all NoMount 命令启动Tachyon。 
      单机和集群式模式的区别就在于节点配置和启动步骤,事实上,也可以在集群模式下只设置一个TachyonWorker,此时就成为伪分布模式。

    2.3.8 验证启动

    使用JPS命令查看Tachyon进程,分别为:TachyonWorker和TachyonMaster

    这里写图片描述

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

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon runTests</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    2.4 Tachyon的配置

    这里以0.5.0版本为例,介绍Tachyon中可配置参数的具体含义。Tachyon中的可配置项分为两类,一种是系统环境变量,用于在不同脚本间共享配置信息;另一种是程序运行参数,通过-D选项传入运行Tachyon的JVM中。程序运行参数又分为:

    • 通用配置(Common Configuration)
    • TachyonMaster配置(Master Configuration)
    • TachyonWorker配置(Worker Configuration)
    • 用户配置(User Configuration)

    要修改或添加这些可配置项,可修改conf/tachyon-env.sh文件。

    2.4.1 Tachyon环境变量

    这里写图片描述

    2.4.2 Tachyon通用配置

    这里写图片描述

    这里写图片描述

    2.4.3 TachyonMaster配置

    这里写图片描述

    这里写图片描述

    2.4.4 TachyonWorker配置

    这里写图片描述

    这里写图片描述

    2.4.5 用户配置

    这里写图片描述

    3 Tachyon命令行使用

    Tachyon的命令行界面让用户可以对文件系统进行基本的操作。调用命令行工具使用以下脚本:

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    文件系统访问的路径格式如下:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">tachyon://<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">master</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">node</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">address</span>></span>:<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">master</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">node</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">port</span>></span>/<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">path</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    在Tachyon命令行使用中tachyon://:前缀可以省略,该信息从配置文件中读取。

    3.1 接口说明

    可以通过如下命令查看Tachyon所有接口命令

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs -<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">help</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    其中大部分的命令含义可以参考Linux下同名命令,命令含义:

    这里写图片描述

    这里写图片描述

    3.2 接口操作示例

    在操作之前需要把$TACHYON_HOME/bin配置到/etc/profile 配置文件的PATH中,并通过source /etc/profile生效

    这里写图片描述

    3.2.1 copyFromLocal

    将本地$TACHYON_HOME/conf目录拷贝到Tachyon文件系统的根目录下的conf子目录

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyFromLocal ../conf /conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /conf</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    3.2.2 copyToLocal

    把Tachyon文件系统文件复制到本地,需要注意的是命令中的src必须是Tachyon文件系统中的文件不支持目录拷贝,否则报错无法复制

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$mkdir</span> -p /home/hadoop/upload/class10/conflocal <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyToLocal /conf /home/hadoop/upload/class10/conflocal <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyToLocal /conf/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh /home/hadoop/upload/class10/conflocal/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ll</span> /home/hadoop/upload/class10/conflocal</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

    这里写图片描述

    3.2.3 ls和lsr

    使用ls和lsr命令查看Tachyon文件系统下的文件信息,其中lsr命令可以递归地查看子目录。

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> tachyon:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:19998/conf</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    3.2.4 count

    统计当前路径下的目录、文件信息,包括文件数、目录树以及总的大小

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs count /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    3.2.5 cat

    查看指定文件的内容

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs cat /conf/slaves <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs cat <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">tachyon:</span>/<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/hadoop1:19998/conf</span><span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/slaves</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    3.2.6 mkdir、rm、rmr和touch

    (1) mkdir:创建目录,支持自动创建不存在的父目录; 
    (2) rm:删除文件,不能删除目录,注意,递归删除根目录是无效的 
    (3) rmr:删除目录,支持递归,包含子目录和文件,其中0.5.0版本不提供该命令 
    (4) touch:创建文件,不能创建已经存在的文件。

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs mkdir /mydir <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> / <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs touch /mydir/my.txt <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /mydir <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir/my.txt</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs touch /mydir2/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>/my.txt <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs lsr /mydir2 <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm /mydir2 <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs rm / <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

    这里写图片描述

    3.2.7 pin和unpin

    pin命令将指定的路径常驻在内存中,如果指定的是一个文件夹会递归地包含所有文件以及任何在这个文件夹中新创建的文件。unpin命令撤销指定路径的常驻内存状态。

    这里写图片描述

    pin执行前或unpin执行后的Web Interface界面

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs pin /conf/log4j.properties</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs unpin /conf/log4j.properties</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    4 Tachyon实战应用

    4.1 配置及启动环境

    4.1.1 修改spark-env.sh

    修改$SPARK_HOME/conf目录下spark-env.sh文件:

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> spark-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    在该配置文件中添加如下内容:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">export SPARK_CLASSPATH<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span>/app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/client/target/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-client</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-jar</span><span class="hljs-attribute" style="box-sizing: border-box;">-with</span><span class="hljs-attribute" style="box-sizing: border-box;">-dependencies</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar:<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$SPARK_CLASSPATH</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    4.1.2 启动HDFS

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-dfs.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.1.3 启动Tachyon

    在这里使用SudoMout参数,需要在启动过程中输入hadoop的密码,具体过程如下:

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-start</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>sh <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">all</span> SudoMount</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.2 Tachyon上运行Spark

    4.2.1 添加core-site.xml

    在Tachyon的官方文档说Hadoop1.X集群需要添加该配置文件(参见http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html),实际在Hadoop2.2.0集群测试的过程中发现也需要添加如下配置文件,否则无法识别以tachyon://开头的文件系统,具体操作是在$SPARK_HOME/conf目录下创建core-site.xml文件

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/conf <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$touch</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    在该配置文件中添加如下内容:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">configuration</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFS<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">configuration</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

    这里写图片描述 
    4.2.2 启动Spark集群

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-all.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.2.3 读取文件并保存

    第一步 准备测试数据文件 
    使用Tachyon命令行准备测试数据文件

    <code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/tachyon-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs copyFromLocal ../conf/tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh /tachyon-<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">env</span>.sh <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/tachyon tfs <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> /</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

    这里写图片描述 
    第二步 启动Spark-Shell

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/spark-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1.1</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/spark-shell</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第三步 对测试数据文件进行计数并另存 
    对前面放入到Tachyon文件系统的文件进行计数

    <code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">scala>val s = sc<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.textFile</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tachyon://hadoop1:19998/tachyon-env.sh"</span>) scala>s<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.count</span>()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    这里写图片描述

    把前面的测试文件另存为tachyon-env-bak.sh文件

    <code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">scala>s<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.saveAsTextFile</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"tachyon://hadoop1:19998/tachyon-env-bak.sh"</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

    这里写图片描述

    这里写图片描述

    第四步 在Tachyon的UI界面查看 
    可以查看到该文件在Tachyon文件系统中保存成tahyon-env-bak.sh文件夹 
    这里写图片描述

    该文件夹中包含两个文件,分别为part-00000和part-00001: 
    这里写图片描述

    其中tahyon-env-bak.sh/part-0001文件中内容如下: 
    这里写图片描述

    另外通过内存存在文件的监控页面可以观测到,这几个操作文件在内存中: 
    这里写图片描述

    4.3 Tachyon运行MapReduce

    4.3.1 修改core-site.xml

    该配置文件为$Hadoop_HOME/conf目录下的core-site.xml文件

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/etc/hadoop <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$vi</span> core<span class="hljs-attribute" style="box-sizing: border-box;">-site</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">xml</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    修改core-site.xml文件配置,添加如下配置项:

    <code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFS<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span>fs.tachyon-ft.impl<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">name</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span>tachyon.hadoop.TFSFT<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">value</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">property</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

    这里写图片描述

    4.3.2 启动YARN

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/sbin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/start-yarn.sh</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    4.3.3 运行MapReduce例子

    第一步 创建结果保存目录

    <code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>/bin <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$.</span>/hadoop fs -mkdir /class1<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    第二步 运行MapReduce例子

    <code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$cd</span> /app/hadoop/hadoop<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span>/bin $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>/hadoop jar <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">..</span>/share/hadoop/mapreduce/hadoop<span class="hljs-attribute" style="box-sizing: border-box;">-mapreduce</span><span class="hljs-attribute" style="box-sizing: border-box;">-examples</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2.2</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar wordcount <span class="hljs-attribute" style="box-sizing: border-box;">-libjars</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$TACHYON_HOME</span>/client/target/tachyon<span class="hljs-attribute" style="box-sizing: border-box;">-client</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">.0</span><span class="hljs-attribute" style="box-sizing: border-box;">-jar</span><span class="hljs-attribute" style="box-sizing: border-box;">-with</span><span class="hljs-attribute" style="box-sizing: border-box;">-dependencies</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>jar tachyon:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//hadoop1:19998/tachyon-env.sh hdfs://hadoop1:9000/class10/output</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

    这里写图片描述

    这里写图片描述

    第三步 查看结果 
    查看HDFS,可以看到在/class10中创建了output目录 
    这里写图片描述

    查看part-r-0000文件内容,为tachyon-env.sh单词计数 
    这里写图片描述

    5 参考资料

    (1) 《Tachyon:Spark生态系统中的分布式内存文件系统》 http://www.csdn.net/article/2015-06-25/2825056 
    (2) 《Tachyon的安装、配置和使用》 http://blog.csdn.net/u014252240/article/details/42238081 
    (3) Tachyon官方网站http://tachyon-project.org/documentation/Running-Spark-on-Tachyon.html


    本文转自这里

    展开全文
  • 随着实时计算的需求日益增多,分布式内存计算也持续升温,怎样将海量数据近乎实时...近年来,内存的吞吐量成指数倍的增长,而磁盘的吞吐量增长的缓慢,那么将原有计算框架中文件落地磁盘替换为文件落地内存,也是提
  • 高并发——缓存

    2019-05-10 19:12:00
    前言:  这篇博客主要是总结在高并发场景下应该什么时候使用缓存,怎样使用缓存。...要想使系统拥有高吞吐量我们可以在任意环节加入缓存,使得请求能够直接从缓存中获取,从而减少服务器的计算量,从而提升...
  • 前言:这篇文章主要是总结在高并发场景下应该什么时候使用...要想使系统拥有高吞吐量我们可以在任意环节加入缓存,使得请求能够直接从缓存中获取,从而减少服务器的计算量,从而提升响应速度。其实缓存可以出现在...
  • 前言: 这篇文章主要是总结在高并发场景下应该什么时候使用缓存,怎样...要想使系统拥有高吞吐量我们可以在任意环节加入缓存,使得请求能够直接从缓存中获取,从而减少服务器的计算量,从而提升响应速度。其实缓...
  • 服务端性能测试

    2019-03-21 16:18:00
    目的 对产品或非专业技术的职能部门:能支持多少活跃用户,及并发用户(UV) 对开发:专业性能指标 对运维:单硬件服务器(的测试指标)-->...系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间 QPS(TP...
  • 真的是好久未坚持写博客了,自己想想除了工作外,少了好多东西,还是得坚持每天总结和思考。...互联网时代信息量巨大,需要非常强大的计算能力,不但要求对用户的响应速度款,还要求吞吐量指标想歪...
  • HDFS原理扫盲

    2016-12-26 19:21:01
    问题导读 1.什么是分布式文件系统?...它能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。要理解HDFS的内部工作原理,首先要理解什么是分布式文件系统。分布式文件系统多台计算机联网协同工
  • 再问一层,比如为什么Kafka吞吐量远胜于其他中间件,为什么说适合日志采集和流式计算的场景?就回答不上来了。学习终归是个积累的过程。 直到某一天看到阿里一篇挺常规的关于Notify和MetaQ的介绍,却突然茅塞顿开。...
  • 37篇经过消化云计算论文打包下载

    热门讨论 2011-01-03 13:28:25
    同时介绍了对MapReduce的改进以增加系统的吞吐量。 23、 Scalable Semantics – the Silver Lining of Cloud Computing 本文提出在云计算模型下快速的进行分布式RDF的查询和推理。 24、 On the Use of ...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

吞吐量怎样计算