hadoop核心组件

  • HDFS
    1. 将文件切分成指定大小的数据块, 并在多台机器上保存多个副本
    2. 扩展性、容错性、海量数量存储
  • YARN
    1. 负责整个集群资源的管理和调度
    2. 扩展性、容错性、多框架资源统一调度
  • MapReduce
    1. 分布式计算框架
    2. 扩展性、容错性、海量数据离线处理

HDFS

架构

  • NameNode
    1. 客户端请求的响应
    2. 元数据的管理
  • DataNode
    1. 存储用户的文件对应的数据块(Block)
    2. 要定期向NameNode发送心跳信息,汇报本身及其所有的block信息,健康状况
  • SecondaryNameNode

大数据-hadoop

环境搭建

# 1. 卸载自带的java
# 查看已安装java
rpm -qa | grep java
#  删除openjdk
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.i686

# 2. 安装jdk
# 解压
tar -zxvf jdk-8u79-linux-x64.tar.gz -C ~/app
# 配置环境变量 ~/.bash_profile
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_79
export PATH= \$ JAVA_HOME/bin: $PATH
# 环境变量生效
source ~/.bash_profile
# 验证安装成功
java -v

# 3. 安装ssh免密登录
yum install ssh
ssh-****** -t rsa
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

# 4. 下载并解压hadoop
tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C ~/app

# 5. 配置hadoop配置文件并创建依赖文件夹

# 6. 配置环境变量

# 7. 格式化hadoop
hadoop namenode -format 

# 8. 启动hdfs
sbin/start-dfs.sh

# 9. 验证开启是否成功
jps
	NameNode
	DataNode
	SecondaryNameNode
登录ip:50070

# 10. 停止hdfs
sbin/stop-dfs.sh

配置文件

hadoop-env.sh
    export JAVA_HOME=/home/hadoop/app/jdk1.8.0_79
core-site.xml
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node-teach:8020</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/root/bigdata/tmp</value>	# 初始化文件存放目录
    </property>
hdfs-site.xml
    <property>	
        <name>dfs.replication</name>
        <value>1</value>	# 副本数量
    </property>

slaves

shell

ls

  • hadoop fs -ls 路径
  • 文件:文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID
  • 文件夹:目录名 修改日期 修改时间 权限 用户ID 组ID

text

  • hadoop fs -text 文件
  • 将源文件输出为文本格式

mv

  • hadoop fs -mv URI [URI …]
  • 将文件从源路径移动到目标路径
  • 允许有多个源路径,此时目标路径必须是一个目录
  • 不允许在不同的文件系统间移动文件
  • hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
  • hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1

put

  • hadoop fs -put 文件
  • 从本地文件系统中复制单个或多个源路径到目标文件系统
  • hadoop fs -put localfile /user/hadoop/hadoopfile
  • hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile

rm

  • hadoop fs -rm URI [URI …]
  • 删除指定的文件
  • hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir

python API

环境搭建

# 安装依赖库
yum install openssl
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

# 1. 安装python3
# 解压
tar -zxvf Python-3.6.0.tgz
# 进入目录
cd Python-3.6.0
# 编译安装
./configure --prefix=/usr/local/python3
make && make install
# 添加环境变量
# 检查安装是否成功

# 2. 安装hdfs
pip3 install hdfs

API

连接HDFS

from hdfs.client import Client
client = Client("http://localhost:50070")  	# 50070: NameNode web管理端口

# classhdfs.client.Client(url, root=None, proxy=None, timeout=None, session=None)
# url:ip:端口
# proxy:制定登陆的用户身份
# timeout:设置的超时时间
# seesion:请求的session实例,用于处理所有的请求

status

  • 获取路径的具体信息
  • status(hdfs_path, strict=True)
  • hdfs_path:就是hdfs路径
  • strict:设置为True时,如果hdfs_path路径不存在就会抛出异常,如果设置为False,如果路径为不存在,则返回None

list

  • 获取指定路径的子目录信息
  • list(hdfs_path, status=False)
  • status:为True时,也返回子目录的状态信息,默认为Flase

makedirs

  • client.makedirs("/test")
  • makedirs(hdfs_path, permission=None)
  • permission:设置权限
  • client.makedirs("/test",permission=777)

rename

  • 重命名
  • rename(hdfs_path, local_path)

delete

  • 删除
  • delete(hdfs_path, recursive=False)
  • recursive:删除文件和其子目录,设置为False如果不存在,则会抛出异常,默认为False

upload

  • 上传数据
  • client.upload("/test","/opt/bigdata/hadoop/NOTICE.txt")
  • upload(hdfs_path, local_path, overwrite=False, n_threads=1, temp_dir=None, chunk_size=65536,progress=None, cleanup=True, **kwargs)
  • overwrite:是否是覆盖性上传文件
  • n_threads:启动的线程数目
  • temp_dir:当overwrite=true时,远程文件一旦存在,则会在上传完之后进行交换
  • chunk_size:文件上传的大小区间
  • progress:回调函数来跟踪进度,为每一chunk_size字节。它将传递两个参数,文件上传的路径和传输的字节数。一旦完成,-1将作为第二个参数
  • cleanup:如果在上传任何文件时发生错误,则删除该文件

download

  • 下载
  • download(hdfs_path, local_path, overwrite=False, n_threads=1, temp_dir=None, **kwargs)

read

  • 读取文件
  • with client.read("/test/a.txt") as reader:print reader.read()
  • read(args, *kwds)
  • hdfs_path:hdfs路径
  • offset:设置开始的字节位置
  • length:读取的长度(字节为单位)
  • buffer_size:用于传输数据的字节的缓冲区的大小。默认值设置在HDFS配置。
  • encoding:制定编码
  • chunk_size:如果设置为正数,上下文管理器将返回一个发生器产生的每一chunk_size字节而不是一个类似文件的对象
  • delimiter:如果设置,上下文管理器将返回一个发生器产生每次遇到分隔符。此参数要求指定的编码。
  • progress:回调函数来跟踪进度,为每一chunk_size字节(不可用,如果块大小不是指定)。它将传递两个参数,文件上传的路径和传输的字节数。称为一次与- 1作为第二个参数。

write

  • client.write(filepath, data=data_str, encoding=‘utf-8’)

常见错误

问题:操作文件错误
hdfs.util.HdfsError: Permission denied: user=dr.who, access=WRITE, inode="/test":root:supergroup:drwxr-xr-x

解决:在配置文件hdfs-site.xml中加入
<property> 
    <name>dfs.permissions</name> 
    <value>false</value> 
</property>
问题:hdfs.util.HdfsError: Cannot create directory xxx. Name node is in safe mode

解决:关闭安全模式
hadoop dfsadmin -safemode leave
问题:服务自死

解决:可能是主机名不正确
/etc/sysconfig/network

相关文章: