在过去,我曾经使用在MySQL上运行的OLAP多维数据集构建WebAnalytics.现在我使用OLAP多维数据集的方式只是一个大表(好吧,它比那更智能地存储),其中每一行基本上是一个测量或聚合的测量集.每个度量都有一堆维度(即哪个页面名称,用户名,ip等)和一堆值(即多少个综合浏览量,多少访问者等).
您在这样的表上运行的查询通常采用以下形式(meta-SQL):
SELECT SUM(hits), SUM(bytes),
FROM MyCube
WHERE date='20090914' and pagename='Homepage' and browser!='googlebot'
GROUP BY hour
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用上述过滤器获取所选日期中每小时的总计.一个障碍是这些立方体通常意味着全表扫描(各种原因),这意味着你可以制作这些东西的尺寸(在MiB中)的实际限制.
我正在学习Hadoop等的来龙去脉.
在BigTable上运行上述查询作为mapreduce看起来很容易:只需将'小时'作为键,在地图中过滤并通过对值进行求和来减少.
您是否可以在"实时"(即通过用户界面和用户得到他们的答案,而不是批处理模式)上运行BigTable类型的系统上面(或至少具有相同输出)的查询?
如果不; 在BigTable/Hadoop/HBase/Hive等领域做这样的事情的适当技术是什么?
更新:MongoDB的后续操作获取集合中所有键的名称.
正如Kristina所指出的,可以使用Mongodb的map/reduce来列出集合中的键:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] });
db.things.insert( { hello : [] } );
mr = db.runCommand({"mapreduce" : "things",
"map" : function() {
for (var key in this) { emit(key, null); }
},
"reduce" : function(key, stuff) {
return null;
}})
db[mr.result].distinct("_id")
//output: [ "_id", "egg", "hello", "type" ]
Run Code Online (Sandbox Code Playgroud)
只要我们想要只获得位于第一级深度的键,这就可以了.但是,它将无法检索位于更深层次的密钥.如果我们添加一条新记录:
db.things.insert({foo: {bar: {baaar: true}}})
Run Code Online (Sandbox Code Playgroud)
我们再次运行上面的map-reduce + distinct片段,我们将得到:
[ …Run Code Online (Sandbox Code Playgroud) 我只是想确认我对减速器和减速器之间的差异的理解.
我将输入和输出文件夹作为参数传递给来自网页的mapreduce字数统计程序.
得到以下错误:
HTTP状态500 - 请求处理失败; 嵌套异常是java.lang.IllegalArgumentException:必须将AWS Access Key ID和Secret Access Key指定为s3n URL的用户名或密码,或者通过设置fs.s3n.awsAccessKeyId或fs.s3n.awsSecretAccessKey属性(分别).
我写了一个mapreduce作业来从数据集中提取一些信息.数据集是用户对电影的评分.用户数约为250K,电影数约为300k.地图的输出是<user, <movie, rating>*> and <movie,<user,rating>*>.在reducer中,我将处理这些对.
但是当我运行这个工作时,映射器按预期完成,但是reducer总是抱怨
Task attempt_* failed to report status for 600 seconds.
Run Code Online (Sandbox Code Playgroud)
我知道这是由于无法更新状态,所以我context.progress()在我的代码中添加了一个调用,如下所示:
int count = 0;
while (values.hasNext()) {
if (count++ % 100 == 0) {
context.progress();
}
/*other code here*/
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有帮助.仍有许多减少任务失败.
这是日志:
Task attempt_201104251139_0295_r_000014_1 failed to report status for 600 seconds. Killing!
11/05/03 10:09:09 INFO mapred.JobClient: Task Id : attempt_201104251139_0295_r_000012_1, Status : FAILED
Task attempt_201104251139_0295_r_000012_1 failed to report status for 600 seconds. Killing!
11/05/03 10:09:09 INFO mapred.JobClient: Task Id : …Run Code Online (Sandbox Code Playgroud) 我在HDFS目录中有一堆小文件.虽然文件的体积相对较小,但每个文件的处理时间量很大.也就是说,一个64mb文件,它是默认的分割大小TextInputFormat,甚至需要花费几个小时来处理.
我需要做的是减少分割大小,这样我就可以利用更多的节点来完成工作.
所以问题是,怎么可能通过让我们说分割文件10kb?我需要实现我自己InputFormat和RecordReader这一点,或有任何参数设置?谢谢.
我的程序看起来像
public class TopKRecord extends Configured implements Tool {
public static class MapClass extends Mapper<Text, Text, Text, Text> {
public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
// your map code goes here
String[] fields = value.toString().split(",");
String year = fields[1];
String claims = fields[8];
if (claims.length() > 0 && (!claims.startsWith("\""))) {
context.write(new Text(year.toString()), new Text(claims.toString()));
}
}
}
public int run(String args[]) throws Exception {
Job job = new Job();
job.setJarByClass(TopKRecord.class);
job.setMapperClass(MapClass.class);
FileInputFormat.setInputPaths(job, new Path(args[0])); …Run Code Online (Sandbox Code Playgroud) 我们正在开始一个基于大数据的分析项目,我们正在考虑采用scala(类型安全堆栈).我想知道各种scala API /项目可用于做hadoop,map reduce程序.
我有3个数据节点正在运行,而在运行作业时,我得到以下错误,
java.io.IOException:File/user/ashsshar/olhcache/loaderMap9b663bd9只能复制到0个节点而不是minReplication(= 1).运行中有3个数据节点,此操作中排除了3个节点.在org.apache.hadoop.hdfs.server.blockmanagement.BlockManager.chooseTarget(BlockManager.java:1325)
当我们的DataNode实例空间不足或DataNode未运行时,主要出现此错误.我尝试重新启动DataNodes但仍然遇到相同的错误.
我的集群节点上的dfsadmin -reports清楚地显示了大量可用空间.
我不确定为什么会这样.
我想知道为什么分组比较器用于二级mapreduce.
根据二级分类的权威指南示例
我们希望键的排序顺序是年份(升序),然后是温度(降序):
1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C
Run Code Online (Sandbox Code Playgroud)
通过将分区器设置为按键的年份部分进行分区,我们可以保证同一年的记录转到同一个reducer.然而,这仍然不足以实现我们的目标.分区程序仅确保一个reducer接收一年的所有记录; 它不会改变reducer在分区内按键分组的事实.
既然我们已经编写了自己的分区器来处理特定reducer的map输出键,那么我们为什么要对它进行分组呢.
提前致谢