我的map函数必须为每个输入读取一个文件.该文件根本没有变化,仅供阅读.分布式缓存可能对我有很多帮助,但我无法找到使用它的方法.我需要覆盖的public void configure(JobConf conf)函数,我认为已弃用.好的JobConf肯定已被弃用.所有DistributedCache教程都使用不推荐的方式.我能做什么?有没有我可以覆盖的另一个配置功能?
这些是我的地图功能的第一行:
Configuration conf = new Configuration(); //load the MFile
FileSystem fs = FileSystem.get(conf);
Path inFile = new Path("planet/MFile");
FSDataInputStream in = fs.open(inFile);
DecisionTree dtree=new DecisionTree().loadTree(in);
Run Code Online (Sandbox Code Playgroud)
我想缓存那个MFile,这样我的map函数就不需要一遍又一遍地查看它
我使用以下代码将文件添加到分布式缓存:
Configuration conf2 = new Configuration();
job = new Job(conf2);
job.setJobName("Join with Cache");
DistributedCache.addCacheFile(new URI("hdfs://server:port/FilePath/part-r-00000"), conf2);
Run Code Online (Sandbox Code Playgroud)
然后我将文件读入映射器:
protected void setup(Context context)throws IOException,InterruptedException{
Configuration conf = context.getConfiguration();
URI[] cacheFile = DistributedCache.getCacheFiles(conf);
FSDataInputStream in = FileSystem.get(conf).open(new Path(cacheFile[0].getPath()));
BufferedReader joinReader = new BufferedReader(new InputStreamReader(in));
String line;
try {
while ((line = joinReader.readLine()) != null) {
s = line.toString().split("\t");
do stuff to s
} finally {
joinReader.close();
}
Run Code Online (Sandbox Code Playgroud)
问题是我只读了一行,而不是我放入缓存的文件.而是:cm9vdA ==,或base64中的root.
有没有其他人有这个问题,或看到我如何错误地使用分布式缓存?我正在使用Hadoop 0.20.2完全分发.
我最近开始研究Infinispan作为我们的缓存层.在阅读Infinispan中的操作模式后,如下所述.
首先,我现在很困惑,最适合我上述两种模式的应用.
我有一个非常简单的用例,我们有一个客户端代码,它将使用服务的主要VIP调用我们的REST服务,然后它将负载平衡到Service Server我们部署服务的个人,然后它将交互使用Cassandra数据库检索用户ID的数据基础.下图将使一切清晰.

假设,例如,如果客户端正在寻找一些数据,userId = 123那么它将使用主VIP调用我们的REST服务,然后它将负载平衡到我们的四个服务服务器中的任何一个,假设它被负载平衡到Service1,然后service1将调用Cassandra数据库获取记录userId = 123,然后返回给客户端.
现在我们计划使用Infinispan缓存数据,因为压缩会破坏我们的性能,因此我们的读取性能可以得到一些提升.所以我开始研究Infinispan并发现了两种模式,如下所述.我不确定在我们的案例中使用Infinispan的最佳方式是什么.
其次,从Infinispan缓存来看,我将期待的是假设我使用嵌入式模式,那么它应该看起来像这样.

如果是,那么Infinispan缓存将如何相互影响?有可能在某个时候,我们将寻找那些将在另一个Service Instance Infinispan缓存上的userId的数据?对?那么在那种情况下会发生什么?infinispan会不会照顾这些事情?如果是的话,那么我需要进行哪些配置设置以确保此功能正常.
如果我遗失任何东西,请原谅我的无知.任何明确的信息都会让我对上述两个问题更清楚.
分布式缓存是一种存储常见请求并支持快速检索的方法.
Tachyon是一个以内存为中心的分布式存储文件系统,可避免进入磁盘以加载经常读取的数据集.
这两者有什么不同?
我知道<min-eviction-check-millis>在hazelcast配置中定义了在检查此映射的分区是否可逐出之前应该通过的最短时间(以毫秒为单位).因此,在每个配置的间隔期间,将根据配置的驱逐策略在地图中执行驱逐.我有以下与此领域相关的问题.
Q1.驱逐操作是否在操作线程上运行?
Q2.驱逐操作会锁定它正在处理的整个分区吗?
Q3.如果我要遵循100毫秒的默认值(我相信这是一个非常小的值),我是否需要预期会有任何性能损失.
Q4.在以下情景中,驱逐行动的频率如何?
<map name="employees">
<in-memory-format>BINARY</in-memory-format>
<backup-count>1</backup-count>
<max-idle-seconds>1800</max-idle-seconds>
<eviction-policy>NONE</eviction-policy>
<time-to-live-seconds>0</time-to-live-seconds>
<min-eviction-check-millis>1000</min-eviction-check-millis>
<max-size>0</max-size>
<eviction-percentage>0</eviction-percentage>
<merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
</map>
Run Code Online (Sandbox Code Playgroud)
请注意,虽然没有配置驱逐策略和百分比,但最大空闲时间设置为1800秒.
上述问题的答案将帮助我在大规模部署中对这些配置所使用的值做出明智的决定.
java distributed-cache distributed-caching hazelcast hazelcast-imap
由于不推荐使用getLocalCacheFiles(),我正在尝试寻找替代方案.getCacheFiles()似乎是一个,但我怀疑它们是否相同.
当您调用addCacheFile()时,HDFS中的文件将下载到每个节点,使用getLocalCacheFiles()您可以获取本地化文件路径,您可以从本地文件系统中读取它.但是,getCacheFiles()返回的是HDFS中文件的URI.如果您通过此URI读取文件,我怀疑您仍然从HDFS而不是本地文件系统读取.
以上是我的理解,我不知道是否正确.如果是这样,有什么替代方案getLocalCacheFiles()?为什么Hadoop首先弃用它?
我想知道在哪里存储cassandra提供的数据.像"数据湖"这样的东西,在那里我可以把所有处理过的数据,在一天结束时或类似的东西.
我正在寻找一种可以防止数据丢失的分布式可靠存储解决方案.
Cassandra的文件系统名为CFS,但在哪里存储?
我想要一个小的文件传递给我使用的运行作业GenericOptionsParser的-files标志:
$ hadoop jar MyJob.jar -conf /path/to/cluster-conf.xml -files /path/to/local-file.csv data/input data/output
Run Code Online (Sandbox Code Playgroud)
这应该将作业发送到我的集群并附加local-file.csv以在需要时可用于Mapper/Reducer.当我在伪分布式模式下运行它时,它工作得很好,但是当我在集群上启动作业时,似乎无法找到该文件.我正在使用mapper的setup方法读取文件,如下所示:
public static class TheMapper extends Mapper<LongWritable, Text, Text, Text> {
@Override
public void setup(Context context) throws IOException, InterruptedException {
URI[] uriList = DistributedCache.getCacheFiles( context.getConfiguration() );
CsvReader csv = new CsvReader(uriList[0].getPath());
// work with csv file..
}
// ..
}
Run Code Online (Sandbox Code Playgroud)
当作业运行时,我得到以下异常:
java.io.FileNotFoundException: File /hdfs/tmp/mapred/staging/hduser/.staging/job_201205112311_011/files/local-file.csv does not exist.
at com.csvreader.CsvReader.<init>(Unknown Source)
at com.csvreader.CsvReader.<init>(Unknown Source)
at com.csvreader.CsvReader.<init>(Unknown Source)
at MyJob$TheMapper.setup(MyJob.java:167)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
...
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?谢谢.
我有一个4 GB的文件,我试图通过分布式缓存在所有映射器之间共享.但我观察到地图任务尝试启动的重大延迟.具体来说,我提交作业的时间(通过job.waitForCompletion())与第一张地图开始的时间之间存在显着延迟.
我想知道在DistributedCache中使用大文件的副作用是什么.复制分布式缓存上的文件多少次?群集中的节点数是否会对此产生影响?
(我的群集在非常强大的计算机上运行了大约13个节点,每台计算机可以容纳近10个映射插槽.)
谢谢