HADOOP Map任务失败:未指定协议

时间:2013-09-20 14:39:05

标签: hadoop mapreduce opencl gpu jocl

我正在使用CDH4,我正在尝试使用JOCL从mapper类的cleanup()方法访问GPU。 (注意:我的普通代码(没有map reduce)在GPU上工作正常。)

当我执行map-reduce代码时,它会抛出一个错误(在下面指定)。

attempt_201309171647_0021_m_000000_1: No protocol specified
attempt_201309171647_0021_m_000000_1: No protocol specified
13/09/20 18:03:01 INFO mapred.JobClient: Task Id : attempt_201309171647_0021_m_000000_2, Status : FAILED
org.jocl.CLException: CL_DEVICE_NOT_FOUND
    at org.jocl.CL.checkResult(CL.java:569)
    at org.jocl.CL.clGetDeviceIDs(CL.java:2239)
    at com.testMR.jocl.WordCountMapper.cleanup(WordCountMapper.java:106)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
    at org.apache.hadoop.mapred.Child.main(Child.java:262)
******************************************************************************

每个map任务都会抛出错误“No protocol specified”。这是什么意思 ? mapper类中使用了哪些协议?

此致

1 个答案:

答案 0 :(得分:0)

操作系统的图形设备出现问题。

我们解决了它: - )

我们遇到的问题是在Hadoop上运行的AMD OpenCL代码。 MapReduce代码无法访问GPU卡。它需要X服务器提供的GUI服务才能使用GPU计算资源。

根据我的理解,如果没有访问X-server(http://en.wikipedia.org/wiki/X_Window_System),就无法运行AMD OpenCL代码(对于除root之外的用户)

根据这个帖子http://devgurus.amd.com/thread/160838 AMD正致力于让OpenCL在没有X服务器的情况下工作。

我发现让OpenCL代码在Hadoop上运行的解决方案是从这个线程http://devgurus.amd.com/message/1284840改编而来的,它提出了在没有GUI的情况下通过ssh登录运行OpenCL代码的步骤。

以下是我遵循的步骤:

  1. 使用'chsh lightdm'命令编辑'lightdm'用户的shell并将其设置为/ bin / bash

    $sudo chsh lightdm
    

    当提示时,键入:/ bin / bash

  2. 打开/etc/rc.local并在“退出0”之前添加以下行。

    su -l lightdm -c "sleep 30 ; export DISPLAY=:0 ; xhost +local:"
    
  3. 创建一个文件/etc/profile.d/compute.sh并在里面添加以下内容(并执行'chmod 755 /etc/profile.d/compute.sh'):

    #!/bin/sh
    
    export COMPUTE=:0
    
    #export DISPLAY=:0
    
    #export GPU_MAX_ALLOC_PRCENT=100
    
    #export GPU_MAX_HEAP_SIZE=100
    
    if [ ! -z "$DISPLAY" ]; then
    
        xhost +local:
    
    fi
    
  4. 上面注释掉的条目用于测试其他内容,如果此设置不起作用,但对我们来说有效

  5. 为上述脚本授予权限

    $sudo chmod 755 /etc/profile.d/compute.sh
    
  6. 如果从lightdm登录/退出,X设置将重置,因此将以下内容添加到/etc/lightdm/lightdm.conf

    greeter-show-manual-login=true
    
    greeter-setup-script=/etc/profile.d/compute.sh
    
    session-setup-script=/etc/profile.d/compute.sh
    
  7. 重新启动系统,以便为所有用户设置环境变量(包括mapred),现在我们可以从Hadoop运行OpenCL代码