如果只设置mapred.min.split.size,计算方式可以简化为:
如果不进行兄宽任何设置,默认的map个数是和blcok_size相关的。 default_num = total_size / block_size
可以通过参数mapred.map.tasks来设置程序员期望的map个数,但是这个个数只有在大于default_num的时候,才会生效。 goal_num = mapred.map.tasks
可以通过mapred.min.split.size 设置每个task处理的文件大小,羡稿亮但是这个大小只有在大于block_size的时候才会生效。
通过公式 compute_map_num = min(split_num, max(default_num, goal_num)) 可以计算出 map 数。除了这些配置以外,mapreduce还要遵循一些原则。 mapreduce的每一个map处理敬庆的数据是不能跨越文件的,也就是说min_map_num >= input_file_num。 所以,最终的map个数应该为: final_map_num = max(compute_map_num, input_file_num)
实际上只设置 mapred.map.tasks 和 mapred.min.split.size 这两个参数,如果想增加map个数,则设置mapred.map.tasks 为一个较大的值,如果想减少 map 数,则设置mapred.min.split.size 为一个较大的值。
环境变陵册脊量原因。hadoop文件复制到其它节点尺渗时,需要对程序进行调试,ssh无法解析主机名,是因为在程序中的环境变量没有设置好,没有变量名,需要加入etcprofile语句。hadoop是一个由Apache基金会所开姿悔发的分布式系统基础架构。集群以外的机器如何访问Hadoop集群,并像集群中提交作业历裂和传送数据(1)首先,在机器上安装nutch或者hadoop
(2)配置两个文件
hadoop-site.xml:
<configuration>
<培烂腊property>
<name>fs.default.name</name>
<value>hdfs://gc04vm12:9000</value>
<description></description>
</property>
<property>
<name>mapred.job.tracker</name>
<value>gc04vm12:9001</value>
<description></description>
</property>
</configuration>
(3)这样便能执行命令,查看集群状态,向集群提交作业
(4)hdfs中的用户
使用root登陆而hadoop中没有创建root用户时,使用如下命令时,查看到的就不是nutch用户主目录 /user/root了
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 执行此命令时,即是列出/user/root(root用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory. 没有此配滑目录
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls /
Found 3 items
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:55 /usr这个是什么?
[root@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 主目录(/user/root)中创建x目录,提示以下信息
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="user":nutch:supergroup:rwxr-xr-x
这是因为root用户对/user/目录没有写权限(drwxr-xr-x - nutch supergroup 0 2010-05-21 00:53 /user)
hdfs中的nutch用户是启动hadoop集群的这个用户,当客户机中也存在nutch用户时,登陆后访问hdfs时,进入的是home目录(/user/nutch)。
hdfs中文件和目录的权限类似linux,可以修改其权限,改变其所属组
nutch用户格式化namenode,启动hadoop集群(会用到nutch用户的公钥信息,ssh配置)后,执行命令,
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -ls 执行此命令时,即是列出/user/nutch(nutch用户主目录)目录下的文件或目录
ls: Cannot access .: No such file or directory.
因为没有/user/nutch目录,所以不能访问,而此时若创建一个文件,如使用以下命令
[nutch@gc03vm12 nutch-1.0]# bin/hadoop dfs -mkdir x 则可以顺利执行,此时它将创建/user/nutch/x目录。
而使用root用户不行,是因为 root用户对/user/目录没有写权限。
那么如何创建一个root用户呢,可以这样做
超级用户nutch在hdfs中创建目录/user/root,即 bin/hadoop dfs -mkdir /user/root
更改/user/root目录所属用户和组, bin/hadoop dfs -chown -R root:root /user/root (若此处没有指定组,则默认root属于supergroup组, bin/hadoop dfs -chown -R root /user/root)
这样就相当于在hdfs中创建了用户root,组root;
用户权限和Linux类似,nutch是超级用户。
例如nutch在root的home目录下创建目录s,则s的权限如下,属于nutch,组是root
drwxr-xr-x - nutch root 0 2010-05-21 04:41 /user/root/s
root用户此时就不能写s目录了
[root@gc04vm14 nutch-1.0]# bin/hadoop dfs -mkdir s/x
mkdir: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="s":nutch:root:rwxr-xr-x
root用户属于root组,并且执行作业,会提示错误,如下
[root@gc03vm12 nutch-1.0]# bin/nutch crawl /user/nutch/urls -dir data2 -depth 5 -topN 8
提示如下错误
org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="tmp":nutch:supergroup:rwxr-xr-x
这是因为root用户对/tmp目录(hdfs目录)没有写权限,因为作业执行时,会在/tmp目录下生成相应的job文件,
/tmp的权限如下:
drwxr-xr-x - nutch supergroup 0 2010-05-21 00:42 /tmp
因此非超级用户提交作业时,用户问题是一个很麻烦的问题
注:
hadoop有些命令只能在namenode上执行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)