HADOOP Map 任务失败 : No protocol specified

标签 hadoop mapreduce opencl gpu jocl

我正在使用 CDH4,我正在尝试使用 JOCL 从映射器类的 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 task 都会引发错误“未指定协议(protocol)”。这是什么意思 ?
映射器类中使用的协议(protocol)是什么?

问候

最佳答案

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

我们解决了:-)

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

据我了解,AMD OpenCL 代码(对于 root 以外的用户)无法在没有访问 X 服务器的情况下运行(http://en.wikipedia.org/wiki/X_Window_System)

根据这个线程http://devgurus.amd.com/thread/160838 AMD 正在努力让 OpenCL 在没有 X-server 的情况下工作。

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

以下是我遵循的步骤:

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

    当它提示时,输入:/bin/bash
  • 打开/etc/rc.local 并在 'exit 0' 之前添加以下行。
    su -l lightdm -c "sleep 30 ; export DISPLAY=:0 ; xhost +local:"
    
  • 创建一个文件/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
    
  • 如果此设置不起作用,上面注释掉的条目用于测试其他内容,但对我们来说它有效
  • 授予上述脚本的权限
    $sudo chmod 755 /etc/profile.d/compute.sh
    
  • 如果从 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
    
  • 重新启动系统,为所有用户(包括 mapred)设置环境变量,现在我们可以从 Hadoop
  • 运行 OpenCL 代码

    关于HADOOP Map 任务失败 : No protocol specified,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919481/

    相关文章:

    c++ - 在 OpenCL 1.2 中的内核之间传递变量/内核之间的通信

    hadoop - 名称节点 block 管理

    hadoop - 容器在 mapreduce 任务期间以非零退出代码 1 错误退出

    hadoop - Namenode-HDFS "Connection refused"错误(Hadoop 问题)

    hadoop - Hive查询针对Cassandra columnFamily执行时返回null

    java - 如何构建 buildOutputValue 方法

    c++ - 为什么 OpenCL 工作组大小对 GPU 性能影响巨大?

    c++ - 如何调用boost_compute 'BOOST_COMPUTE_FUNCTION'定义的函数?

    hadoop - 如何从 FTP 服务器增量复制文件到 Hadoop HDFS

    hadoop - 使用 multidelimeter 在配置单元中插入数据