问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

所有的系统都会用spark做么

发布网友 发布时间:2022-04-14 04:32

我来回答

2个回答

懂视网 时间:2022-04-14 08:53

Tachyon是一个基于内存的分布式文件系统(项目首页:tachyon-project.org),它是AmpLab的BDAS(berkeley data analytics stack)的一个重要组成。解决了丢失cache导致的重新计算,不同app(job),甚至是不同计算框架间重复的内存使用等问题。目前Spark 1.1默

Tachyon是一个基于内存的分布式文件系统(项目首页:tachyon-project.org),它是AmpLab的BDAS(berkeley data analytics stack)的一个重要组成。解决了丢失cache导致的重新计算,不同app(job),甚至是不同计算框架间重复的内存使用等问题。目前Spark 1.1默认支持0.5的版本。

bdas

特性

Java-like File API: Tachyon的原生API和Java文件系统非常相似,提供InputStream, OutputStream等接口, 以及高效的内存映射I/O,用这些API能够获得最好的性能。
Compatibility: Tachyon 实现了Hadoop FileSystem 接口, 因此Hadoop MapReduce和Spark可以不经过任何修改就能在使用Tachyon。
Native support for raw tables: Tachyon对列存储结构的数据提供了原生的支持,用户可以将某些访问量高的列选择性地放到内存中。
Pluggable underlayer file system: Tachyon 提供memory data到底层文件系统的方法。目前支持HDFS和单点的本地文件系统。
Web UI: 用户可以通过浏览器浏览文件系统,在debug模式下,管理员可以查看文件的位置等详细信息。
Command line interaction: 用户可以使用 ./bin/tachyon tfs和 Tachyon交互,例如将文件在Tachyon和本地文件系统中拷贝。

原理简述

参考Dr.浩源 6月30日的slide。Tachyon的架构是常见的Master/Worker结构,使用Zookeeper可以构建Master的HA。由Master节点负责管理维护文件系统MetaData(使用Journal image+edit log,详见参考1),而文件数据维护在Worker节点的内存中。Worker和Master的通讯依赖于thrift。另外,底层支持用户指定文件的持久化(保存到underlyHDFS中)。
tachyon-arch
Tachyon充分利用内存,在内存中只存一份数据(没有replica复制内存数据),并将lineage的设计应用到存储层,通过异步的向Tachyon的底层文件系统做Checkpoint。当我们向Tachyon里面写入文件的时候,Tachyon会在后台异步的把这个文件给checkpoint到它的底层存储。另外,Tachyon的重算如下图,如果File Set B丢失,则需要由File Set A通过Spark Job重新得到File Set B。
tachyon-recompute
Tachyon中定义了下面几种cache的类型

package tachyon.client
import java.io.IOException;
/**
 * Different write types for a TachyonFile.
 */
public enum WriteType {
 /**
 * Write the file and must cache it.
 */
 MUST_CACHE(1),
 /**
 * Write the file and try to cache it.
 */
 TRY_CACHE(2),
 /**
 * Write the file synchronously to the under fs, and also try to cache it,
 */
 CACHE_THROUGH(3),
 /**
 * Write the file synchronously to the under fs, no cache.
 */
 THROUGH(4),
 /**
 * Write the file asynchronously to the under fs (either must cache or must through).
 */
 ASYNC_THROUGH(5);
......

Tachyon集群配置

下载并解压Tachyon 0.5
wget http://tachyon-project.org/downloads/tachyon-0.5.0-bin.tar.gz
tar xvfz tachyon-0.5.0-bin.tar.gz
cd tachyon-0.5.0/conf
Tachyon官方文档Configuration Settings,除了设置正确的JAVA_HOME,我们要设置的参数如下:

#Basic
tachyon.home = /var/lib/spark/tachyon-0.5.0
tachyon.underfs.address = hdfs://hdp01:8020
tachyon.data.folder = /user/spark/tach_data
tachyon.workers.folder = /user/spark/tach_worker
# tachyon.underfs.hdfs.impl = "org.apache.hadoop.hdfs.DistributedFileSystem" #default
# tachyon.max.columns = 1000 #default
# tachyon.table.metadata.byte = 5242880 #default
#HA
tachyon.usezookeeper = true
tachyon.zookeeper.address = hdp02:2181, hdp03:2181, hdp04:2181
tachyon.zookeeper.election.path = "/tach_elect"
tachyon.zookeeper.leader.path = "/tach_leader"
#Master
# tachyon.master.journal.folder = "$TACHYON_UNDERFS_ADDRESS/user/spark/tach_journal/" #default $tachyon.home + "/journal/" 
tachyon.master.hostname = hdp04
# tachyon.master.port = 19998 #default 
# tachyon.master.web.port = 19999 #default 
# tachyon.master.whitelist = "/" #default 
#Worker
# tachyon.worker.port = 29998 #default 
# tachyon.worker.data.port = 29999 #default 
tachyon.worker.memory.size = 10G #default 128M
tachyon.worker.data.folder = /mnt/ramdisk  #default /mnt/ramdisk
#User
# tachyon.user.failed.space.request.limits = 3 #default 
# tachyon.user.quota.unit.bytes = 8MB #default 
# tachyon.user.file.buffer.bytes = 1MB #default 
# tachyon.user.default.block.size.byte = 1GB #default 
# tachyon.user.remote.read.buffer.size.byte = 1MB #default

如果启用了基于ZooKeeper的master HA,除了设置underfs为分布式文件系统和zk之外,还需要设置所有master的tachyon.master.hostname为自身的地址(必须对所有worker节点可见)。根据模版,配置tachyon-env.sh.template文件,tachyon-env.sh的如下:

#!/usr/bin/env bash
# This file contains environment variables required to run Tachyon. Copy it as tachyon-env.sh and
# edit that to configure Tachyon for your site. At a minimum,
# the following variables should be set:
#
# - JAVA_HOME, to point to your JAVA installation
# - TACHYON_MASTER_ADDRESS, to bind the master to a different IP address or hostname
# - TACHYON_UNDERFS_ADDRESS, to set the under filesystem address.
# - TACHYON_WORKER_MEMORY_SIZE, to set how much memory to use (e.g. 1000mb, 2gb) per worker
# - TACHYON_RAM_FOLDER, to set where worker stores in memory data
# - TACHYON_UNDERFS_HDFS_IMPL, to set which HDFS implementation to use (e.g. com.mapr.fs.MapRFileSystem,
# org.apache.hadoop.hdfs.DistributedFileSystem)
# The following gives an example:
export TACHYON_HOME=/var/lib/spark/tachyon-0.5.0
export HADOOP_HOME=/usr/lib/hadoop
if [[ `uname -a` == Darwin* ]]; then
 # Assuming Mac OS X
 export JAVA_HOME=${JAVA_HOME:-$(/usr/libexec/java_home)}
 export TACHYON_RAM_FOLDER=/var/lib/spark/tachyon-0.5.0
 export TACHYON_JAVA_OPTS="-Djava.security.krb5.realm= -Djava.security.krb5.kdc="
else
 # Assuming Linux
 if [ -z "$JAVA_HOME" ]; then
 export JAVA_HOME=/usr/java/latest
 fi
 export TACHYON_RAM_FOLDER=$TACHYON_HOME/ramdisk
fi
export JAVA="$JAVA_HOME/bin/java"
export TACHYON_MASTER_ADDRESS=hdp04
export TACHYON_UNDERFS_ADDRESS=hdfs://hdp01:8020
export TACHYON_WORKER_MEMORY_SIZE=10GB
export TACHYON_UNDERFS_HDFS_IMPL=org.apache.hadoop.hdfs.DistributedFileSystem
CONF_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export TACHYON_JAVA_OPTS+="
 -Dlog4j.configuration=file:$CONF_DIR/log4j.properties
 -Dtachyon.debug=false
 -Dtachyon.underfs.address=$TACHYON_UNDERFS_ADDRESS
 -Dtachyon.underfs.hdfs.impl=$TACHYON_UNDERFS_HDFS_IMPL
 -Dtachyon.data.folder=$TACHYON_UNDERFS_ADDRESS/user/spark/tach_data
 -Dtachyon.workers.folder=$TACHYON_UNDERFS_ADDRESS/user/spark/tach_worker
 -Dtachyon.worker.memory.size=$TACHYON_WORKER_MEMORY_SIZE
 -Dtachyon.worker.data.folder=$TACHYON_RAM_FOLDER/tachyonworker/
 -Dtachyon.master.worker.timeout.ms=60000
 -Dtachyon.master.hostname=$TACHYON_MASTER_ADDRESS
 -Dtachyon.master.journal.folder=$TACHYON_UNDERFS_ADDRESS/user/spark/tach_journal/ 
 -Dorg.apache.jasper.compiler.disablejsr199=true
 -Dtachyon.usezookeeper=true
 -Dtachyon.zookeeper.address=hdp02:2181,hdp03:2181,hdp04:2181
 -Dtachyon.zookeeper.election.path="/tach_elect"
 -Dtachyon.zookeeper.leader.path="/tach_leader"
 -Djava.net.preferIPv4Stack=true
"
# Master specific parameters. Default to TACHYON_JAVA_OPTS.
export TACHYON_MASTER_JAVA_OPTS="$TACHYON_JAVA_OPTS"
# Worker specific parameters that will be shared to all workers. Default to TACHYON_JAVA_OPTS.
export TACHYON_WORKER_JAVA_OPTS="$TACHYON_JAVA_OPTS"
---------------------------------------------------------------------------------------------------------------
vim slaves
hdp01
hdp02
hdp03
hdp04

第一次运行需要format

$ tachyon format
......
#
Connection to hdp01... Formatting Tachyon Worker @ hdp01
Removing local data under folder: /var/lib/spark/tachyon-0.5.0/ramdisk/tachyonworker/
Connection to hdp01 closed.
Connection to hdp02... Formatting Tachyon Worker @ hdp02
Removing local data under folder: /var/lib/spark/tachyon-0.5.0/ramdisk/tachyonworker/
Connection to hdp02 closed.
Connection to hdp03... Formatting Tachyon Worker @ hdp03
Removing local data under folder: /var/lib/spark/tachyon-0.5.0/ramdisk/tachyonworker/
Connection to hdp03 closed.
Connection to hdp04... Formatting Tachyon Worker @ hdp04
Removing local data under folder: /var/lib/spark/tachyon-0.5.0/ramdisk/tachyonworker/
Connection to hdp04 closed.
......

启动tachyon,为了让ramFS能mount,需要使用root来启动。

tachyon-start.sh all Mount
Starting master @ hdp04
...
Connection to hdp04... Formatting RamFS: /var/lib/spark/tachyon-0.5.0/ramdisk (10gb)
Starting worker @ hdp04
...

打开web UI http://hdp04:19999/home, 可以看到可用内存为我们配置的TACHYON_WORKER_MEMORY_SIZE大小。
tachyon-ui

在Spark中使用Tachyon

首先在$SPARK_HOME/conf中新建core-site.xml文件

 fs.tachyon.impl
 tachyon.hadoop.TFS

然后$SPARK_HOME/conf/spark-env.sh中设置
export SPARK_CLASSPATH=/var/lib/spark/tachyon-0.5.0/client/target/tachyon-client-0.5.0-jar-with-dependencies.jar:$SPARK_CLASSPATH
下面在Spark程序中需要指定:
spark.tachyonStore.url
spark.tachyonStore.BaseDir
例如:

vim $SPARK_HOME/conf/spark-defaults.conf
spark.tachyonStore.url tachyon://hdp4:19998
spark.tachyonStore.baseURL /data/tach_tmp
#打开Spark-Shell,通过tachyon来加载underfs(HDFS)中的数据/user/spark/1.txt
scala> val mydata = sc.textfile("tachyon-fs://hdp04:19998/user/spark/1.txt")
scala> data.count
...
res0: Long = 52
# 以in-memory保存到tachyon,可供其他应用使用
scala> mydata.saveAsTextFile("tachyon-fs://hdp04:19998/my/1.txt")
这个文件就以in-memory file保存到tft中,可以在web UI中查看,并通过命令进行删除
tachyon tft rm /my/1.txt
#使用tachyon持久化RDD,由于之前已经设置了spark.tachyonStore.url和spark.tachyonStore.baseDir,可以直接使用spark sc的persist(StorageLevel.OFF_HEAP)来持久化,当该Spark SC结束时,RDD会被自动清理。
scala> mydata.persist(StorageLevel.OFF_HEAP)

underfs和ramfs之间的数据同步

当TACHYON启动时,Tachyon不会知道已经存在的数据文件。需要使用下面的同步数据命令
$ ./bin/tachyon loadufs [TACHYON_PATH] [UNDERLYING_FILESYSTEM_PATH] [Optional EXCLUDE_PATHS]
例如:
$ tachyon loadufs tachyon://hdp04:19998 hdfs://hdp01:8020/user/spark/tach_data
第三个可选参数指的是UNDERLYING_FILESYSTEM_PATH下的这个PATH列表会除外,不加载到tfs中。
例如”tachyon;spark”表示hdfs://hdp01:8020/user/spark/tach_data下的tachyon和spark目录不会被加载。

tachyon的命令行参数

参照官方文档:http://tachyon-project.org/Command-Line-Interface.html
tachyon的命令行操作和hdfs类似,除了文件系统操作ls, lsr, mkdir, rm, mv, copyFromLocal, copyToLocal还一些工具命令cat, count(Display the number of folders and files matching the specified prefix in “path”.), tail(Print the last 1KB of the specified file to the console.), touch, fileinfo(Print the information of the blocks of a specified file.)之外,还有特有的pin和unpin命令:
command: pin
usage:pin “path”
Description:Pins the given file, such that Tachyon will never evict it from memory. If called on a folder, it recursively pins all contained files and any new files created within this folder.
command: unpin
usage: unpin “path”
Description:Unpins the given file to allow Tachyon to start evicting it again. If called on a folder, it recursively unpins all contained files and any new files created within this folder.

^o^

参考

Tachyon Docs
Tachyon架构分析和现存问题讨论
?CrazyJVM老师的Spark课程

热心网友 时间:2022-04-14 06:01

王家林每日Spark语录0001腾讯的Spark集群已经达到8000台的规模,是目前已知最大的Spark集群,每天运行超过1万各种作业。王家林每日Spark语录0002Spark基于RDD近乎完美的实现了分布式内存的抽象,且能够基于位置感知性调度、自动容错、负载均衡和高度的可扩展性,Spark中允许用户在执行多个查询时显式的将工作集缓存起来以供后续查询重用,这极大的提高了查询的速度。王家林每日Spark语录0003Spark一体化多元化的解决方案极大的减少了开发和维护的人力成本和部署平台的物力成本,并在性能方面有极大的优势,特别适合于迭代计算,例如机器学习和和图计算;同时Spark对Scala和Python交互式shell的支持也极大的方便了通过shell直接来使用Spark集群来验证解决问题的方法,这对于原型开发至关重要,对数据分析人员有着无法拒绝的吸引力!王家林每日Spark语录0004Spark中RDD采用高度受限的分布式共享内存,且新的RDD的产生只能够通过其它RDD上的批量操作来创建,依赖于以RDD的Lineage为核心的容错处理,在迭代计算方面比Hadoop快20多倍,同时还可以在5~7秒内交互式的查询TB级别的数据集。王家林每日Spark语录0005Spark RDD是被分区的,对于RDD来说,每个分区都会被一个计算任务处理,并决定并行计算的粒度;RD的每次转换操作都会生成新的RDD,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。王家林每日Spark语录0006基于RDD的整个计算过程都是发生在Worker中的Executor中的。RDD支持三种类型的操作:Transformation、Action以及Persist和CheckPoint为代表的控制类型的操作,RDD一般会从外部数据源读取数据,经过多次RDD的Transformation(中间为了容错和提高效率,有可能使用Persist和CheckPoint),最终通过Action类型的操作一般会把结果写回外部存储系统。王家林每日Spark语录0007RDD的所有Transformation操作都是Lazy级别的,实际上这些Transformation级别操作的RDD在发生Action操作之前只是仅仅被记录会作用在基础数据集上而已,只有当Driver需要返回结果的时候,这些Transformation类型的RDD才会真正作用数据集,基于这样设计的调度模式和运行模式让Spark更加有效率的运行。王家林每日大数据语录Spark篇0008(2015.10.31于北京)王家林每日大数据语录Spark篇0008(2015.10.31于北京):持久化(包含Memory、Disk、Tachyon等类型)是Spark构建迭代算法和快速交互式查询的关键,当通过persist对一个RDD持久化后,每一个节点都将把计算的分片结果保存在内存或者磁盘或者Tachyon上,并且对此数据集或者衍生出来的数据集进行的其它Action级别的炒作都可以重用当前RDD的计算结果,这是的后续的的操作通常会快10到100倍。王家林每日大数据语录Spark篇0009(2015.11.1于北京)Spark的CheckPoint是在计算完成之后重新建立一个Job来进行计算的,用户可以通过调用RDD.checkpoint()来指定RDD需要checkpoint的机制;为了避免重复计算,建议先对RDD进行persist操作,这样可以保证checkpoint更加快速的完成。王家林每日大数据语录Spark篇0010(2015.11.2于深圳)SparkContext是用户程序和Spark交互的接口,它会负责连接到Spark集群,并且根据系统默认配置和用户设置来申请计算资源,完成RDD的创建等工作。王家林每日大数据语录Spark篇0011(2015.11.2于深圳)RDD的saveAsTextFile方法会首先生成一个MapPartitionsRDD,该RDD通过雕工PairRDDFunctions的saveAsHadoopDataset方法向HDFS等输出RDD数据的内容,并在在最后调用SparkContext的runJob来真正的向Spark集群提交计算任务。王家林每日大数据语录Spark篇0012(2015.11.2于深圳)可以从两个方面来理解RDD之间的依赖关系,一方面是RDD的parent RDD(s)是什么,另一方面是依赖于parent RDD(s)哪些Partions(s); 根据依赖于parent RDD(s)哪些Partions(s)的不同情况,Spark讲Dependency分为宽依赖和窄依赖两种。王家林每日大数据语录Spark篇0013(2015.11.3于广州)RDD有narrow dependency和wide dependency两种不同的类型的依赖,其中的narrow dependency指的是每一个parent RDD 的Partition最多被child RDD的一个Partition所使用,而wide dependency指的是多个child RDDs的Partition会依赖于同一个parent RDD的Partition。王家林每日大数据语录Spark篇0014(2015.11.4于南宁)对于Spark中的join操作,如果每个partition仅仅和特定的partition进行join那么就是窄依赖;对于需要parent RDD所有partition进行join的操作,即需要shuffle,此时就是宽依赖。王家林每日大数据语录Spark篇0015(2015.11.5于南宁)Spark中宽依赖指的是生成的RDD的每一个partition都依赖于父 RDD(s) 所有partition,宽依赖典型的操作有groupByKey, sortByKey等,宽依赖意味着shuffle操作,这是Spark划分stage的边界的依据,Spark中宽依赖支持两种Shuffle Manager,即HashShuffleManager和SortShuffleManager,前者是基于Hash的Shuffle机制,后者是基于排序的Shuffle机制。王家林每日大数据语录Spark篇0016(2015.11.6于南宁)RDD在创建子RDD的时候,会通过Dependency来定义他们之间的关系,通过Dependency,子RDD可以获得parent RDD(s)和parent RDD(s)的Partition(s).王家林每日大数据语录Spark篇0017(2015.11.6于南宁)在Spark的Stage内部的每个Partition都会被分配一个计算任务Task,这些Task是并行执行的; Stage之间的依赖关系变成了一个大粒度的DAG,Stage只有在它没有parent Stage或者parent Stage都已经执行完成后才可以执行,也就是说DAG中的Stage是从前往后顺序执行的。王家林每日大数据语录Spark篇0018(2015.11.7于南宁)在Spark的receByKey操作时会触发Shuffle的过程,在Shuffle之前,会有本地的聚合过程产生MapPartitionsRDD,接着具体Shuffle会产生ShuffledRDD,之后做全局的聚合生成结果MapPartitionsRDD.王家林每日大数据语录Spark篇0019(2015.11.10于重庆)park中的Task分为ShuffleMapTask和ResultTask两种类型,在Spark中DAG的最后一个Stage内部的任务都是ResultTask,其余所有的Stage(s)的内部都是ShuffleMapTask,生成的Task会被Driver发送到已经启动的Executor中执行具体的计算任务,执行的实现是在TaskRunner.run方法中完成的。王家林每日大数据语录Spark篇0020(2015.11.11于重庆)Spark中生成的不同的RDD中有的喝用户的逻辑显式的对于,例如map操作会生成MapPartitionsRDD,而又的RDD则是Spark框架帮助我们隐式生成的,例如receByKey操作时候的ShuffledRDD.王家林每日大数据语录Spark篇0021(2015.11.18于珠海)Spark RDD实现基于Lineage的容错机制,基于RDD的各项transformation构成了compute chain,在部分计算结果丢失的时候可以根据Lineage重新计算恢复。在窄依赖中,在子RDD的分区丢失要重算父RDD分区时,父RDD相应分区的所有数据都是子RDD分区的数据,并不存在冗余计算;在宽依赖情况下,丢失一个子RDD分区重算的每个父RDD的每个分区的所有数据并不是都给丢失的子RDD分区用的,会有一部分数据相当于对应的是未丢失的子RDD分区中需要的数据,这样就会产生冗余计算开销和巨大的性能浪费。王家林每日大数据语录Spark篇0022(2015.11.18于珠海)Spark Checkpoint通过将RDD写入Disk做检查点,是Spark lineage容错的辅助,lineage过长会造成容错成本过高,这时候在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。Checkpoint主要适用于以下两种情况:1. DAG中的Lineage过长,如果重算时会开销太大,例如在PageRank、ALS等;2. 尤其适合于在宽依赖上做Checkpoint,这个时候就可以避免应为Lineage重新计算而带来的冗余计算。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...换手机号显示你以设置拒收微信登陆.换绑.注册短信怎么解决? 伊拉克战争是哪些国家发动的?请快回答,我有急用! 二零零三年三月谁发动了对伊拉克的战争 西门子、美的、容声三个门的冰箱那个牌子又省电又实用? 海尔冰箱BCD-206 SCFM 放3档工作多长时间 ,停多长时间正常 海尔BCD-206SCFM基本参数 6年级上册数学练习册百分数50到53页答案 小学数学六年级(上):帮你学数学口算练习册2008年印刷版信息 小学数学六年级(上):帮你学数学口算练习册2010年印刷版信息 小学六年级数学上册百分数练习册《课堂作业本》答案64面第2题 佛山有什么传统民俗活动?如:走通济等三个以上,并说说举办时间与意义... 佛山元宵节行通济要连续行多少年? 最新工伤伤残鉴定流程 工伤鉴定伤残的流程 工伤认定伤残鉴定流程 工伤伤残鉴定有哪些要求工伤鉴定流程 工伤伤残鉴定流程是什么 工伤伤残鉴定流程具体包括哪些 黄景深你有吴梓穆的存档吗? 借钱不还的人,属于什么样的心态 那些借钱不还的人都是什么人?有钱不还又是什么心态? 处置车能不能买 "国"在姓氏中的念法 全款处置车带大本能买吗 借钱不还的人都是什么样的心态? 借钱不还的人是什么样的? 百家姓降怎么念 百家姓第十一个字怎么念 百家姓房姓怎么念 百家姓第61个念什么 谁知道雀巢咖啡的新口号是什么? 一句话介绍卡布奇诺咖啡 谁能告诉我提拉米苏、卡布奇诺、拿铁……等一系列咖啡的含义啊? 卡布奇诺咖啡物语? 卡布奇诺的暗语是什么? 有关卡布奇诺的文字 一般小于1亿流通市值的股票庄家进入多久才拉升 卡布奇诺咖啡介绍 卡布奇诺咖啡的寓意/? 国产软件流通市值小于1O亿的是那支股票 一般流通股本在1个亿以上的个股称为大盘股;5000万至1个亿的个股称为中盘般;不到5000万规模的称为小盘股 网络交易的特点 互联网对消费有什么影响? 我梦见钓到好多小鱼还有一条大白色银鱼怎样解梦? 梦见自己用线在池边钓上来三条小鱼有放在另一个水草池中放生? 请问,ETC卡有年龄限制吗? 办etc车主要多大岁才可以办理 六十周岁以上老司机就不能办理ECT高速卡吗,交通部有规定吗? 驾驶证没有满一年能办etc卡吗 自动伞怎么打开啊,刚买不会啊!