小编ton*_*ger的帖子

从MRjob的hdfs访问流输出

我正在尝试使用Python驱动程序来运行迭代的MRjob程序.退出标准取决于计数器.

工作本身似乎在运行.如果我从命令行运行单个迭代,那么我可以hadoop fs -cat /user/myname/myhdfsdir/part-00000看到单次迭代的预期结果.

但是,我需要使用Python驱动程序来运行代码并从中访问计数器runner.这是因为它是一种迭代算法,需要计数器的值来确定退出标准.

OUTPUT_PATH = /user/myname/myhdfsdir
!hadoop fs -rm -r {OUTPUT_PATH}

from my_custom_MRjob import my_custom_MRjob

mr_job = my_custom_MRjob(args=["localDir/localTextFile.txt", 
                                     "-r", "hadoop", 
                                     "--output-dir=hdfs://"+OUTPUT_PATH, 
                                     "--no-output"])

while True:
    with mr_job.make_runner() as runner:
        print runner.get_opts()
        runner.run()
        with open('localDir/localTextFile.txt', 'w') as f:
            for line in runner.stream_output():
                key,value =  mr_job.parse_output_line(line)
                #
                f.write(key +'\t'+ value +'\n')
        print "End of MRjob iteration. Counters: {}".format(runner.counters())
        # read a particular counter
        # use counter value to evaluate exit criteria
        if exit_criteria_met:
            break
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

IOErrorTraceback …
Run Code Online (Sandbox Code Playgroud)

python hadoop mapreduce hdfs mrjob

10
推荐指数
1
解决办法
388
查看次数

滚动最小值和滚动最大值为C++提升?

我有一些代码使用Boost累加器来跟踪滚动窗口的平均值 - "滚动平均值".除了滚动平均值,我想跟踪同一滚动窗口的最小值和最大值.

有没有办法用Boost累加器计算滚动最小值和滚动最大值?我没有看到方法......

我已经尝试将min和max标签添加到用于rolling_mean的累加器中,但这并没有给我我想要的东西.

typedef accumulator_set<uint32_t, stats<tag::rolling_mean> > rollingMeanAcc_t;
Run Code Online (Sandbox Code Playgroud)

typedef accumulator_set<uint32_t, stats<tag::rolling_mean,tag::min,tag::max> > rollingMeanAcc_t;
Run Code Online (Sandbox Code Playgroud)

但是,此处提供的最小值和最大值是在整个累加器上计算的,而不是限制在与平均值相同的滚动窗口.

Boost 文档说明在所有样本中计算最小值和最大值,不限于滚动窗口.它们似乎没有提供限制或加重样品的方法.

我希望能够在滚动窗口中报告平均值/最小值/最大值.

我目前正在使用Boost版本1.48.0.我查看了最新版本(1.54.0)的文档,并没有看到在那里实现滚动最小/最大.

我发现了一种非Boost方式来跟踪最小滑动窗口,但这似乎也不是我想要的.我不想仅因为它们大于/小于之前的最小值/最大值而删除值,因为这会使rolling_mean不准确.

c++ boost max min boost-accumulators

5
推荐指数
1
解决办法
1522
查看次数

TCP套接字,服务器无法响应客户端,接受:系统调用中断

我正在尝试在Solaris上运行的C语言中实现TCP服务器和客户端。我是套接字的新手,并以Beej指南为例。

对于初学者来说,我希望客户端以的形式向服务器发送消息word1 word2。收到后,我希望服务器word2从消息中提取并将其发送回客户端。

初始客户端->服务器消息发送工作正常。但是服务器->客户端响应不起作用。有几种故障症状:

  1. 服务器似乎甚至没有尝试对send()客户端执行任何操作。
  2. 接收到客户端的消息后,服务器将打印:accept: Interrupted system call,然后返回到while(1)循环的顶部并保持在那里,直到我按Ctrl-C为止。
  3. 客户端的调用recv()返回0个字节。

我在这里找到一个旧线程,最后一个帖子说:

子进程终止时,accept被子进程中断,它将信号发送回父进程(SIGCHLD,如果我还记得写的话)。您可以忽略SIGCHLD,也可以编写accept()以便更好地处理中断(errno设置为EINTR)

但是,我不明白这一点。为什么子进程在尝试该send()部分之前就终止了?“更好地处理中断”是什么意思?

搜索更多内容后,我在堆栈溢出上发现了这个问题:如何处理EINTR(中断的系统调用)

我尝试将代码添加到接受的答案中,替换write()send(),但是我仍然看到相同的行为。

服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <signal.h>

const char* nodename = "localhost";
const char* FILESERV1_LISTEN_PORT = "41063";
const unsigned int MAXDATASIZE = 100; …
Run Code Online (Sandbox Code Playgroud)

c sockets signals tcp interrupt

1
推荐指数
1
解决办法
2万
查看次数

标签 统计

boost ×1

boost-accumulators ×1

c ×1

c++ ×1

hadoop ×1

hdfs ×1

interrupt ×1

mapreduce ×1

max ×1

min ×1

mrjob ×1

python ×1

signals ×1

sockets ×1

tcp ×1