Oozie Hadoop 流媒体
Oozie Hadoop Streaming
我正在尝试编写一个简单的 map only hadoop streaming job 从 hdfs 读取数据并将其推送到 vertica。
我写了几个 shell 脚本如下
load.sh
hadoop jar hadoop-streaming-2.7.3.2.5.3.0-37.jar -input $INPUT_DIR -mapper /user/oozie/adhoc_data_load/scripts/export.sh -output $OUTPUT_DIR
export.sh
./vsql -c "copy $TABLE from stdin delimiter E'\t' direct null '\N';" -U $DBUSER -w $DBPWD -h $DBHOST -p $DBPORT
工作流程:
<action name="loadToVertica">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>loadVertica.sh</exec>
<argument>${STREAMING_JAR_PATH}</argument>
<argument>${nameNode}/user/oozie/optus_adhoc_data/${exportDataDate}</argument>
<argument>${TABLE_NAME_VERTICA}</argument>
<argument>${dbHost}</argument>
<argument>${dbName}</argument>
<argument>${dbPassword}</argument>
<argument>${dbPort}</argument>
<argument>${nameNode}/user/oozie/optus_adhoc_data/output/${exportDataDate}</argument>
<argument>vsql,export.sh</argument>
<file>${nameNode}/user/oozie/adhoc_data_load/scripts/loadVertica.sh#loadVertica.sh</file>
<file>${wfsBasePath}/libs/${STREAMING_JAR_PATH}#${STREAMING_JAR_PATH}</file>
<file>${wfsBasePath}/config/vsql#vsql</file>
<file>${wfsBasePath}/scripts/export.sh#export.sh</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="end"/>
</action>
运行 Oozie 用户出现以下异常:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=yarn, access=WRITE, inode="/user/yarn/.staging":hdfs:hdfs:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:319)
解决方案:
在工作流程中添加:
HADOOP_USER_NAME=${wf:user()}
Permission denied: user=yarn, access=WRITE, inode="/user/yarn/.staging":hdfs:hdfs:drwxr-xr-x
表示目录 /user/yarn/.staging
归用户 hdfs
所有。
该目录具有 rwxr-xr-x
权限,这意味着只有用户 hdfs
具有写入权限。
由于您的工作流程是使用用户 yarn
执行的,因此无法写入该目录。
您可以更改权限:
hdfs dfs -chmod -R 777 /user/yarn/
或者将其所有权授予 yarn
,如:
sudo -u hdfs hdfs dfs -chown yarn:yarn /user/yarn
可以通过在 Workflow.xml
中添加以下内容来解决此问题
HADOOP_USER_NAME=${wf:user()}
我正在尝试编写一个简单的 map only hadoop streaming job 从 hdfs 读取数据并将其推送到 vertica。
我写了几个 shell 脚本如下
load.sh
hadoop jar hadoop-streaming-2.7.3.2.5.3.0-37.jar -input $INPUT_DIR -mapper /user/oozie/adhoc_data_load/scripts/export.sh -output $OUTPUT_DIR
export.sh
./vsql -c "copy $TABLE from stdin delimiter E'\t' direct null '\N';" -U $DBUSER -w $DBPWD -h $DBHOST -p $DBPORT
工作流程:
<action name="loadToVertica">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>loadVertica.sh</exec>
<argument>${STREAMING_JAR_PATH}</argument>
<argument>${nameNode}/user/oozie/optus_adhoc_data/${exportDataDate}</argument>
<argument>${TABLE_NAME_VERTICA}</argument>
<argument>${dbHost}</argument>
<argument>${dbName}</argument>
<argument>${dbPassword}</argument>
<argument>${dbPort}</argument>
<argument>${nameNode}/user/oozie/optus_adhoc_data/output/${exportDataDate}</argument>
<argument>vsql,export.sh</argument>
<file>${nameNode}/user/oozie/adhoc_data_load/scripts/loadVertica.sh#loadVertica.sh</file>
<file>${wfsBasePath}/libs/${STREAMING_JAR_PATH}#${STREAMING_JAR_PATH}</file>
<file>${wfsBasePath}/config/vsql#vsql</file>
<file>${wfsBasePath}/scripts/export.sh#export.sh</file>
<capture-output/>
</shell>
<ok to="end"/>
<error to="end"/>
</action>
运行 Oozie 用户出现以下异常:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=yarn, access=WRITE, inode="/user/yarn/.staging":hdfs:hdfs:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:319)
解决方案:
在工作流程中添加:
HADOOP_USER_NAME=${wf:user()}
Permission denied: user=yarn, access=WRITE, inode="/user/yarn/.staging":hdfs:hdfs:drwxr-xr-x
表示目录 /user/yarn/.staging
归用户 hdfs
所有。
该目录具有 rwxr-xr-x
权限,这意味着只有用户 hdfs
具有写入权限。
由于您的工作流程是使用用户 yarn
执行的,因此无法写入该目录。
您可以更改权限:
hdfs dfs -chmod -R 777 /user/yarn/
或者将其所有权授予 yarn
,如:
sudo -u hdfs hdfs dfs -chown yarn:yarn /user/yarn
可以通过在 Workflow.xml
中添加以下内容来解决此问题HADOOP_USER_NAME=${wf:user()}