hadoop使用笔记

 最近用了一下hadoop,把一些咚咚记一下,免得以后忘了:
1. $HADOOP_HOME/bin/hadoop命令是个shell脚本
    如果想查看HDFS的文件内容,我们会运行$HADOOP_HOME/bin/hadoop fs -ls /,起初还以为$HADOOP_HOME/bin/hadoop是个二进制,还在迷惑这个二进制如何run一个java程序,后来发现,$HADOOP_HOME/bin/hadoop是个shell脚本,最终这个脚本执行了:
    exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"
    其中JAVA=$JAVA_HOME/bin/java
    JAVA_HEAP_MAX=-Xmx1000m,设置了jvm最大内存的使用量,这个参数影响的是hadoop客户端
    $HADOOP_OPTS用一堆 -Dproperty=value 设置了一些属性的值
    "$CLASSPATH"就是一对class的path
    $CLASS是main函数所在的类名字,比如:
        fs时,CLASS=org.apache.hadoop.fs.FsShell,
        jar时,CLASS=org.apache.hadoop.mapred.JobShell
    "$@"是传递给main函数的参数,"$1"已经被shift过了,"$@"是从"$2"开始的
2. HADOOP_CLASSPATH
    在run一个hadoop任务的前,通常要设置一下环境变量HADOOP_CLASSPATH,这个环境变量在运行$HADOOP_HOME/bin/hadoop时,会被添加到 CLASSPATH=${CLASSPATH}:${HADOOP_CLASSPATH},也就是说这个环境变量只会影响CLASSPATH而已.进一步,只有hadoop客户端程序需要的CLASSPATH才需要在HADOOP_CLASSPATH中声明,计算节点需要的jar包不需要添加到HADOOP_CLASSPATH中
3. JobConf.set("tmpjars",*.jar)和JobConf.setjar(ajar.jar)
    前者设置多个jar包,这些jar包会被上传到各计算节点,被计算节点所用,比如自定义的mapper和reducer所在的jar包就需要添加到"tmpjars";而后者只能设置一个jar包文件。再次,istributedCache.addArchiveToClassPath()也可将jar包上传到所有的nodes,并加入classpath。
4. "$bin"/hadoop-config.sh和${HADOOP_CONF_DIR}/hadoop-env.sh
    $HADOOP_HOME/bin/hadoop执行时会调用这两个脚本,因此用户可以在${HADOOP_CONF_DIR}/hadoop-env.sh中初始化环境变量
5. DistributedCache
    DistributedCache.addCacheFile()将HDFS上的文件在每个计算节点存一份,存储路径为mapred.local.dir。如果某个节点要读取这个文件,则可以直接从本地文件系统读取,java.io.FileInputStream。 getLocalCacheFiles()会列出本地被cache的文件列表,如果在调试任务时,jobtracker被设置为local,则getLocalCacheFiles()会返回空,需要注意。
6. 集群配置:
    namenode&jobtracker:谁运行bin/start-all.sh,谁就是namenode&jobtracker
    SecondaryNameNode:在conf/masters中配置
    TaskTracker and DataNode:在conf/slaves中配置
7. 关于硬件
    内存:java程序每个core大约消耗1-2G的内存,如果是stream使用python等大内存占用量的语言写的,则内存需要调整的更大
    cpu:cpu在hadoop中并不是很重要的瓶颈
    硬盘:硬盘的读写速度是非常重要的因素。因为hadoop中大多数中间数据都是序列化到硬盘的,这样的设计也是为了处理大规模数据考虑的,总之hadoop框架会尽量减少内存的使用,将内存留给mapper和reducer中用户的处理程序,硬盘非常重要。
    网络带宽:各node需要共享数据,因此网络带宽也是非常重要的,对于小规模的集群,机器位置不要过于零散

你可能感兴趣的:(hadoop,职场,休闲)