这是我最近在Web UI上看到的
Configured Capacity : 232.5 GB
DFS Used : 112.44 GB
Non DFS Used : 119.46 GB
DFS Remaining : 613.88 MB
DFS Used% : 48.36 %
DFS Remaining% : 0.26 %
Run Code Online (Sandbox Code Playgroud)
而且我很困惑,非dfs Used占用了一半以上的容量,
我认为这意味着hadoop存储的一半被浪费了
在花费无意义的时间搜索之后,我只是格式化了namenode,并从头开始.
然后我从本地复制了一个巨大的文本文件(大约19千兆字节)到HDFS(成功).
现在用户界面说
Configured Capacity : 232.5 GB
DFS Used : 38.52 GB
Non DFS Used : 45.35 GB
DFS Remaining : 148.62 GB
DFS Used% : 16.57 %
DFS Remaining% : 63.92 %
Run Code Online (Sandbox Code Playgroud)
在复制之前,DFS Used和Non DFS Used都是0.
因为DFS Used大约是原始文本文件大小的两倍,我配置了2个副本,
我猜DFS Used由2份原始和元组成.
但是我仍然不知道非DFS使用的来源是什么,为什么这比DFS使用的占用了更多的容量.
发生了什么事?我弄错了吗?
我需要将raw转换Map
为Map<string,string>
,我想我必须首先将原始地图转换为Map<Object,Object>
然后再将其转换为Map<String,String>
.
代码片段如下所示.
Map obj1 = new HashMap();
obj1.put("key1", 1);
obj1.put("key2", false);
obj1.put("key3", 3.94f);
Map<Object, Object> obj2 = obj1;
Map<String, String> obj = new HashMap<String,String>();
for (Map.Entry<Object, Object> entry: obj2.entrySet()) {
obj.put(entry.getKey().toString(), entry.getValue().toString());
}
Run Code Online (Sandbox Code Playgroud)
我想它可以在任何条件下工作,但我想听听其他人关于此代码可能存在的危险.(ClassCastException
例如,任何可能性?)
如果您有更好的想法,也请告诉我.
- 修改后的代码
Map obj1 = new HashMap();
obj1.put(2, 1);
obj1.put(true, false);
obj1.put(4.4f, 3.94f);
Map<String, String> obj = new HashMap<String,String>();
for (Object k : obj1.keySet()){
obj.put(k.toString(), obj1.get(k).toString());
}
Run Code Online (Sandbox Code Playgroud)
由于原始Map条目将包含对象的键/值,我认为我不需要临时Map<Object,Object>
.只是迭代每个项目效果很好,到目前为止我没有看到任何问题.
我有一个拓扑结构,例如由1个喷口和4个螺栓组成
spout A -> bolt B -> bolt C -> bolt E
-> bolt D
Run Code Online (Sandbox Code Playgroud)
只有当螺栓B中的某些条件语句为真时,它才会将元组传递给螺栓C和螺栓D.
并且只有当螺栓C中的某些条件语句为真时,它才会将元组传递给螺栓E.
因此单个元组可能只到达螺栓B或(螺栓C和D).
我正在使用BaseBasicBolt,据我所知,它会在调用collector.emit后自动执行.
例如,螺栓B中的执行方法如下所示
public class boltB extends BaseBasicBolt {
public void execute(Tuple tuple, BasicOutputCollector collector) {
...some logic goes here
if (response.getCount() > 0) {
collector.emit(new Values(tuple.getString(0)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果没有调用collector.emit,我认为spout中的元组失败了,因为我从风暴ui看到几乎所有来自spout的元组都失败了.
在这种情况下,我应该在哪里调用'ack'来表示spout不要将其视为失败的元组?
我有一个Kafka喷口的拓扑结构,如下所示
SpoutConfig spoutConfig = new SpoutConfig(zkBrokerHosts, "some-topic","", "some-id");
spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
...
builder.setSpout("kafkaSpout",new KafkaSpout(spoutConfig),1);
Run Code Online (Sandbox Code Playgroud)
当然它工作正常.
考虑到我的拓扑失败并再次运行它的情况,我希望KafkaSpout从该主题的最新偏移读取而不是消费者已阅读的最后偏移.
有什么选择吗?我试过了
spoutConfig.startOffsetTime=System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)
但似乎它不能按我的意愿工作.并且都没有kafkaConfig.forceStartOffsetTime(-2);
如果您有任何想法,请告诉我.