HDFS in MapReduce
1. Map的输入数据一般放在HDFS中 2. Map的输出数据放在本地硬盘上,因为它们只是中间结果,不需要冗余,所以不需要用HDFS 3. Reduce的输出数据放在HDFS中,以实现冗余
1. Map的输入数据一般放在HDFS中 2. Map的输出数据放在本地硬盘上,因为它们只是中间结果,不需要冗余,所以不需要用HDFS 3. Reduce的输出数据放在HDFS中,以实现冗余
仅供复制 修改配置文件 <!–修改conf/core-site.xml–> <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost/</value> <!–默认的文件系统是本机hdfs系统–> </property> </configuration> <!–修改conf/hdfs-site.xml–> <configuration> <property> <name>dfs.replication</name> <value>1</value> <!–pseudo-distributed模式下没法做replication–> </property> </configuration> <!–修改conf/mapred-site.xml–> <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:8021</value> </property> </configuration> 使本机可以免密码登录本机 $ssh-add $ssh localhost #测试一下要不要输入密码 格式化HDFS文件系统 $hadoop namenode -format #经测试,文件系统创建在/tmp/hadoop-kent/dfs/name中 启动Hadoop后台服务 $start-dfs.sh $start-mapred.sh 通过浏览器察看状态 http://localhost:50070/ http://localhost:50030/ 操纵一下hdfs中的文件 $hadoop fs -copyFromLocal 1k.log hdfs://localhost/firsttry/1k.log $hadoop fs -ls / #列出hdfs的根目录 停止hadoop服务 $stop-dfs.sh $stop-mapred.sh
无干货,仅供复制 public class HdfsExample { public static void main(String[] args) throws IOException { String dir = "/home/kent"; String fileUrl = "hdfs://localhost" + dir + "/" + System.currentTimeMillis() + "hdfsExample.txt"; FileSystem fs = FileSystem.get(URI.create(fileUrl), new Configuration()); // create a file System.out.println("Creating hdfs file : " + fileUrl); Path path = new Path(fileUrl); FSDataOutputStream out = fs.create(path); …
摘自Hadoop-The Definitive Guide, 稍微添加了一两条线 只有一个Reduce Task 有多个Reduce Task 注意:All values for a key are sent to the same reducer
无任何干货,仅供复制 程序说明: 1. 分析一个应该的访问日志文件,找出每个用户ID的访问次数。日志格式基本上是:"2012-10-26 14:41:30,748 userNameId-777 from IP-10.232.25.144 invoked URL-http://xxx/hello.jsonp" 2. Standalone模式,但直接用maven项目所依赖的hadoop库,你不必再另装hadoop <!– pom.xml –> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.0.4</version> </dependency> //Mapper public class Coupon11LogMapper extends Mapper<LongWritable, Text, Text, LongWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws java.io.IOException, InterruptedException { String line = value.toString(); String accessRegex = ".*userNameId\\-(\\d+).*"; Pattern pattern …
String accessRegex = ".*userNameId\\-(\\d+).*"; String text = "2012-10-26 14:41:30,748 userNameId-777 from IP-10.232.25.144 invoked URL-http://xxx/hello.jsonp"; Pattern pattern = Pattern.compile(accessRegex); Matcher matcher = pattern.matcher(text); if (matcher.find()) { System.out.println(matcher.group(1)); }
这样或许可以: netstat -an|grep " 本机IP:80\b"|wc -l
本文基本节选自 Java theory and practice: Going atomic CAS字面上是什么意思? CAS = Compare-and-Swap. 它的语义是: public class SimulatedCAS { private int value; //如果某个值当前值是期望值,则将某个值设置为新值;否则不做设置. //然后,返回当前值 public synchronized int compareAndSwap(int expectedValue, int newValue) { int currentValue = value; if (value == expectedValue) value = newValue; return currentValue; } } CAS在并发控制上起什么作用? 以“自增操作”为例,使用CAS可以避免常见的“丢失修改”问题 private SimulatedCAS value; public int increment() { int oldValue …
1.对于跨数据库的业务操作,如果追求强一致性,就要走2PC(two-phase commit) 协议。而这个协议在Availability方面可能表现不佳: a.只要一个库回滚,大家都得回滚 b.导致多处的资源上锁,影响性能 2.按不同的语境,弱一致性有两种含义: a. 不要求所有子操作原子地执行。可以容忍有的操作成功,有的操作失败,比如用于估算的数据,可以允许零星的失败 b. 不要求在甲方扣款后乙方在同一瞬间收到款,可以允许乙方隔一段时间后(最终)收到款(即最终一致性) 3.“最终一致性”一般可以通过消息队列来实现:完成一个子操作后,发出一个消息,这个消息将被异步地处理 a. 即使一个系统挂了,也不会影响上游系统继续工作 b. 如果系统处理一个消息失败,可能需要重复处理这个消息。 所以最好把消息消费设计成Idempotent 参考资料: http://queue.acm.org/detail.cfm?id=1394128
“分区”是个中性词,不好也不坏。而CAP定理中的Partition代表的是一种“坏”的情况。 这里介绍说: 引用 A partition happens when, say, a network cable gets chopped, and Node A can no longer communicate with Node B. 可以看出,partition指的是两个结点之间无法互通,这可能是因为网络线路断开,也可能是因为其中一个结点出了故障。 这跟我们平常说的分区完全不是一回事。"partition"译成“阻断“才比较合适,或者干脆译成”结点间互联失败“;也只有这样译,它跟tolerance连起来用才有意义: “对网络通信的容忍度”可以理解, 而“对分区的容忍度”。。。这什么玩意? 这个错误的译法会让人坠入云里雾里,在阅读相关文献时抓破脑袋。从这个意义上说,第一个把"Partition Tolerance"译成“分区耐受性”的人,应该主动切腹以谢国人。